iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > html >如何理解CSS中选择器的逻辑处理
  • 248
分享到

如何理解CSS中选择器的逻辑处理

2024-04-02 19:04:59 248人浏览 八月长安
摘要

这篇文章给大家介绍如何理解CSS中选择器的逻辑处理,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。在过去的很长一段时间中,我们都说 CSS 是不带有任何逻辑的,意思是在 CSS 中没有控

这篇文章给大家介绍如何理解CSS中选择器的逻辑处理,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

在过去的很长一段时间中,我们都说 CSS 是不带有任何逻辑的,意思是在 CSS 中没有控制流,也没有某种类似于其他编程语言的方式来组织 CSS。CSS 天生缺乏逻辑性的问题导致了预处理器的出现。然而业界却对 CSS 预处理器褒贬不一,支持预处理器的人认为这弥补了 CSS 缺失的特性;而反对预处理器的人则认为 CSS 的设计初衷就不应该带有逻辑性,他们认为根本不应该引入预处理器这个概念。

然而,一种独特的思考方法最近突然蹦入了我的脑袋。它让我感到 CSS 确实拥有逻辑性!很少有人真正那么想过,这大概也是我们一直认为 CSS 的逻辑性匮乏的最大原因吧。

我发现我们可以将复合选择器理解为:主体部分 + 条件部分。首先来看一个例子:

CSS 

  1. div.sidebar .login-box a.btn span {   

  2.       

  3. }  

在这个复合选择器由主体部分是 span,而条件部分是 IF (inside .btn) AND IF (on a) AND IF (inside .login-box) AND IF (inside .sidebar) AND IF (on div)。

也就是说,一个选择器的每一部分都是一个 if 语句,需要在解析选择器时被满足(或者不满足)。有了这种微妙的而又全新的认识,如今我们回头再看看自己曾经写出的 CSS 代码,我们将会意识到选择器写的好或者坏,会对效率产生直接的影响。我们真的会写出下面这段逻辑吗?(伪代码):

CSS

  1. @if exists(span) {   

  2.   @if is-inside(.btn) {   

  3.     @if is-on(a) {   

  4.       @if is-inside(.login-box) {   

  5.         @if is-inside(.sidebar) {   

  6.           @if is-on(div) {   

  7.             # Do this.   

  8.           }   

  9.         }   

  10.       }   

  11.     }   

  12.   }   

  13. }  

也许不会。这看上去太不直接,也太啰嗦了。我们也许只需要这么写:

CSS 

  1. @if exists(.btn-text) {   

  2.   

  3.   # Do this.   

  4.   

  5. }  

每当为选择器添加一层限制,其实我们也就是添加了额外的一个 if 语句。这会导致圈复杂度问题(Cyclomatic Complexity)。
圈复杂度

在软件工程中,圈复杂度是一种程序复杂性的一种度量标准,它一般计算程序中的控制流的数量(如 if, else, while 等)。程序中存在越多的控制流,则圈复杂度就越高。我们自然想要保证圈复杂度能够尽量地低,因为圈复杂度越高:

    代码就越难推导
    更多潜藏着的、可能会导致失败的问题
    代码更难以修改、维护以及复用
    你需要考虑更多代码执行的结果与其副作用
    编写测试代码的难度也会更高

从圈复杂度的角度来思考 CSS 的解析过程,我们可以看到浏览器在渲染样式之前需要做许多的决定。我们写的选择器中的 if 语句越多,这个选择器的圈复杂度就越高,这也意味着我们写的选择器越糟糕,为了使得这一条选择器规则满足,就有需要匹配更多的条件。同时,我们写的选择器也会缺乏清晰度和复用性,因为引入了过多不必要的 if 语句会导致不准确的匹配(false positive)。

相比于将 span 嵌套于 .btn 内部并写一大堆限制条件,更好地做法应该是创建一个新的类 .btn-text 来描述这个 span。这样做更加直截了当,同时也更为简洁和健壮(越多的 @if 语句导致选择器规则越不容易被满足)。

值得注意的是浏览器解析你写的选择器的方式:从右向左。如果你在写你的选择器时,第一个想到的问题是:“这是一个 span 元素吗?” 那你通常就会把选择器写的过于冗繁。你应该从另一个角度思考,写出清晰准确的选择器规则,彻底摒弃那些冗余的条件语句。

请不要写过于宽泛的规则,导致你写的选择器在匹配开始时就选中大量的 DOM 元素——然后不得不逐步通过更多的条件语句来删减匹配的对象。从选择器的规则解析的一开始就匹配尽量少的元素才是一种更棒的方法。

圈复杂度对于 CSS 来说可能是一种比较高阶的原则,但如果我们通过它来考量那些蕴含在我们写的选择器中的逻辑性,那我们也许就能写出更加优秀的代码。

一些易于遵守的小规则,

    让你的选择器最简化:每一次你想要为选择器添加规则时,你都在添加额外的 if 语句。将这些 if 语句大声地读出来,仔细考虑它们是否有添加的必要。你需要时刻保持你写的选择器足够合理与简洁。
    保证圈复杂度最小化: 使用像 Parker 这样的工具来测试你写的选择器的圈复杂度(参考文档:Identifiers Per Selector)
    如果你不需要这个检验条件,那就不要把它放进选择器: 有时在 CSS 中使用嵌套结构是有必要的,可在大多数时候并不是,你甚至不能完全相信Inception Rule。
    从右边考虑选择器如何编写: 从需要匹配的那类元素开始,写尽量少的额外的 CSS 代码来完成一次正确的匹配。
    写选择器时拥有明确的目的性: 确保你写的选择器确实是你想要的,而不是那些碰巧能使得页面正常显示的代码。

你的选择器是你的 CSS 结构最基本的组成部分,一定要确保你写的代码足够合理而简练。

关于如何理解CSS中选择器的逻辑处理就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: 如何理解CSS中选择器的逻辑处理

本文链接: https://www.lsjlt.com/news/81798.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何理解CSS中选择器的逻辑处理
    这篇文章给大家介绍如何理解CSS中选择器的逻辑处理,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。在过去的很长一段时间中,我们都说 CSS 是不带有任何逻辑的,意思是在 CSS 中没有控...
    99+
    2022-10-19
  • 如何理解CSS中的类型选择器和ID选择器以及class选择器
    这期内容当中小编将会给大家带来有关如何理解CSS中的类型选择器和ID选择器以及类选择器,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。类型选择器类型选择器,是以html元素...
    99+
    2022-10-19
  • Bash中的逻辑和(&)该如何理解
    本篇文章为大家展示了Bash中的逻辑和(&)该如何理解,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。在 Bash 中,你可以使用 & 作为 AND(逻辑和)操作符。有人可能会认为两篇...
    99+
    2023-06-16
  • css中预处理器、后处理器以及选择器的示例分析
    这篇文章将为大家详细讲解有关css中预处理器、后处理器以及选择器的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。css预处理器css预处理器:用一种专门的编程语言...
    99+
    2022-10-19
  • CSS中如何合理地使用派生选择器
    这篇文章主要介绍“CSS中如何合理地使用派生选择器”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“CSS中如何合理地使用派生选择器”文章能帮助大家解决问题。 经过依...
    99+
    2022-10-19
  • 如何理解Python中 and 和 or 运算短路逻辑
    本篇文章为大家展示了如何理解Python中 and 和 or 运算短路逻辑,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。短路逻辑规则如下:表达式从左至右运算,若 or 的左侧逻辑值为 True ,则...
    99+
    2023-06-01
  • 如何理解css样式的特点与优先选择权
    本篇内容主要讲解“如何理解css样式的特点与优先选择权”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解css样式的特点与优先选择权”吧!CSS样式的特点:...
    99+
    2022-10-19
  • CSS伪类或伪元素选择器该如何整理
    这期内容当中小编将会给大家带来有关CSS伪类或伪元素选择器该如何整理,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、超链接    ...
    99+
    2022-10-19
  • 如何进行常用CSS选择器的解析
    今天就跟大家聊聊有关如何进行常用CSS选择器的解析,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。你也许已经掌握了id、class、后台选择器这些基本...
    99+
    2022-10-19
  • 香港服务器如何选择服务器处理器
    香港服务器选择服务器处理器的方法:1.处理器品牌,Intel、AMO、IBM和SUN;2.处理器类型,选择支持双路的DP处理器;3.处理器具体型号,双核、四核处理器;具体分析如下:处理器品牌Intel和AMO的处理器是基于x86,或者IA-...
    99+
    2022-10-24
  • MySQL中使用备库作逻辑备份,如何处理主库的DDL语句
    ## 确保可重复读隔离级别 S1: set session transaction isolation level repeatable read; ## 确保能得到一个一致性视图 S2: start transaction with c...
    99+
    2021-04-01
    MySQL中使用备库作逻辑备份,如何处理主库的DDL语句
  • CSS中的层级选择器如何使用
    这篇文章主要介绍“CSS中的层级选择器如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“CSS中的层级选择器如何使用”文章能帮助大家解决问题。层级选择器CSS层...
    99+
    2022-10-19
  • Dreamweaver中css选择器中的类如何使用
    这篇文章主要介绍Dreamweaver中css选择器中的类如何使用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Dreamweaver中的css选择器是定义css规则首选需要选择的,css选择器主要有:类\id\标签...
    99+
    2023-06-08
  • 大数据处理中,如何选择适合的go ide?
    随着大数据技术的不断发展,越来越多的公司和组织开始使用大数据技术来帮助他们更好地管理和分析海量数据。而在大数据处理中,选择一个合适的Go IDE可以帮助开发人员更有效地开发和管理代码。本文将介绍如何选择适合的Go IDE,以及如何使用Go ...
    99+
    2023-06-26
    ide 打包 大数据
  • CSS中如何计算选择器的权重值
    这篇文章主要为大家展示了“CSS中如何计算选择器的权重值”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“CSS中如何计算选择器的权重值”这篇文章吧。CSS 选择器...
    99+
    2022-10-19
  • 如何使用Div和CSS编写中的包含选择器和通配选择器
    这篇文章将为大家详细讲解有关如何使用Div和CSS编写中的包含选择器和通配选择器,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。包含选择器包含选择器也叫派生选...
    99+
    2022-10-19
  • 了解CSS选择器通配符的权重和优先级的深层次理解
    深入理解CSS选择器通配符的权重和优先级在CSS样式表中,选择器是用来指定样式应用于哪些HTML元素的重要工具。选择器的优先级和权重决定了当多个规则同时作用于一个HTML元素时,应用哪个样式。通配符选择器是CSS中一种常见的选择器。它使用“...
    99+
    2023-12-26
    优先级 CSS选择器 权重
  • php中如何处理数据库选择失败问题
    这篇文章将为大家详细讲解有关php中如何处理数据库选择失败问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。php中数据库选择失败的解决办法:1、检查mysql_select_db和mysqli_sele...
    99+
    2023-06-22
  • css中如何使用形似猫头鹰的选择器
    小编给大家分享一下css中如何使用形似猫头鹰的选择器,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!使用 “形似猫头鹰” 的选择器这个名字可能比较陌生,不过通用选择器 (*) 和 相邻兄弟选择器 (+) 一起使用,效果非凡:...
    99+
    2023-06-27
  • go语言中的缓存和并发处理:如何选择最适合的容器?
    在Go语言中,缓存和并发处理是常见的需求。为了提高程序的性能和效率,我们通常会使用容器来存储和管理数据。但是,不同的容器在不同场景下的表现也是不同的。本文将介绍Go语言中常见的缓存和并发处理容器,并探讨如何选择最适合的容器。 一、缓存容器 ...
    99+
    2023-11-07
    缓存 并发 容器
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作