了解CSS的查找匹配原理,让CSS更简洁、高效
发布时间:2010-06-08 13:36:00
用了这么多年的CSS,现在才明白CSS的真正匹配原理,不知道你是否也跟我一样?看1个简单的CSS:
DIV#divBox p span.red{color:red;},按习惯我们对这个CSS 的理解是,浏览器先查找id为divBox的DIV元素,当找到后,再找其下的所有p元素,然后再查找所有span元素,当发现有span的class为red的时候,就应用该style。多么简单易懂的原理,可是这个理解却是完完全全相反、错误的。
匹配原理:
浏览器CSS匹配不是从左到右进行查找,而是从右到左进行查找。比如之前说的 DIV#divBox p span.red{color:red;},浏览器的查找顺序如下:
先查找html中所有class='red'的span元素,找到后,再查找其父辈元素中是否有p元素,再判断p的父元素中是否有id为divBox的div元素,如果都存在则匹配上。
浏览器从右到左进行查找的好处是为了尽早过滤掉一些无关的样式规则和元素。比如如下html和css:
<style>
DIV#divBox p span.red{color:red;}
<style>
<body>
<div id="divBox">
<p><span>s1</span></p>
<p><span>s2</span></p>
<p><span>s3</span></p>
<p><span class='red'>s4</span></p>
</div>
</body>
如果按从左到右查找,哪会先查找到很多不相关的p和span元素。而如果按从左到右的方式进行查找,则首先就查找到<span class='red'>的元素。firefox称这种查找方式为key selector(关键字查询),所谓的关键字就是样式规则中最后(最右边)的规则,上面的key就是span.red。
简洁、高效的CSS:
所谓高效的CSS就是让浏览器在查找style匹配的元素的时候尽量进行少的查找,下面列出一些我们常见的写CSS犯一些低效错误(也是我以前常常犯的错误,还老以为这样写才是高效的):
1、不要在ID选择器前使用标签名
一般写法:DIV#divBox
更好写法:#divBox
解释: 因为ID选择器是唯一的,加上div反而增加不必要的匹配。
2、不要再class选择器前使用标签名
一般写法:span.red
更好写法:.red
解释: 同第一条,但如果你定义了多个.red,而且在不同的元素下是样式不一样,则不能去掉,比如你css文件中定义如下:
p.red{color:red;}
span.red{color:#ff00ff}
如果是这样定义的就不要去掉,去掉后就会混淆,不过建议最好不要这样写
3、尽量少使用层级关系
一般写法:#divBox p .red{color:red;}
更好写法:.red{..}
4、使用class代替层级关系
一般写法:#divBox ul li a{display:block;}
更好写法:.block{display:block;}
猜你喜欢
- 下面是Sql Server 和 Access 操作数据库结构的常用Sql,如如何新建一个表,如何删除表,如何删除数据,插入数据等等..希望对
- 下面我们来看下,如何利用它来删除一个表中重复记录: If Exists(Select * From tempdb.Information_S
- ORM模型:ORM模型对于后端开发来说肯定是不陌生的,包括很多后端框架比如django,现在都自带这个模型了ORM(Object Relat
- python使用folium 库生成地图网页的具体代码,供大家参考,具体内容如下folium 官网import foliumimport p
- 加载相关库import randomimport seaborn as snsimport matplotlib.pyplot as plt
- 在上一个文章里写了关于左(右)侧定宽右(左)侧自动缩放的两列浮动,这个文章就要说一下三列浮动的问题了。在之前说过,两列浮动是其他多列浮动的基
- 朋友的网站要计算机票的折扣价格,并且在最后的折扣价格上应对个位进行四舍五入,同时在ASP和Javasc
- 使用pip安装python库的几种方式1、使用pip在线安装1.1 安装单个package格式如下:pip install SomePack
- 这篇文章主要介绍了python自动化unittest yaml使用过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参
- 看代码吧~import numpy as np a = np.array([[1,1,1],[2,2,2],[3,3,3], [4,4,4]
- query方法在 pandas 中,支持把字符串形式的查询表达式传入 query 方法来查询数据,其表达式的执行结果必须返回布尔列表。在进行
- 本文介绍MySQL与Redis缓存的同步的两种方案方案1:通过MySQL自动同步刷新Redis,MySQL触发器+UDF函数实现方案2:解析
- 使用python基于cartopy库绘制台风路径使用python 绘制西太平洋进入我国的台风路径,文件为.dat格式,内容如下所示:代码如下
- MySQLTuner 下载地址:http://github.com/rackerhacker/MySQLTuner-perlMySQLTun
- 今天在pycharm中手贱,点击了项目exclude,直接懵逼,项目东西找不到了,奶奶的如图一番操作后如图所示,捣鼓了很久,恢复方法点击se
- 前言本文主要给大家介绍的是关于在Python3使用PyMongo的方法,分享出来供大家参考学习,下面话不多说了,来一起看看详细介绍:Mong
- 引言最常见的闭包 (Closure) 范式大家都很熟悉了:(function() {// ...})(); 很
- 数据库设计范式目前数据库设计有五种范式 , 一般我们数据库只需要满足前三项即可第一范式 : 确保每列保持原子性什么是原子性? 意思就是不可再
- 本文实例为大家分享了python提取英语pdf内容并翻译的具体代码,供大家参考,具体内容如下前期准备工作:翻译接口: 调用的是百度翻译的ap
- 生产图片区域,上传按钮#btn可替换自己想要的图片<ul id="ul_pics" class="ul_