Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

深入CSS《一》CSS如何渲染样式 #7

Open
Hjw52 opened this issue Oct 25, 2020 · 0 comments
Open

深入CSS《一》CSS如何渲染样式 #7

Hjw52 opened this issue Oct 25, 2020 · 0 comments
Labels

Comments

@Hjw52
Copy link
Owner

Hjw52 commented Oct 25, 2020

CSS如何渲染样式 ?

  • 层叠机制

CSS(cascade style sheet ) 中文即层叠样式表,它的核心即通过层叠来处理样式的冲突。那么何为层叠?层叠的机制是:为规则赋予不同的重要程度。最重要的是作者样式表,即开发者所写样式;其次是用户样式表,用户可以通过浏览器的设置为网页应用自己的样式;最后是浏览器的默认样式表。但使用!important放在属性声明后面可以覆盖任何规则。层叠机制的重要性高到低如下:

  1. 标记为 ! important 的用户样式
  2. 标记为 ! important 的开发者样式
  3. 开发者样式
  4. 用户样式
  5. 浏览器默认样式

在这基础上,规则再按选择符的特殊性排序,特殊性高的覆盖特殊性低的样式,如果两条规则的特殊性相等,则后定义的优先

特殊性

任何选择符的特殊性都对应以下4个级别,即a,b,c,d:

  • 行内样式,a 为1
  • b为ID选择符的数目
  • c为类选择符,伪类 属性选择符的数目(伪类有:link、visited、hover、focus等)
  • d为类型标签选择符合伪元素选择符的数目(伪元素有::first-letter、first-line等)

根据以上规则可以计算出任意选择符的特殊性:

选择符 特殊性 十进制特殊性
style=“ “ 1,0,0,0 1000
#ID1 # ID2 0,2,0,0 200
#ID1 .class{} 0,1,1,0 110
p .class1{} .class2{} 0,0,2,1 21
.class{} 0,0,1,0 10
div p{ } 0,0,0,2 2

这边的累加规则是基于位置累加的,不是普通的十进制加分。这避免高特殊性选择符被一堆低特殊性选择符的累加值覆盖。对于通用选择符(*),它的特殊性性为0 但比继承的特殊性高。

  • 样式的引入

    样式的声明与引入通常有以下三种方法:

    <!DOCTYPE html>
     <html lang="en"> 
    <head> 
    <link rel="stylesheet" rev="stylesheet" href="myCss.css" type="text/css" > 
    <style type="text/css" >                
    @import url("./myCss.css"); 
    .Mycss{
    	....
    }
    </style>
     </head> 
    </html>
    
    1. 直接放在head里的style标签里
    2. 在head使用link标签导入外部样式文件
    3. 使用@import加载外部CSS文件

    通常下,开发者还是建议多用link 慎用@import 。link属于HTML标签,功能更加强大,而@import只能导入样式表。而且加载页面,link标签引入CSS是同时加载,而@import是在页面加载结束后再加载CSS。样式的声明次序就是它在HTML源代码中出现的次序,要特别注意后声明的样式容易覆盖先前声明的样式。

  • 选择器匹配顺序

    对于下面这条规则,选择器是从左边先查找还是右边呢?

    .admin h3 span {font-size: 16em;}
    

    答案是先右边查找,先查找span标签。事实上,CSS选择器的读取顺序是:从右往左。先找到所有span 沿span的父元素查找h3,查找到的结果就加入结果集直到根元素不再匹配。一开始就筛掉一大堆不匹配的节点。如果从左到右查找,那么对于不匹配的节点大量回溯会对性能造成极大的浪费。

  • 同辈选择符的匹配问题

    我们先看下面的代码,你觉得三个p标签的样式是什么?其中 h2 ~ p是选择h2标签同辈的p标签,那么显然3个p标签都是匹配规则的,但真实的渲染结果又是什么样的呢?

     <header>
             <p>哈哈啊哈哈哈哈</p>
              <h2>haha</h2>
              <p>哈哈啊哈哈哈哈</p>
              <p>哈哈啊哈哈哈哈</p>
     </header>
     
     h2 ~ p{
     font-weight: bold;
     color: red;
     }
    

    真实的渲染结果:

    image-20201025152631636

    第一个p标签并没有被选中,那又是为什么呢?其实是浏览器不支持向前渲染,通常情况下,浏览器会按照元素在页面中出现的先后次序给它们应用样式。在给h2前面的P标签应用样式时,h2还不存在,所以不会匹配样式。

@Hjw52 Hjw52 added the CSS label Oct 25, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant