深入CSS | 青训营笔记

61 阅读4分钟

这是我参与「第四届青训营 」笔记创作活动的的第3天

CSS进阶

CSS选择器优先级

样式的优先级一般为

!import > style > id > class > 元素

在实际运用中会遇到多类选择器判断优先级的问题

优先级由A、B、C、D四个值进行判断,其中对应值计算规则如下:

  • 如果存在内联样式A为1,否则为0
  • BID选择器出现的个数;
  • C类选择器属性选择器伪类选择器出现的个数;
  • D标签选择器伪元素选择器出现的个数

将ABCD进行按顺序进行组合,组合数字最大的,优先级更高,当优先级相同时,遵循后面的优先级更高的原则。

CSS样式属性

覆盖

当样式属性相同的情况下,遵循优先级高的覆盖优先级低的,后面的覆盖前面的这个原则。

继承

某些属性会自动继承其父元素的计算值,除非显性指定一个值(使用inherit属性值来进行显式继承)。

初始值

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

CSS求值过程

74e4bd8cd4f65060e22b7f1e670687b.png

如图所示,是一个CSS的属性计算过程,其流程描述如下:

  1. HTML解析成DOM树,解析过程中将从CSS中搜集的样式放在一起组成样式规范;
  2. 对样式规范进行筛选,获得符合规则的一组声明值
  3. 按照优先级顺序选出优先值最高的属性值即层叠值
  4. 若层叠值为空,此时采用继承或使用初始值的方法得到指定值(指定值一定不为空);
  5. 将一些相对值转换为绝对值,从而获得计算值(此时,属性值之中的关键字、百分比等还没有转换);
  6. 进一步将计算值转换从而获得使用值(此时的使用值中存在小数);
  7. 将小数转换为整数,从而得到实际值

计算值和使用值的区别:单纯的分析CSS和HTML就可以得到的值即为计算值,使用者需要结合实际环境才能得到的值为使用值。继承的属性值为计算值。

布局

布局是什么

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

布局的相关技术

347dcb6afda2f3a61c2711d77b32938.png

盒模型

bf7398413e877a575d679954374b9ee.png

盒模型一共有两种,分别为content-boxborder-box,上图就是一个content-box盒模型。

这两种盒子模型都是由content + padding + border + margin组成,但是不同的是,他们的width和height的计算方式不同。

在content-box盒中,width和height只包含content;

在border-box盒中,width和height由content + padding + border组成。

需要注意的是,当width和height的值设为百分比时,其基数取决于父元素的对应属性,而当padding、margin、border取百分比的时候则基数都取决于父元素的width

盒模型的转换可以使用box-sizing属性进行转换,对应值分别为content-boxborder-box

over-flow: 溢出,取值为四种,分别为visible、hidden、scroll、auto。

行级盒子和块级盒子的区别

bf8b3b835991a6610f955b843ad74e6.png

650f6daab203dc5123696511005c9fc.png

display属性

可以通过该属性来切换块级盒子还有行级盒子 44bd5a4ccc407ae51d7cc9d129969c2.png

常规流

  • 根元素,浮动和绝对定位的元素都会脱离常规流
  • 其他元素在常规流之内(in-flow
  • 常规流中的盒子,在某种排版上下文中参与布局

87869ac161b017d52123af56152ec53.png

126a72dde96ef8ce265d9819b8846b0.png

406531bfbc32fc341ea86c4557e3887.png

16d2210f0fe5ea9023a2cd0a5b8b6d2.png

Flex Box

  • 一种新的排版上下文
  • 它可以控制子级盒子的:
    • 摆放流向(⬅➡⬆⬇)
    • 摆放顺序
    • 盒子宽度和高度
    • 水平和垂直方向的对齐
    • 是否允许折行

568d3f9fcdf09f1c1136901e4933b0f.png

justify-content

f35957d45273e58bc40478464e46913.png

align-items

0f7153f9ec2dfb1b16d0dca62cfd442.png

align-self

4472448848947f306632427f47e3597.png

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

45c2038d4361caf9f6dd924e9c53efe.png

Grid布局

6772604b7053dc03c5f3d74d7798c59.png

position

static:默认值,非定位元素。

relative:在常规文档流中布局,相对于自己本来的位置进行偏移,使用top、left等进行偏移,流内其他元素当它没有偏移一样布局。

absolute:脱离文档流,相对于最近的非static祖先定位,不会对流内元素布局造成影响。

fixed:脱离文档流,位置总是相对于视口固定。

sticky:粘性布局,元素首先会被相对定位,直到在视口中遇到给定的偏移值为止,之后固定在适合的位置。