展开菜单
首页 精品内容 本月促销 装机必备 Windows macOS软件 IOS软件 Android AI PDF教程 专题
全部分类

当前位置:

首页 > 编程开发 > css进阶学习 选择符

css进阶学习 选择符

CSS选择符的质量影响代码可维护性与性能。浏览器从右向左匹配样式,应使用具体的关键选择符如class,缩短选择符序列,避免链式选择符和多余标签限定,以减少匹配次数,提升渲染效率。

初学CSS时,最让人困惑的莫过于它那极高的自由度——同一个设计交给不同的人来做,最终产出的代码几乎不可能一模一样。问题随之而来:如果不同的实现方式,不同的代码风格,最终在视觉上呈现的效果完全一致,我们又该如何评判孰优孰劣?CSS毕竟是门没有程序逻辑的描述性语言,难道还能从中分出高下?

如今,我越来越认同一个观点:即使是描述性语言,CSS同样存在代码质量的评判标准。核心就是两个维度——可维护性性能。用大白话说,好的CSS既要对开发者友好(dev-friendly),也要对浏览器友好(browser-friendly)。这篇文章就从选择符的角度,聊聊如何写出更高质量的CSS代码。

关键选择符与浏览器的样式规则匹配原理

CSS选择符,就是每一条样式规则中{}之前的部分,描述的是“把样式作用到哪些元素上”。这里需要引入一个额外概念:关键选择符。它指的是每条样式规则起始的{之前的最后一个选择符,如下图所示:

css进阶学习 选择符

CSS选择符决定了属性定义要作用到哪些元素,因此存在一个浏览器根据选择符来匹配样式的过程。关于浏览器的匹配机制,Da vid Hyatt在Writing Efficient CSS for use in the Mozilla UI中提过:

样式系统匹配一条规则时,从最右边的选择符开始,然后向左移动,遍历规则中的选择符序列。只要你的小小子树不断匹配成功,样式系统就会继续向左移动,直到匹配整个规则,或者因为某个位置不匹配而放弃。

也就是说,浏览器引擎采用的是从右向左的顺序进行样式匹配。为什么这么设计?可以看看Stack Overflow上的相关讨论。简单解释一下:最右边的关键选择符直接表示了样式定义应作用的元素,从右向左的顺序能让浏览器在初始匹配时就确定有样式定义的元素集合,从而更快地跳过大多数实际上没有作用到的选择符。

好的CSS选择符,就是要让浏览器在样式匹配过程中减少查询次数,以更快的速度完成匹配,进而优化前端性能。这其中,必须充分理解浏览器的从右向左匹配顺序。

CSS选择符的正确使用方式:更特定

更具体的关键选择符

关键选择符是浏览器引擎最先读取的部分。如果你在某条样式规则中使用更具体的选择符,就能帮助减少查找匹配次数。比如:

.content .note p{}

这里的p是关键选择符,而p标签在网页中非常常见。浏览器从p开始读取,可能会因为匹配了太多元素而做额外工作。如果你只是想为特定位置的p定义样式,更好的做法是给它命名class,比如p.note_text,然后直接写:

.note_text{}

使用class选择符

class选择符是性能最优的选择符。相比之下,ID的缺点在于只能定义给一个元素,无法重用,而且在使用上没有任何比class更好的地方。很多时候你很难确定某个元素是否唯一。一个比较好的实践是:用class定义样式,把ID留给Ja vaScript。如果可以,尽量不用ID来定义样式。

而与class相比,标签在HTML中的重复性更大,同样可能让浏览器做额外工作。除了CSS样式清零(reset)之外,尽量少用标签选择符(元素选择符)。

缩短选择符序列

继承写法(这里指CSS关系选择符中的包含选择符)非常常用。它的初衷是:如果有两个元素标签相同或class命名相同,加入父元素的选择符组成序列,就能避免在不需要时样式互相影响。比如.confirm_layer .submit_btn表示:class名为submit_btn,且有一个class名为confirm_layer的父元素,才应用样式。

但避免互相影响,不代表可以随意使用继承选择符。浏览器会从右向左读取整个序列,直到匹配完成或因不匹配而取消。因此,短的选择符序列更有利于浏览器快速完成匹配。冗长的序列则被认为是低效的,比如:

.header ul li .na v_link{}

建议写成:

.header .na v_link{}

一般来说,不超过3层的继承层级就能满足实际开发需求。应减少不必要的层级,使用更短的选择符序列。

另外,较长的选择符序列还有一个问题:它会导致CSS优先级计算值偏高。以后如果需要写新样式来覆盖它,就必须写更长的选择符(或者使用ID)才能获得更高优先级,这对性能和代码可读性都不利。

避免链式选择符

链式选择符是对单个元素同时写了多个选择符判定。比如p.name表示class名为name且标签为p的元素才应用样式。这些判定可以是ID、标签、class的任意组合。

但链式选择符是过度定义的,不利于重用,也不利于性能。例如:

a#author{}

建议写成:

#author{}

这里的a是多余的——一个ID只对应一个元素,没必要再强调标签是什么(class同理)。再比如:

.content p.arrow{}

建议写成:

.content .arrow{}

p.arrow中的p也是不必要的——它让浏览器多了一项检查:class名为arrow的元素的标签是不是p,从而降低了性能。如果去掉这个限定,.arrow的样式定义就可以用在更多元素上,重用性更好。否则,你还得告诉别人:使用这个样式只能用在p标签上。

同理,多个class的链式写法,比如.tips.succuss{},建议更改命名,写成:

.tips_succuss{}

这样能帮助浏览器减少额外的样式匹配工作。

顺带一提,IE6对链式选择符存在一个bug:多个class写在一起如.class1.class2.class3,正常情况是只有同时拥有全部class的元素才应用样式,但IE6只认最后一个,即符合.class3的元素就会应用样式。

例外情况

前面这些建议,主要是从浏览器渲染性能优化和代码重用性角度分析得出的理论结果。实际使用中不必教条地遵守。比如,如果你确实想为class名为intro的元素内的所有a标签都加上样式,那么.intro a这样的选择符就是明智的。

结语

关于高效的CSS选择符,还可以参考Google Developer中的Use efficient CSS selectors。如今现代浏览器在样式匹配上已经有了更多优化(参考CSS Selector Performance has changed!),有些方面我们不再需要过分担心。但这并不意味着可以随意写选择符——CSS选择符性能优化依然存在。你的选择符应该更好地体现你的意图,而不是随心所欲。更重要的是,以这样一种经过思考的方式来写CSS选择符,并不是什么难事。只要你想,形成这种习惯,自然就能在这方面做得更好,何乐而不为呢?

本文内容来源于网友投稿,如有侵权请联系删除。
作者最新文章
编程开发 CSS
相关文章 更多
精品专题 更多
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

IOS软件

正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

AI

正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

Mac软件 更多
Blender
Blender

Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

灵活计算器
灵活计算器

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

赤友清理大师
赤友清理大师

赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

极度公式
极度公式

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

图几
图几

图几是一款适用于 macOS 的截图、标注与美化工具,支持离线操作保障隐私。界面整理和高频系统操作被放到一起考虑,桌面或窗口内容一多时,管理起来会更省心。

密码键盘
密码键盘

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

思源笔记
思源笔记

思源笔记是一款本地笔记软件,提供所见即所得的编辑方式,为长文写作带来顺滑的体验。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

Office 365 简体中文
Office 365 简体中文

一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。

WALTR PRO
WALTR PRO

WALTR是一款电脑至iOS文件传输转换工具,操作简单,快速实现文件识别与传送。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

CodeExpander
CodeExpander

CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。

Mountain Duck
Mountain Duck

Mountain Duck 是一款能将多个网盘挂载到本地的工具,像本地磁盘一样使用网盘。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

Menuist
Menuist

Menuist 是一款面向 macOS 的 Finder 右键菜单增强工具,主要用来补充新建文件、快捷导航等常用操作,让日常文件管理和访问路径时更高效、更顺手。

WINDOWS 更多
Blender
Blender

Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

Windows 10
Windows 10

Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

极度公式
极度公式

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

密码键盘
密码键盘

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

思源笔记
思源笔记

思源笔记是一款本地笔记软件,提供所见即所得的编辑方式,为长文写作带来顺滑的体验。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

傲梅轻松备份
傲梅轻松备份

傲梅轻松备份是一款专业易用的数据备份软件,为重要数据提供安全保障。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

Office 365 简体中文
Office 365 简体中文

一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。

Wise Folder Hider Pro
Wise Folder Hider Pro

Wise Folder Hider Pro 是一款专业级文件和文件夹隐藏加密软件,为私密数据添加多重保护。高频操作更强调就近处理,浏览、整理和跨目录移动文件时,来回切换和重复点击都会少很多。

WALTR PRO
WALTR PRO

WALTR是一款电脑至iOS文件传输转换工具,操作简单,快速实现文件识别与传送。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

CodeExpander
CodeExpander

CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。

PinStack
PinStack

PinStack是一款轻量级的Windows平台剪贴板管理工具,优化您的剪贴板使用体验。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

Mountain Duck
Mountain Duck

Mountain Duck 是一款能将多个网盘挂载到本地的工具,像本地磁盘一样使用网盘。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。