CSS规则层叠时的优先级算法 - lunaticsun.com - CSDNBlog

2024-04-27 11:38

本文主要是介绍CSS规则层叠时的优先级算法 - lunaticsun.com - CSDNBlog,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

导读:




本文首发于 http://www.lunaticsun.com/article/cascading-style


CSS 规则的优先级是Web前端开发人员必须理解的一个概念,我们常用的添加样式的方法有4种。

  • inline style
  • embeded style
  • external style
  • user style

inline style是丑陋的,它们穿梭在HTML文档中,与HTML元素扭成一团,给Web前端开发人员造成了许多麻烦。它们往往以这样的面目出现:

This is a paragraph.


embeded style比inline style绅士一些,它们也寄宿在HTML文档中,但是它们不屑于与HTML元素扭成一团。它们往往在

external style是个贵族,它不愿意同HTML呆在一起,所以干脆以外部文件的形式独立存在。通常我们使用 > 元素或者@import语句将它们导入HTML。

 rel="stylesheet" type="text/css" href="style.css" media="screen" />

我们应当尽可能使用external style,我想理由有很多,大家都知道,我也就不重复了。


有一种user style与以上三者略有不同,如果你使用IE浏览器,那么你可以在Tools – Internet Options –
General – Appearance – Accessibility – User style sheet 下找到添加user
style的地方(原谅我没有中文版的IE浏览器)。

既然我们有如此多的添加style的方法,那么难以避免样式会产生层叠。如:

This is a paragraph.


我们在使用以上inline style的同时,又在我们的external style中使用了:

p{
color : yellow;
}

我们甚至还在拥有 class="intro"

元素上应用了:

p.intro{
color : blue;
}

这样我们就 在同一元素的同一属性 color 上,拥有多条CSS规则指定了值 。这种情况被称为层叠(Cascading)。当层叠发生时,CSS Parser将根据优先级算法来确定最终选用的值。

优先级算法按照先后顺序考虑以下三个方面:

  1. CSS规则的重要性和来源
  2. CSS规则的特殊性
  3. CSS规则在文档中出现的顺序

算法过程分为4步:

1、针对某一元素的某一属性,列出所有给该属性指定值的CSS规则。如上例中,在 class="intro"

元素上,有三条CSS规则指定了 color 属性。

2、根据声明的重要性和来源进行优先级排序

重要性有两种:

  • important
  • normal(即非important)

在CSS规则后添加 !important 的重要性要高于没有添加的。

来源有三种:

  • user agent stylesheet – 浏览器默认样式
  • author stylesheet – 开发人员定义的样式
  • user stylesheet – 用户在浏览器中定义样式

重要性和来源的优先级排序从低到高是:

  1. user agent stylesheet
  2. user style sheets中的normal规则
  3. author style sheets中的normal规则
  4. author style sheets中的important规则
  5. user style sheets中的important规则

经过以上排序,如果有一条CSS规则的优先级高于其他所有竞争规则,那么算法结束,返回该最高优先级指定的值。如果有多条CSS规则具有最高优先级,那么它们将要继续竞争下去,算法将进入第3步。

3、按照特殊性(Specificity)排序

CSS将计算多条规则中指定每一规则的selector的特殊性值,该值越高,优先级越高。

特殊性值是一个由4个整数组成的一个类似数组的值:a,b,c,d,其中a的权重最高,依次类推,d的权重最低。selector特殊性值的计算方法是:

  • 如果该规则是一条inline style,那么a = 1
  • 如果该规则由selector指定,selector中出现的id selector的数量就是b的值
  • 如果该规则由selector指定,selector中出现的属性selector(包括class selector)或者伪类selector的数量总和就是c的值
  • 如果该规则由selector指定,selector中出现的元素selector或者是伪元素selector的数量总和就是d的值。
  • universal selector * 的特殊性值为0,0,0,0

官方网站 提供了一些例子可以加深理解。

在根据特殊性值排序时,由于a的权重最高,因此首先比较a,在a相同的情况,在比较b,依次类推。因此不论b,c,d值有多大,inline style总是具有最高的特殊性。

如果根据以上特殊性排序后,有一条CSS规则的优先级高于其他所有竞争规则,那么算法结束,返回该最高优先级指定的值。如果有多条CSS规则具有最高优先级,那么它们将要继续竞争下去,算法将进入第4步。

4、比较CSS规则在文档中出现的顺序

出现在后的总是比出现在前的具有更高的优先级,因此出现在最后的那条语句将被作为该属性的值。

至此,算法结束。我彻底晕了。


本文转自

http://blog.csdn.net/Lunatic_Sun/archive/2008/04/07/2256406.aspx

这篇关于CSS规则层叠时的优先级算法 - lunaticsun.com - CSDNBlog的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/940406

相关文章

CMakeLists.txt语法规则:条件判断中表达式说明四

一.  简介 前面学习了 CMakeLists.txt语法中的 部分常用命令,常量变量,双引号的使用。 前面几篇文章也简单了解了 CMakeLists.txt语法中的条件判断,文章如下: CMakeLists.txt语法规则:条件判断说明一-CSDN博客 CMakeLists.txt语法规则:条件判断中表达式说明一-CSDN博客 CMakeLists.txt语法规则:条件判断中表达式说明

FM算法能够学习到原始特征的embedding表示

FM算法是CTR预估中的经典算法,其优势是能够自动学习出交叉特征.因为这种特性,FM在CTR预估上的效果会远超LR. 说明:通过FM的公式可以看出,FM自动学习交叉是通过学习到每个特征xi的向量表示vi得到的.比如说,对于field A,其特征有100w种取值,如果使用one-hot编码。那么,每个特征需要使用100w维特征表示.使用了FM算法学习之后,比如说使用vi的特征维度是10维.那

FM算法详解

1.FM背景 在计算广告中,CTR预估(click-through rate)是非常重要的一个环节,因为DSP后面的出价要依赖于CTR预估的结果。在前面的相关博文中,我们已经提到了CTR中相关特征工程的做法。对于特征组合来说,业界现在通用的做法主要有两大类:FM系列与Tree系列。今天,我们就来讲讲FM算法。 2.one-hote编码带来的问题 FM(Factorization Machin

####并行版###标签传播算法(Label Propagation)及Python实现

标签传播算法(Label Propagation)及Python实现 zouxy09@qq.com http://blog.csdn.net/zouxy09          众所周知,机器学习可以大体分为三大类:监督学习、非监督学习和半监督学习。监督学习可以认为是我们有非常多的labeled标注数据来train一个模型,期待这个模型能学习到数据的分布,以期对未来没有见到的样本做预测。那这个性能

##单机版Python##社团划分——有向图的Label Propagation算法

在博文社区划分——Label Propagation中,介绍了Label Propagation社区划分算法的基本原理,基本的Label Propagation算法是针对无向图的社区划分算法。 一、基本Label Propagation算法原理 对于网络中的每一个节点,在初始阶段,Label Propagation算法对每一个节点一个唯一的标签,在每一个迭代的过程中,每一个节点根据与其相连的节点

【iOS逆向与安全】网上gw如何自动登录与签到SM2,SM3,SM4算法加解密

1.下载 app 2.frida 调试 3.抓包查看接口 4.分析加密数据 5.易语言编写代码  1 .开始下载 下载好发现有越狱检测,检测点为: -[AppDelegate isJailBreak]; 于是编写插件xm代码 : %hook AppDelegate- (void)isJailBreak{NSLog(@"AppDelegate isJailBreak

项目实战 | 如何恰当的处理 Vue 路由权限

前言 哈喽,小伙伴你好,我是 嘟老板。最近接了一个成本千万级的前端项目运维工作,本着 知己知彼 的态度,我将整个前端的大致设计思路过了一遍。不看不知道,一看…吓一跳。光是 路由权限 这块儿的设计,都让我“受益匪浅”,特写此篇文章来记录自己的所学所感。 阅读本文您将收获: 真实 vue 项目的路由权限处理思路及伪代码实现(反面案例)。个人对于 vue 路由权限处理的设计思考及伪代码实现。结合您

【web前端2024】简单几步制作web3d《萌宠星球》智体节点模板!

使用dtns.network德塔世界(开源的智体世界引擎),策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界引擎(内嵌了three.js编辑器的定制版-支持以第一视角游览3D场馆),可以在浏览器和node.js、deno、electron上运行,它是一个跨平台的软件,支持多个操作系统使用! 使用dtns.network的

基于DTW距离测度的Kmeans时间序列聚类算法

原理介绍 基于DTW距离测度的Kmeans时间序列聚类算法代码获取戳这里代码获取戳这里代码获取戳这里代码获取戳这里代码获取戳这里 DTW距离: 当两个时间序列不等长时,传统的欧氏距离难以度量它们的相似性。DTW通过调节时间点之间的对应关系,能够寻找两个任意长时间序列中数据之间的最佳匹配路径。DTW算法的基本思想是通过将时间序列进行弯曲、拉伸等变换,找到它们之间的最佳匹配路径,从而

vue导出大量数据的表格方法

我目前的项目导出4万7数据没问题 先安装 npm install -S file-saver npm install xlsx@0.16.0 -S npm install -D script-loader 我使用的版本是"file-saver": “^2.0.5”, “xlsx”: “^0.16.0” 新建Export2Excel.js //Export2Excel.js/* eslint-