书写高效CSS

前言:MDN上有写关于如何高效的css的文章,此文主要参考其做了记录(也可以理解为是翻译)。
css规范并不会强行规定浏览器必须如何实现样式系统,只会规定浏览器必须实现什么。因此,不同的样式系统引擎拥有不同的性能,开源的 Gecko和Webkit算法类似,因此优缺点也类似。因此,下面的建议在大部分的web浏览器上应该是有意义的。
第一部分简单介绍样式系统规则分类;后面的章节主要指导如何利用样式系统的实现原理,来书写更有效率的规则。

样式系统如何建立规则

样式系统的规则分为四大类

  1. ID
  2. class
  3. tag
  4. 通用规则

理解这四类规则非常关键,这是规则匹配的基础。
在接下来的段落中,我会使用"关键选择“(key selector)术语。key selector是选择器的最后一部分。
例如,在下面的规则中:

 a img, div > p, h1 + title  {...}

key selector是img,p和title。

ID rules

第一类是使用ID选择器作为key selector.

button#backButton {…} /* This is an ID-categorized rule */
#urlBar[type="autocomplete"] {…} /* This is an ID-categorized rule */
treeitem > treerow > treecell#myCell:active {…} /* This is an ID-categorized rule */

Class rules

第二类是使用了class选择器作为key selector

button.toolbarButton {…}  /* A class-based rule */
.fancyText {…}  /* A class-based rule */
menuitem > .menu-left[checked="true"] {…}  /* A class-based rule */

Tag rules

如果既不是class也不是ID作为key selector,下一个候选是tag。

td {…}  /* A tag-based rule */
treeitem > treerow {…}  /* A tag-based rule */
input[type="checkbox"] {…}  /* A tag-based rule */

Universal rules

剩下的均为此类。

[hidden="true"] {…} /* A universal rule */ 
* {…} /* A universal rule */
tree > [collapsed="true"] {…} /* A universal rule */

样式系统如何匹配规则

样式系统从key selector开始匹配,然后向左继续,寻找选择器的任意祖先。只要选择器的子树继续导出(这样翻译感觉怪怪的),样式系统会继续往左移动,直到要么匹配规则,要么因为不匹配终止。

最基本的概念是了解规则过滤。这些类别存在的目的是过滤掉不相关的规则,这样样式系统不用浪费时间去匹配它们。

这是提升性能的关键:检查一个指定的元素,规则越少,系统解析就越快。

例如,如果元素指定了ID,那么只有与元素ID相同的ID rule会进行检查。只有存在于元素class列表的class 规则才会进行检查。只有与标签相同的tag rule会被进行检查。通用规则总是会被检查。

高效css建议

避免使用通用规则

避免一个规则的结束是通用规则这一类。

不要使用tag或者class修饰ID rule

如果一个规则使用了ID选择器作为key selector,不要再添加tag标签指定。因为ID是唯一的,增加tag name会增加不必要的额外的匹配工作。
BAD
button#backButton {…}

BAD
.menu-left#newMenuIcon {…}

GOOD
#backButton {…}

GOOD
#newMenuIcon {…}

例外:当需要通过改变元素的class来应用不同的样式,但是同样的class将会被其他元素共享。

不要使用tag修饰class规则

尽管class可以在同一个页面重复出现,但是它的唯一性比tag更强。
你可以约定在class名称中包含tag名称,但是这会损失一些灵活性。当设计改变tag时,class也会跟着变化。最好的是使用语义名称的class name。
BAD
treecell.indented {…}

GOOD
.treecell-indented {…}

BEST
.hierarchy-deep {…}

使用最特定的一类规则

tag这类会匹配太多的规则,这会大大的降低效率。通过给元素增加class,我们可以回class分类进行细分,减少匹配时间。
BAD
treeitem[mailfolder="true"] > treerow > treecell {…}

GOOD
.treecell-mailfolder {…}

避免使用后代选择器

后代选择器是css中最耗时的选择器。尤其当选择器是tag或者通用这一类。
BAD
treehead treerow treecell {…}

BETTER, BUT STILL BAD (see next guideline)
treehead > treerow > treecell {…}

tag分类规则永远不要包含孩子选择器

避免使用孩子选择器在tag分类规则中。这会显著增长匹配时间。
BAD
treehead > treerow > treecell {…}

GOOD
.treecell-header {…}

质疑所有使用孩子选择器的地方

使用孩子选择器时务必谨慎,尽可能避免使用。
特别是,子选择器频繁适用于RDF树(这个自行Google吧)和menus,如下:
BAD
treeitem[IsImapServer="true"] > treerow > .tree-folderpane-icon {…}

依靠继承

了解哪些属性继承,然后使用继承。
BAD
#bookmarkMenuItem > .menu-left { list-style-image: url(blah) }

GOOD
#bookmarkMenuItem { list-style-image: url(blah) }

Use -moz-image-region

这条个人感觉不靠谱

Use scoped stylesheets

这条个人感觉不好维护

除非必要,不要使用特定浏览器特性

这条个人感觉意义不大

推荐阅读:

MDN Writing efficient CSS
Performance improvement by writing efficient CSS selector

实用工具

CSS Test Creator

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,644评论 18 139
  • 简介浏览器可以被认为是使用最广泛的软件,本文将介绍浏览器的工 作原理,我们将看到,从你在地址栏输入google.c...
    听风阁阅读 3,279评论 0 7
  • 转载说明 一、介绍 浏览器可以被认为是使用最广泛的软件,本文将介绍浏览器的工作原理,我们将看到,从你在地址栏输入g...
    17碎那年阅读 2,444评论 0 22
  • 目录一、介绍二、渲染引擎三、解析与DOM树构建四、渲染树构建五、布局六、绘制七、动态变化八、渲染引擎的线程九、CS...
    饥人谷_米弥轮阅读 2,455评论 0 10
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,692评论 0 9