深入CSS | 青训营

85 阅读2分钟

选择器的特异度

对于多条指向同一元素的有冲突的 CSS 规则,浏览器会按照某些规则来选择 CSS 规则然后对元素进行渲染。而这些规则就和特异度有关。

选择器idclass标签
特异度122

某一条 CSS 规则可能包括多个/多种选择器,将其特异度相加(或组成一个多位数),值大的作为最终渲染规则。

image.png

继承

某些属性会自动继承其父元素的计算值,除非显式指定一个值。

继承也可以显式继承:属性值写inherit。此外 CSS 中每个属性都有一个初始值,也有显式写法:initial。

CSS 求值过程:

graph TD
DOM树 --> filtering
样式规则 --> filtering
filtering --> cascading --> defaulting
defaulting --> resolving --> formatting
formatting --> constraining --> 实际值
筛选:选择器匹配,属性有效,符合当前media等,得到0/多个声明值 --> filtering
按照来源,!important,选择器特异性,书写顺序等对以上声明值选出优先级最高的属性值,得到一个层叠值 --> cascading
当这个值为空的时候进行继承或者使用初始值,得到一个指定值 --> defaulting
经过以上步骤,该值已确定且不为空,然后将一些相对值或者关键字转化为绝对值,比如em转为px,相对路径转为绝对路径,得到一个计算值 --> resolving 
然后对计算值进一步转换,比如把关键字,百分比等也都转为绝对值得到一个使用值 --> formatting
使用值若含有小数像素值,需再转为整数,最后得到实际值 --> constraining

布局

含义:

  • 确定内容的大小和位置的算法
  • 依据元素、容器、兄弟节点和内容信息来计算

相关技术

  • 常规流:行级、块级、表格布局、FlexBox、Grid布局,根元素、浮动和绝对定位的元素会脱离常规流
  • 浮动
  • 绝对定位

行级:不和其他盒子并列摆放,适用所有的盒模型属性。只包含行级盒子的容器会创建一个Inline Formatting Context (IFC)

IFC 内的排版规则:

  • 盒子在一行内水平摆放
  • 一行放不下时,换行显示
  • text-align 决定一行内盒子的水平对齐
  • vertical-align 决定一个盒子在行内的垂直对齐
  • 避开浮动(float)元素

块级:和其他行级盒子一起放在一行或拆开成多行,盒模型中的 width 和 height 不适用。某些容器会创建一个 Block Formatting Context (BFC)

BFC 内的排版规则:

  • 盒子从上到下摆放
  • 垂直 margin只合并
  • BFC 内盒子的 margin 不会与外面的合并
  • BFC 不会和浮动元素重叠

Flex Box: 可以控制子级盒子的以下内容:

  • 摆放的流向
  • 摆放顺序
  • 盒子宽度和高度
  • 水平和垂直方向的对齐
  • 是否允许折行

Grid: display 设置为 grid 使元素生成一个块级的grid容器,使用 grid-template 相关属性可以将容器划分为网格。

CSS盒子模型:(蓝色部分为内容 Content 的 width 和 height)

image.png

display属性:

  • block:块级盒子
  • inline:行级盒子
  • inline-block:本身是行级,可以放在行盒中;可以设置宽高;作为一个整体不会被拆散成多行
  • none:排版时完全被忽略