### 如何编写高效的 CSS 选择符
2017-04-24
大部分人看到下面的这一小段 CSS 代码:
```
#menus > li { font-size: 14px; }
```
可能都会猜想浏览器会使从左到右匹配上面的规则,我们会想象浏览器先找到唯一的 id 为 menus 的元素,然后把样式应用到其直系子元素 li 元素上。这看起来好像还挺高效的。
但是,事实上,CSS 选择符是从右到左进行匹配的。所以,上面的这条规则并不高效,浏览器必需遍历页面上的每个 li 元素并确定其父元素的 id 是否为 menus。
样式系统从最右边的选择符开始向左匹配规则。只有当前选择符的左边还有其他的选择符,样式系统就会继续向左移动,直到找到和规则匹配的元素,或者因为不匹配而退出。 —- 《在 Mozilla UI 中编写高效的 CSS》 David Hyatt
以下是 David Hyatt 在书中提出的编写高效选择符指南:
一、避免使用通配规则
除了传统意义上的通配选择符之外,我们把相邻兄弟选择符、子选择符、后代选择符合属性选择符都归纳到通配规则分类下,推荐仅使用 ID、类和标签选择符。
二、不要限定 ID 选择符
在页面中一个指定的ID只能对应一个元素,所以没有必要添加额外的限定符。例如,div#header是没有必要的,应该简化为#header。
三、不要限定类选择符
不要用具体的标签限定类选择符,而是根据实际情况对类名进行扩展。例如,把li.chapter改成.li-chapter,或是.list-chapter更好。
四、让规则越具体越好
不要试图编写像 ol li a 这样的长选择符,最好是创建一个像.list-anchor一样的类,并把它添加到适当的元素上。
五、避免使用后代选择符
通常处理后代选择符的开销时最高的,而使用子选择符也可以得到想要的结果,并且更加高效。
六、避免使用标签—子选择符
如果有像#menus > li > a这样的基于标签的子选择符,那么应该使用一个类来关联每个标签元素,例如.menus-item。
七、质疑子选择符的所有用途
检查所有使用子选择符的地方,然后尽可能用具体的类取代它们。
八、依靠继承
了解哪些属性可以通过继承而来,然后避免对这些属性重复指定规则。例如,对列表元素而不是每个列表元素指定list-style-image。请参考继承属性的列表来了解每个元素的可继承的属性。
摘自《高性能网站建设进阶指南——Web开发者性能优化最佳实践》
来源: http://hejx.space/2017/04/24/高效CSS选择器/
* * * * *
### 其他
[是什么阻碍了代码的重用?问题是否应该只解决一次即可? - 知乎](https://www.zhihu.com/question/21011591)
>[danger] **重用是有代价的,不要为了重用而重用,忘记我们的来处,我们是要解决问题的。** 没有人规定一个代码写出来必须要是重用的,不要觉得为了一个效果写出来的代码,只是一个地方用到了而已,没有被重用就很可惜,就很浪费,这种观点是错误的。不要被自己所束缚。
几乎每个人都会认为自己写的东西很棒,是最好的,其实并不是这样的,写出好的代码不是件容易的事情。我们最大的敌人是我们自己。
[我们要写真正的CSS!](http://mp.weixin.qq.com/s/a2aA7uOlEb6hhLTw7xu4eQ)
[精通 CSS 选择器 - by.Genesis - 博客园](http://www.cnblogs.com/xyzhanjiang/p/5447406.html)
[精通 CSS 选择器(二) - by.Genesis - 博客园](https://www.cnblogs.com/xyzhanjiang/p/5570726.html)
[不可不看!CSS3中三十一种选择器用法 - Ranran - 博客园](https://www.cnblogs.com/ranran/p/31_css3_selector.html)
[神奇的选择器 :focus-within](https://mp.weixin.qq.com/s/q-OaYqJfm08803-E5PJOhA)
> 伪类和伪元素的区别
[Facebook 重构:抛弃 Sass / Less ,迎接原子化 CSS 时代](https://juejin.cn/post/6917073600474415117)
* * * * *
last update:2018-5-17 16:54:54
- 开始
- 微信小程序
- 获取用户信息
- 记录
- HTML
- HTML5
- 文档根节点
- 你真的了解script标签吗?
- 文档结构
- 已经落后的技术
- form表单
- html实体
- CSS
- css优先级 & 设计模式
- 如何编写高效的 CSS 选择符
- 笔记
- 小计
- flex布局
- 细节体验
- Flex
- Grid
- tailwindcss
- JavaScript
- javascript物语
- js函数定义
- js中的数组对象
- js的json解析
- js中数组的操作
- js事件冒泡
- js中的判断
- js语句声明会提前
- cookie操作
- 关于javascript你要知道的
- 关于innerHTML的试验
- js引擎与GUI引擎是互斥的
- 如何安全的修改对象
- 当渲染引擎遇上强迫症
- 不要使用连相等
- 修改数组-对象
- 算法-函数
- 事件探析
- 事件循环
- js事件循环中的上下文和作用域的经典问题
- Promise
- 最佳实践
- 页面遮罩加载效果
- 网站静态文件之思考
- 图片加载问题
- 路由及转场解决方案
- web app
- 写一个页面路由转场的管理工具
- 谈编程
- 技术/思想的斗争
- 前端技术选型分析
- 我想放点html模板代码
- 开发自适应网页
- 后台前端项目的开发
- 网站PC版和移动版的模板方案
- 前后端分离
- 淘宝前后端分离
- 前后端分离的思考与实践(一)
- 前后端分离的思考与实践(二)
- 前后端分离的思考与实践(三)
- 前后端分离的思考与实践(四)
- 前后端分离的思考与实践(五)
- 前后端分离的思考与实践(六)
- 动画
- 开发小技巧
- Axios
- 屏幕适配
- 理论基础
- 思考
- flexible.js原理
- 实验
- rem的坑,为什么要设置成百分比,为什么又是62.5%
- 为什么以一个标准适配的,其它宽度也能同等适配
- 自适应、响应式、弹性布局、屏幕适配
- 适配:都用百分比?
- 番外篇
- 给你看看0.5px长什么样?
- 用事实证明viewport scale缩放不会改变rem元素的大小
- 为什么PC端页面缩放不会影响rem元素
- 究竟以哪个为设备独立像素
- PC到移动端初试
- 深入理解px
- 响应式之栅格系统
- 深入理解px(二)
- 一篇搞定移动端适配
- flex版栅格布局
- 其他
- 浏览器加载初探
- 警惕你的开发工具
- JS模块化
- webpack
- 打包原理
- 异步加载
- gulp
- 命名规范
- 接口开发
- sea.js学习
- require.js学习
- react学习
- react笔记
- vue学习
- vue3
- 工具、技巧
- 临时笔记
- 怎么维护好开源项目
- 待办
- 对前端MVV*C框架的思考
- jquery问题
- 临时
- 好文
- 节流防抖