CSS之旅——第二站 如何更深入的理解各种选择器

 上篇我们说了为什么要使用css,这篇我们就从选择器说起,大家都知道浏览器会把远端过来的html解析成dom模型,有了dom模型,html就变成

了xml格式,否则的话就是一堆“杂乱无章”的string,这样的话没人知道是什么鸟东西,js也无法什么各种getElementById,所以当浏览器解析成dom

结构后,浏览器才会很方便的根据css各种规则的选择器在dom结构中找到相应的位置,那下一个问题自然就严重了,那就是必须深入的理解dom模型。

一:理解Dom模型

首先我们看下面的代码。

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <title></title>
</head>
<body>
 <p>有名的公司一栏</p>
 <hr />
 <ul>
 <li>百度</li>
 <li>新浪</li>
 <li>阿里</li>
 </ul>
</body>
</html>

用这个代码我们很容易的画出dom树。


当你看到这个dom树的时候,是不是顿时感到信息量特别大,很简单,因为是树,所以就具有了一些树的特性,比如 “孩子节点”,“父亲节点”,

“兄弟节点”,“第一个左孩子”,“最后一个左孩子”等等,对应着后续我要说的各种情况,一起来看看html被脱了个精光的感觉是不是很爽~~~~

1:孩子节点

   找孩子节点,本质上来说分两种,真的只找“孩子节点”,“找到所有孩子(包括子孙)“

<1> 后代选择器

首先看下面的html,我想你可以轻而易举的绘制出dom树了,那下面的问题就是怎么将body中所有的后代span都绘上red。

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <title></title>
 <style type="text/css">
 body span {
 color: red;
 }
 </style>
</head>
<body>
 <span>我是span1</span>
 <ul>
 <li>
 <ul><span>我是span2</span></ul>
 </li>
 </ul>
</body>
</html>


2. 孩子选择器

<1> ">"玩法

  这个也是我说的第二种情况,真的只找孩子节点,在css中也很简单,用 > 号就可以了,是不是很有意思,跟jquery一样的玩法,对不对。

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <title></title>
 <style type="text/css">
 body > span {
 color: red;
 }
 </style>
</head>
<body>
 <span>我是span1</span>
 <ul>
 <li>
 <ul><span>我是span2</span></ul>
 </li>
 </ul>
</body>
</html>


<2> ”伪选择器”玩法

除了上面这种玩法,在css3中还可以使用”伪选择器"玩法,真tmd的强大,下一篇会专门来讲解,这里只介绍一个:nth-child用法,如果

你玩过jquery,一切都不是问题。

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <title></title>
 <style type="text/css">
 body > span:nth-child(1) {
 color: red;
 }
 </style>
</head>
<body>
 <span>我是span1</span>
 <span>我是span2</span>
 <ul>
 <li>
 <ul><span>我是span3</span></ul>
 </li>
 </ul>
</body>
</html>


3. 兄弟节点

兄弟节点也是很好理解的,在css中用 “+”就可以解决了,可以看到下面我成功将第二个p绘制成了红色。

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <title></title>
 <style type="text/css">
 .test + p {
 color:red;
 }
 </style>
</head>
<body>
 <p class="test">我是第一个段落</p>
 <p>我是第二个段落</p>

</body>
</html>


4. 属性选择器

  如果玩过jquery,这个属性选择器我想非常清楚,首先看个例子,我想找到name=test的p元素,将其标红。

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <title></title>
 <style type="text/css">
 p[name='test'] {
 color: red;
 }
 </style>
 <script src="Scripts/jquery-1.10.2.js"></script>
</head>
<body>
 <p name="test">我是第一个段落</p>
 <p>我是第二个段落</p>
</body>
</html>


到现在为止,有没有感觉到和jquery的玩法一模一样,而且感觉越来越强烈,已经到了 ”你懂的“ 的境界。

二:css内部机制的猜测

文章开头也说了,浏览器会根据css中定义的”标签”,然后将这个标签的样式应用到dom中指定的”标签“上,就比如说,我在css中定义了一个

p样式,但浏览器怎么就能找到dom中的所有的p元素呢??? 因为闭源的原因,我们无法得知其内部机制,不过在jquery上面,或者我们可以窥知一

二,因为css能展示的选择器用法,在jquery中都能做得到,然后我就很迫不及待的去看看jquery如何提取我的各种选择器写法,下面我们看看源码。

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <title></title>

 <style type="text/css">
 p[name='test'] {
 color: red;
 }
 </style>

 <script src="Scripts/jquery-1.10.2.js"></script>
 <script type="text/javascript">

 $(document).ready(function () {

 $("p[name='test']").hide();
 });
 </script>
</head>
<body>
 <p name="test">我是第一个段落</p>
 <p>我是第二个段落</p>
</body>
</html>


在jquery里面经过一番查找,最后可以看到仅仅是调用了queryselectorAll这个dom的原生方法,你也可以在console中清楚的看到,最后的

results就是找到的p元素,为了验证,我在taobao page下开一个console。



到现在,我大概粗略的猜测,也许至少在chrome浏览器下,浏览器为了找到dom中指定的元素,或许也是调用了queryselectAll方法。。。

好了,大概也就说这么多了,理解dom模型是关键,这样的话才能理解后续浏览器的渲染行为。

时间: 2024-10-31 21:56:52

CSS之旅——第二站 如何更深入的理解各种选择器的相关文章

Sql Server之旅——第二站 理解万恶的表扫描

原文:Sql Server之旅--第二站 理解万恶的表扫描 很久以前我们在写sql的时候,最怕的一件事情就是sql莫名奇妙的超级慢,慢的是撸一管子回来,那个小球还在一直转...这个着急也只有当事人才 明白,后来听说有个什么"评估执行计划",后来的后来才明白应该避免表扫描... 一:表扫描 1.现象 "表扫描"听起来很简单,不就是一行一行的扫嘛,你要说"执行计划"的话,我也会玩,为了更可观,我build一个表,再插入三行数据,如下图:   上面的P

Javascript之旅——第二站:对象和数组

原文:Javascript之旅--第二站:对象和数组   一觉睡到中午,本来准备起来洗洗继续睡,不过想想没辙,还得继续这个系列,走过变量的第一站,第二站我们再来看看对象和数组.   一:对象   说起对象,我们不自然就想起了面向对象中自封装的一个类,同样JS中也是遵循这个守则,在web编程中几乎天天用到的就是JSON.是的, 这就是一个对象,不过这个对象下面的字段都是字符串和值类型,如下图. 1 var delivery = { 2 no: 1, 3 sendtime: "2014-11-25&

《站长》俱乐部18城市互动之旅第二站郑州站即将启航

中介交易 SEO诊断 淘宝客 云主机 技术大厅 最新消息,<站长>俱乐部举办的"2009全国18城市互动之旅"活动第二站郑州站即将启航,6月29日上午活动将在美丽的绿城郑州华龙宾馆举行.康盛创想副总裁李明顺.百度联盟发展部产品运营经理徐嘉.世纪互联副总裁许广彬等将出席康盛创想"将增长进行到底"社区运营培训相关活动. 作为<站长>俱乐部为全国会员提供的本年度重点服务项目之一,"2009全国18城市互动之旅"活动郑州站旨在为郑

CSS之旅——第一站 为什么要用CSS

不知道有多少码农和我一样,css一直是一个软肋,软到全身酥麻...既然软肋来了,只能是要想办法解决,所以就找本CSS权威指南看一看,都说 CSS权威指南这本书比较过时,但是内容还是比较充实的,而且内容基本上就是和你交谈一样,非常舒服,好了,下面从正文说起.   一:为啥要学习CSS 当你知道CSS的历史还是蛮有味道的,在很久很久以前,web上没有css,只有一些html的标签,比如p,h1...h5... div span,ul 等等,这些html标记 都是一个具有特定含义的html标签,过去人

asp.net mvc 之旅—— 第二站 窥探Controller下的各种Result

平时我们在Action中编码的时候,我们都知道所有的Action返回值类型都是ActionResult,并且我们的返回值也是各种奇葩,比如:Json(),Content(), View()等等...当你写这个代码的时候,你是不是有一种强烈的偷窥欲...那这篇我们就一起来看一看. 一:实例代码 public class HomeController : Controller { public ActionResult Index() { ViewBag.Message = "Modify this

C#发现之旅第二讲 C#-XSLT开发

为了让大家更深入的了解和使用C#,我们开始这一系列的主题为"C#发现之旅 "的技术讲座.考虑到各位大多是进行WEB数据库开发的,而所谓发现就是发现我们所 不熟悉的领域,因此本系列讲座内容将是C#在WEB数据库开发以外的应用.目前规划的主要内 容是图形开发和XML开发,并计划编排了多个课程.在未来的C#发现之旅中,我们按照由浅入 深,循序渐进的步骤,一起探索和发现C#的其他未知的领域,更深入的理解和掌握使用C#进 行软件开发,拓宽我们的视野,增强我们的软件开发综合能力. 本课程说明 本课

做站是我人生的第二站

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断淘宝客 站长团购 云主机 技术大厅 又是一个夜晚!似乎已经习惯了这样的生活,不知道从什么时候开始!~~ 我没想到自己会走到今天这样的一条"不归路", 高中时的堕落,连续复读两年的高三,经历了3次高考,那段时间自己到底在干什么想什么,至今我自己竟然仍然不知道~ 去了杭州的国美培训美术,到后来的福州培训美术,不如说是到网吧堕落. 那时候的我只玩游戏(那时

远走杭州,阿里云离家第二站为何选中澳门

前几日,澳门特别行政区政府与阿里巴巴签署<构建智慧城市战略合作框架协议>. 协议中提出,"将应用阿里巴巴云计算和人工智能技术,在交通管理.旅游.医疗服务.城市综合管理.人才培训等方面展开合作,为澳门构建城市治理的人工智能中枢,助力澳门发展成一个"以数字引领科技,智能服务民生"的智慧城市." 让人意外的是,本次协议的签署除了阿里云总裁胡晓明外,马云也出现在了仪式上,与澳门行政长官崔世安一起见证该合作的生效.要知道,退出阿里巴巴日常管理之后,马云参加公开活动

Sql Server之旅——第一站 那些给我们带来福利的系统视图

原文:Sql Server之旅--第一站 那些给我们带来福利的系统视图 本来想这个系列写点什么好呢,后来想想大家作为程序员,用的最多的莫过于数据库了,但是事实上很多像我这样工作在一线的码农,对sql 都一知半解,别谈优化和对数据库底层的认识了,我也是这样...   一:那些系统视图 1. 系统视图是干什么呢? 从名字上看就知道,系统视图嘛?猜的不错的话,就是存放一些sqlserver系统的一些信息,很好,恭喜你,答对了.   2. 都定义在哪呢?  为了让你眼见为实,下面截图看看,从截图中你可以