`
wandejun1012
  • 浏览: 2686497 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

[转]CSS的优先级特性Specificity

阅读更多

关键字:CSS,优先级,嵌套

很经典的文章啊,看完之后 —— 感觉似乎明白了许多,似乎又更加糊涂了。
如果同个元素有两个或以上冲突的CSS规则,浏览器有一些基本的规则来决定哪一个非常特殊而胜出。
  它可能不像其它那么重要,大部分案例你不需要担心冲突,但大型而且复杂的CSS文件,或有很多CSS文件组成的,可能产生冲突。
  选择器一样的情况下后面的会覆盖前面的属性。比如:
p { color: red; }
p { color: blue; }
p元素的元素将是蓝色,因为遵循后面的规则。
  然而,你不可能经常用相同的选择器冲突达到目的,当你使用嵌套选择器,合理的冲突来了。比如:

div p { color: red; }
p { color: blue; }
也许你看起来p元素在div元素里面的颜色是蓝色,就像后面p元素的规则,但是第一个选择器的特性却是红色。基本上,一个选择器越多特性,样式冲突的时候将显示它的样式。
  一组嵌套选择器的实际特性可以计算出来。基本的,使用ID选择器的值是100,使用class选择器的值是10,每个html选择器的值是1。它们加起来就可以计算出特性的值。

 p的特性是1(一个html选择器)
  div p的特性是2(两个html选择器)
  .tree的特性是10(1个class选择器)
  div p.tree的特性是1+1+10=12,(两个html选择器,一个class选择器)
  #baobab的特性是100(1个ID选择器)
  body #content .alternative p的特性是112(两个html选择器,一个ID选择器,一个类选择器)
  按照上面的规则,div p.tree的特性比div p高,body #content .alternative p又比它们两个都高。

css优先级的四大原则:

原则一: 继承不如指定

如果某样式是继承来的永远不如具体指定的优先级高。

例子1:

CODE:

<style type="text/css">

<!--

*{font-size:20px}

.class3{ font-size: 12px; }

-->

</style>

<span class="class3">我是多大字号?</span>

运行结果:.class3{ font-size: 12px; }

例子2:

CODE:

<style type="text/css">

<!--

#id1 #id2{font-size:20px}

.class3{font-size:12px}

-->

</style>


<div id="id1" class="class1">

<p id="id2" class="class2"> <span id="id3" class="class3">我是多大字号?</span> </p>

</div>

运行结果:.class3{ font-size: 12px; }

注意:后面的几大原则都是建立在“指定”的基础上的。

原则二: #ID >.class >标签选择符

例子:

CODE:

<style type="text/css">

<!--

#id3 { font-size: 25px; }

.class3{ font-size: 18px; }

span{font-size:12px}

-->

</style>


<span id="id3" class="class3">我是多大字号?</span>

运行结果:#id3 { font-size: 25px; }

原则三:越具体越强大。

解释:当对某个元素的CSS选择符样式定义的越具体,层级越明确,该定义的优先级就越高。

CODE:

<style type="text/css">

<!--

.class1 .class2 .class3{font-size: 25px;}

.class2 .class3{font-size:18px}

.class3 { font-size: 12px; }

-->

</style>


<div class="class1">

<p class="class2"> <span class="class3">我是多大字号?</span> </p>

</div>

运行结果:.class1 .class2 .class3{font-size: 25px;}

原则四:标签#id >#id ; 标签.class >.class

上面这条原则大家应该也都知道,看例子

CODE:

<style type="text/css">

<!--

span#id3{font-size:18px}

#id3{font-size:12px}

span.class3{font-size:18px}

.class3{font-size:12px}

-->

</style>

<span id="id3">我是多大字号?</span>

<span class="class3">我是多大字号?</span>

运行结果:span#id3{font-size:18px} | span.class3{font-size:18px}

很多人会有这样的疑问,为什么不把这个原则四归入原则一形成:

【 标签#ID >#ID >标签.class >.class >标签选择符 >通配符 】 呢?或者将 “标签.class” 看作多更为具体的 “.class” 从而归入原则二呢?后面我将解答各位的疑惑,这就涉及到CSS的解析规律---------这四大原则间也是有优先级的,是不是有些糊涂了?别急,继续看。

*四大原则的权重

相信很多人都知道上面的四大原则,不要以为知道了这四大原则就能分辨css中那条代码是起作用的,不信?那你5秒内能肯定的知道下面这段代码,测试中的文字的字号吗?

CODE:

<style type="text/css">

<!--

.class1 p#id2 .class3{font-size:25px}

div .class2 span#id3{font-size:18px}

#id1 .class3{font-size:14px}

.class1 #id2 .class3{font-size:12px}

#id1 #id2{font-size:10px}

-->

</style>

<div id="id1" class="class1">

<p id="id2" class="class2"> <span id="id3" class="class3">我是多大字号?</span> </p>

</div>

为了大家方便阅读,我去掉了一些代码。

四大原则的权重就是: 原则一 >原则二 >原则三 >原则四

解释:

首先遵循原则一

有指定开始使用下面的原则,无指定则继承离他最近的定义。

然后开始原则二

1、比较最高优先级的选择符

例子:

CODE:

<style type="text/css">

<!--

#id3{font-size:18px}

.class1 .class2 .class3{font-size:12px} /* 描述的再具体也不起作用 --- 原则二 */

.class3{font-size:18px}

div p span{font-size:12px}

-->

</style>

<div id="id1" class="class1">

<p id="id2" class="class2"> <span id="id3" class="class3">我是多大字号?</span> </p>

</div>

运行结果:#id3{font-size:18px}

删掉上面CSS中的前两行可以得出,如果没有最高级别的#ID会寻找.class 即使后面的CSS按照“原则二” 描述的再具体也无法突破原则一。

2、如果两条CSS的如果最高选择符优先级一样,则比较他们的数量

例子:

CODE:

<style type="text/css">

<!--

.class1 #id3{font-size:12px}

.class1 .class2 #id3{font-size:14px}

-->

</style>

<div id="id1" class="class1">

<p id="id2" class="class2"> <span id="id3" class="class3">我是多大字号?</span> </p>

</div>

运行结果:.class1 .class2 #id3{font-size:14px}

3、如果最高选择符级别和数量都一样,则按照原则二比较他们下一级,以此类推。

例子1:

CODE:

<style type="text/css">

<!--

#id1 .class2 .class3{font-size:14px}

div .class2 #id3{font-size:12px}

-->

</style>

<div id="id1" class="class1">

<p id="id2" class="class2"> <span id="id3" class="class3">我是多大字号?</span> </p>

[color=Orange]

运行结果:#id1 .class2 .class3{font-size:14px}

[/color]

*最高级选择符的位置没有高下之分,论证:[code]CODE:

<style type="text/css">

<!--

#id1 .class2 .class3{font-size:18px}

.class1 #id2 .class3{font-size:14px}

.class1 .class2 #id3{font-size:12px}

-->

</style>

<div id="id1" class="class1">

<p id="id2" class="class2"> <span id="id3" class="class3">我是多大字号?</span> </p>

</div>

上例中更换3条CSS的先后可以得出,哪条位于最后,哪条起作用。说明他们的级别一样,后面的将覆盖前面的。

*将原则四归入原则二的不合理性,论证:

CODE:

<style type="text/css">

<!--

.class1 span#id3{font-size:14px}

#id1 .class2 .class3{font-size:12px}

-->

</style>

<div id="id1" class="class1">

<p id="id2" class="class2"> <span id="id3" class="class3">我是多大字号?</span> </p>

</div>

#id1 .class2 .class3{font-size:12px}

可以看到span#id3并不比#id1高出一个级别。

无结果开始原则三

如果比较结果,选择符从最高级开始都对应,级别上的数量也相同,则开始比较谁更具体。

例子:

CODE:

<style type="text/css">

<!--

#id1 .class2 span{font-size:14px}

.class1 #id3{font-size:12px}

-->

</style>

<div id="id1" class="class1">

<p id="id2" class="class2"> <span id="id3" class="class3">我是多大字号?</span> </p>

</div>

#id1 .class2 span{font-size:14px}

当然也可以理解为在原则二层层比较中“少一个层级的样式”,缺少的那个层级没有“层级较多的样式”多出的那个层级的级别高。(绕口令)

*将原则四归入原则三的不合理性,论证:

CODE:

<style type="text/css">

<!--

.class2 .class3{font-size:14px}

span.class3{font-size:12px}

-->

</style>

<div id="id1" class="class1">

<p id="id2" class="class2"> <span id="id3" class="class3">我是多大字号?</span> </p>

</div>

上例中可以看出,如果将原则四并入原则三,将span.class3看作两层,那么应该和.class2 .class3层级一样多,那么应该显示12px,而事实不是这样。

最终对决原则四

如果还分不出结果,则开始原则四的比较:

例子1:

CODE:

<style type="text/css">

<!--

.class1 p.class2 .class3{font-size:14px}

.class1 .class2 .class3{font-size:12px}

-->

</style>

<div id="id1" class="class1">

<p id="id2" class="class2"> <span id="id3" class="class3">我是多大字号?</span> </p>

</div>

.class1 p.class2 .class3{font-size:14px}


写点我自己的总结:

先看是否描述到该元素,再看最高级别的等级和数量(#id>class,html#id>#id),同级级别&数量一致时,再看下一级属性。

分享到:
评论

相关推荐

    CSS优先级算法如何计算?有哪些判定规定及计算方式

    CSS 的specificity 特性或称非凡性,它是一个衡量CSS值优先级的一个标准,既然作为标准,就具有一套相关的判定规定及计算方式,specificity用一个四位的数 字串(CSS2是三位)来表示,更像四个级别,值从左到右,左面...

    CSS3笔记1

    多背景(CSS3)凹凸文字导航栏案例文本的装饰CSS 三大特性CSS层叠性CSS继承性CSS优先级CSS特殊性(Specificity)盒子模型(CSS重点)看

    postcss-increase-specificity:为什么? 处理您无法删除CSS(主要是从第三方)。 增加选择器的特异性

    PostCSS增加特异性 插件可以增加选择器的特殊性。 处理您无法删除CSS(主要是从第三方),。 安装 npm install postcss-...// Process your CSS with postcss-increase-specificity var output = postcss ( [ inc

    css-specificity:CSS 选择器特异性计算器

    css-specificity 是包装模块。 安装 $ npm install css-specificity 例子 var specificity = require ( 'css-specificity' ) var calc = specificity . calc ( '.class, p.sel:after' ) var winner = specificity ...

    css-specificity-map:映射用于绘图的 CSS 特异性数据

    css-specificity-map 映射 CSS 特异性数据以创建。 基于经验。 交互式示例。安装使用节点使用 npm 安装: npm install css-specificity-map包括在您的代码中: var cssSpecificityMap = require('css-specificity-...

    css-specificity

    css 特异性css-specificity 接受一个字符串并告诉您其中每个选择器的 CSS 特异性。用法 var cssspecificity = require('css-specificity');var s = cssspecificity('#id .class:hover a, .nav:hover a');console.log...

    css-specificity-graph:使用 CSS,分析选择器,并生成特异性图

    CSS 特异性图这个项目的目标是采用提供的 CSS,分析选择器,并生成一个特异性图(基于)。 正因为我们都在同一页面上,我会经常拼错“特殊性”,而且经常不纠正它。 想要演示? 。要求PHP 您想要分析的一些 CSS...

    specificity-graph, 为你的CSS生成交互式的特殊图形.zip

    specificity-graph, 为你的CSS生成交互式的特殊图形 特性图( 用于 CSS ) 作者: 。 生成一个交互式线条图,显示样式表中的特殊性。 使用 d3,css解析器,和特异性。安装npm install specificity-graph用法specifity-...

    Enduring CSS

    The problems of CSS at scale - specificity, the cascade and styles intrinsically tied to element structure. The shortfalls of conventional approaches to scaling CSS. The ECSS methodology and the ...

    specificity:CSS 资源管理器

    特异性 通过可视化探索您的 CSS! 特异性分析您的 CSS 文件,收集有关选择器特异性的信息并将其保存为配置文件。 您可以使用不同的报告来浏览这些配置文件或编写自己的报告。使用安装: $ npm install -g node-...

    CSS Quick Syntax Reference

    7. Specificity 8. Colors 9. Units 10. CSS properties 11. Text 12. Spacing 13. Font 14. Background 15. Gradients 16. Box model 17. Border 18. Outline 19. Margin and padding 20. Dimension 21. ...

    CSS The Definitive Guide 4th Edition 2017年出版1088页

    Selectors, specificity, and the cascade Values, units, fonts, and text properties Padding, borders, outlines, and margins Colors, backgrounds, and gradients Floats and positioning tricks Flexible box ...

    英文原版-Selectors Specificity and the Cascade 1st Edition

    When you purchase either the print or the ebook edition of Selectors, Specificity, and the Cascade, you’ll receive a significant discount on the entire Definitive Guide when it’s released....

    15个必须阅读的CSS入门文章

    你是新学习CSS?在这个漂亮的学习语言的初始过程可能是一个有点惊人,有很多可以学习它有时很难找出哪里开始。...Specifics on CSS Specificity Faux Columns Sexy Ordered Lists with CSS Divitis: What it is and

    CSS代码是否合理?是否优化?

    CSS2.1 中规定了关于 CSS 规则 Specificity(特异性)的计算方式,用一个四位的数字串(注:CSS2 中是用三位)来表示,最后以 Specificity 的高低判断 CSS 的优先权。 Specificity 具体的计算规则: 元素的 style ...

    a method to recognize specificity determining.pdf

    a method to recognize specificity determining.pdf

    sass-specificity:Sass 特异性计算器

    Sass 特异性 Sass (SCSS) 特异性计算器实用程序,用于通过 mixin 或函数计算(和显示)任何有效简单/复合/复杂选择器的特异性或特异性图。... $this-specificity-map : specificity ( & ); // 1, 1, 2 $this-spe

    specificity-graph:您项目CSS专用性的图形表示

    是一个非常简单的工具,它允许复制和粘贴CSS并分析样式表的特定性状态。 可以通过将节点本身悬停来分析任何特异性峰。 专一性 计算起来很容易:理想情况下,它是由4个值组成,并用逗号( 0,0,0,0 )分隔,每种选择器...

    :chart_increasing:一种可视化的方法来分析CSS中选择器的特殊性。-JavaScript开发

    特殊性可视化工具一种分析CSS中选择器的特殊性的可视化方法:isellsoap.github.io/specificity-visualizer查看介绍特殊性可视化工具的博客文章。 它详细介绍了“为什么”,“为什么……”特异性可视化工具一种用于...

Global site tag (gtag.js) - Google Analytics