深入CSS | 青训营

66 阅读4分钟

选择器的特异度

用于决定声明冲突时哪个声明优先级更高

特异度考虑以下四个因素,按照从低到高的顺序:

  1. 通配选择器 (*) 的特异度为 0
  2. 元素(标签)选择器 的特异度为 1 (例如 div)
  3. 类选择器 的特异度为 10 (例如 .class)
  4. ID 选择器 的特异度为 100 (例如 #id)
  5. 内联样式 的特异度为 1000
  6. !important 声明的特异度最高,覆盖一切规则

另外,相同特异度的情况下,源代码顺序在后的声明会覆盖前面的声明。

所以通常 ID 选择器 > 类选择器 > 元素选择器,越具体的选择器特异度越高,这样可以实现对CSS样式的精确控制。

继承

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

文字相关(如color,font-size)的可以继承,宽度不能继承

显式继承

* {  
box-sizing: inherit;  
/*box-sizing本身是不可继承的属性*/  
/*这里通过inherit关键字使得原本不可继承的属性变得可继承*/  
}  
  
html {  
box-sizing: border-box;  
}  
  
.some-widget {  
box-sizing: content-box;  
}
  • 首先,box-sizing: inherit; 在html元素上设置盒模型为inherit。
  • 然后,box-sizing: border-box; 在全局(html)设置盒模型为border-box。
  • 最后,.some-widget 选择器指定某个元素使用content-box盒模型。

这样设置可以使大部分元素采用border-box盒模型从而更方便布局,同时也可以通过单独指定来实现需要content-box盒模型的效果。

初始值

  • CSS中,每个属性都有一个初始值
    • background-color 的初始值为 transparent
    • margin-left 的初始值为 0
  • 可以使用 initial 关键字显式重置为初始值
    • background-color : initial

CSS求值过程

image.jpg

image.jpg

image.jpg

子元素继承的是父元素的计算值

布局 Layout

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

  • 常规流

元素按照 HTML 的顺序依次垂直排列,块级元素独占一行,行内元素排在一起。这是元素的默认定位方式。

  • 浮动

元素使用 floa t属性脱离常规流,向左或右浮动,直到碰到父元素边界或另一个浮动元素。常用于图片文字混排等布局。

  • 绝对定位

元素使用 absolute 或 fixed 定义绝对定位,使元素脱离常规流,相对于最近的已定位祖先元素进行定位。可以重叠其他元素。


盒模型

image.jpg

  • width
  • height
  • padding
  • 指定元素四个方向的边距
  • 百分数相对于容器的宽度
  • border

指定容器边框样式、粗细和颜色

  • 三种属性
    border-width
    border-style
    border-color
  • 四个方向
    border-top
    border-right
    border-bottom
    border-left
  • margin
  • 指定元素四个方向的外边距
  • 取值可以是长度、百分数、auto(水平居中)
  • 百分数相对于容器宽度
  • margin collapse
    垂直方向上,取两个块的 margin 边距中的最大的一个

  • border-box
    包含 border 和 padding 的宽度

  • overflow
    控制溢出的部分

块级 vs 行级

块级行级
不和其他盒子并列摆放和其他行级盒子一起放在一行或者拆开成多行
适合所有的盒模型属性和模型中的width、height不适用
块级元素行级元素
body、article、div、main、section、h1-6、p、ul、li、display:blockspan、em、strong、cite、code、display:inline

Inline-block
本身是行级,可以放在行盒中;可以设置宽高;
作为一个整体不会被拆散成多行

行级排版上下文

Inline Formatting Context

IFC排版规则

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

块级排版上下文

Block Formatting Context

BFC排版规则

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

Flex Box

  • 一种新的排版上下文
  • 它可以控制自己盒子的
  • 摆放的流向
  • 摆放顺序
  • 盒子的宽高
  • 水平和垂直方向的对齐
  • 是否允许折行

主轴:justify-content
侧轴:alien-items

Flexibility

  • 可以设置子项的弹性: 当容器有剩余空间时,会伸展;容器空间不够时,会收缩。
  • flex-grow 有剩余空间时的伸展能力
  • flex-shrink 容器空间不足时收缩的能力
  • flex-basis 没有伸展或收缩时的基础长度

Grid

image.jpg

image.jpg

Position 属性

  • static 默认值,非定位元素
  • relative 相对自身原本位置偏移,不脱离文档流
  • absolute 绝对定位,相对于最近的非 static 祖先元素定位
  • fixed 相对于视口绝对定位