选择器权重/层叠/继承

css权重:

css权重:样式的优先级,有两条或多条样式作用于一个元素,就是同样的样式比较,具体采取谁,那个元素优先就由权重决定,比如多条样式比较,权重高的那条样式对元素才起作用,权重相同的,后写的样式会覆盖前面写的样式,我们可以叫他“后来居上”。

权重需要计算

权重计算(层叠):
声明冲突 :同一个样式,多次用到同一个元素,声明就是给他一个属性,
除了浏览器默认的样式和自己写的样式有冲突
例如:a标签,有默认的样式,自己又写的样式,就造成了声明冲突,重复的样式,只保留一个。像这样,浏览器遇到声明冲突了,它就要去解决冲突,有的时候还要专门写成声明冲突
例如:一排导航,只有一个选中,就要给其中一个加样式,去覆盖之前的样式, 浏览器遇到重复样式怎么去处理的,如何去覆盖 就是 层叠的过程(权重计算)。
层叠:浏览器解决声明冲突(重复样式)的过程,浏览器会自动处理重复样式过程,权重计算过程

  • 选择器的权重:
    1,!important Infinity(正无穷大)
    2,行间样式 1000
    3,id 100
    4,class | 属性 | 伪类 10
    5,标签选择器 伪元素 1
    6,通配符 0

  • 权重计算:
    通过选择器权重,计算出4位数,数值越大权重越高, 计算过程不是十进制,是256进制
    千位:内联样式, 记1,否则记0
    百位:选择器中所有id的数量,记1,否则记0
    十位:class,属性,伪类, 记1,否则记0
    各位:元素(标签),伪元素 , 记1,否则记0

同一排的选择器,权重相加是它的权重,权重相同,代码书写靠后的胜出

    /*0102*/
    #only div a{ color:red;}
    /*0002*/
    div a{ color:green;}
    /*0102*/
    #only a::after{ content: "*"; color:purple;}
    /*0201*/
    #only #only2 a{ color: orange;}
      /*0022*/
    .box div a:hover{ color:blue;}
    /*0012*/
    .box div a{ color:#ccc;}
  <div id="only" class="box">
     <div id="only2">
        <a href="#">我是a标签</a>
     </div>
  </div>
  .box a{
      color: #999;
  }
  div.box a{
      color: red;
  }
  div a{
    color: blueviolet;
  }
  a{
    color: green;
  }
  <p class="box">
      <a href="#">算我吧</a>
  </p>
 

css重置样式表

覆盖浏览器默认样式
很多浏览器默认样式是不同的,为了让其显示一样,要覆盖默认样式

项目中都是先引入一个覆盖浏览器样式的css 公共的样式
再引入自己写的样式
网上有很多重置样式表:normalize.css,reset.css,meyer.css
这几个文件没有什么大的区别,有细微差别,手动改一下就行了

继承:子元素会继承父元素的某些属性

通常子元素或者子孙元素会继承父元素或者祖父元素的某些css属性
并不是所有的属性都会被继承:通常和文字相关的属性都可以被继承,查看mdn官网
背景色不会被继承,不设置的背景色是透明的

查看控制台样式继承:
浏览器控制台inherited form body | div.box
此样式继承自body,div.box

 div{
     color: red;
     text-align:center;
  }
 <div>
       <p>1000</p> 
       <span>2000</span>
  </div>
  • 真实项目中,我们一般把字体类型,字体大写在body中,其他所有的元素都继承body的字体,不用再一个个的设置了
 div{
     color: red;
  }
 <div>
       <a href="#">算我吧</a>
       <p>1000</p> 
  </div>

属性值的计算过程

页面渲染的过程的细节
浏览器渲染每个元素的前提条件:该元素的所有css属性必须有值

一个元素,从所有属性都没有值,到所有的属性都有值,这个计算过程,叫做属性值计算过程
一个元素的所有的css属性都要有值才行,浏览器才会知道如何去渲染这个元素
少一个都不行,就算我们什么都没有写,浏览器也会去计算这个元素的css属性
再计算body的属性,再计算body中元素的属性…都计算完成后才会去渲染

控制台 Elements ->Computed 选中Show all 会显示当前元素的所有css属性

从无属性值到每个属性都有值的计算过程
怎么来计算呢?有4个步骤:
1,确定声明值 声明值
参考样式表中没有冲突的声明,直接拿出来作为css属性值,第2步以后就不再就进行了
user agent stylesheet的样式属于声明的属性值

2,层叠冲突,对样式表有冲突的使用层叠规则(权重计算)

3,使用继承 对仍然没有值的熟悉,若可以继承,则继承父元素的值

到了这里,能继承的去继承父元素属性,层叠冲突也解决了,声明的值也有了
但是还有一些属性没有值,怎么办呢?

4,使用默认值 对仍没有值的属性,使用默认值(浏览器的默认值)
每个属性都有自己的默认值,例如:背景色默认是透明色,一个p标签没有设置宽高,但也有宽高的默认值

经过了4个步骤为止,所有的属性值都确定好了, 浏览器才会去渲染

特殊的两个css取值:
1,inherit:手动(继承)继承,将父元素的值取出来应用到该元素
2,initial:使用浏览器默认值,浏览器给的什么值,就显示什么值
例如背景色是透明色,设置了div背景色是红的,其中一个想要用透明色,就可以直接使用默认值
background: initial; 使用的是浏览器默认的透明色

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值