深入CSS | 青训营笔记

88 阅读4分钟

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

一、CSS规则生效顺序

1. 选择器特异度

40104b07e03bbdab23cba391acb4848.jpg

特殊的会覆盖普通的。

2. 继承

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

3. 显示继承

某些属性不能从父级继承,但是还要显示和父级相同的话,用inherit定义。

4. 初始值

  • CSS中,每个属性都有一个初始值

   background-color的初始值为transparent

   margin-left的初始值为0

  • 可以使用Initial关键字显示重置为初始值

   background-color : initial

二、CSS求值过程

首先DOM树中链接样式规则,接着进入filtering对应用到该页面的规则可用选择器匹配、属性有效、符合当前media等进行筛选;一个元素的某个属性可能有0到对个声明值(declared values),例如p {font-size : 16px}和p.text {font-size : 1.2em};接下来进入层叠过程(cascading),按照来源、limportant、选择器特异性、书写顺序等选出优先级最高的一个属性值,即层叠值(cascaded value),例如.1.2em;然后进入defaulting过程,当层叠值为空的时候继承或为初始值,经过cascading和defaulting之后,保证指定值(specified value)一定不为空;经过转化(resolving)将一些相对值或者关键字转化为绝对值,例如em转化为px,相对路径转为绝对路径,得到计算值(computed value)一般的,浏览器会在不进行实际布局的情况下所能得到的最具体的值;之后将计算值进一步转换(formatting),例如关键字、百分比等都转为绝对值,得到使用值(used value)进行实际布局时使用的值,不会再有相对值或关键字;之后经过constraining将小数像素值转化为整数,得到渲染时实际生效的值,即实际值。

三、盒子模型

1. 布局(layout):一维的

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

2. 布局相关技术

  • 常规流(文档流)

行级

块级

表格布局

Flex Box

Grid布局

  • 浮动
  • 绝对定位

3. 标准盒子模型

image.png

3.1 content 内容:盒子的内容,显示文本和图像。
  1. width:
  •   指定content box宽度
  •   取值为长度、百分数、auto
  • auto由浏览器根据其它属性确定
  •   百分数相对容器的content box宽度
  1. height:
  • 指定content box高度
  • 取值为长度、百分数、auto
  • auto取值由内容计算得来
  • 百分数相对容器的content box高度
  • 容器由指定的高度时,百分数才生效
3.2  padding内边距:清楚内容周围的区域,内边距是透明的。
  •   指定元素四个方向的内边
  •   百分数相对于容器宽度
3.3  border 边框:围绕在内边距和内容外的边框,有样式、粗细和颜色。
  • 三种属性:border-width、border-style、border-color
  • 四个方向:border-top、border-right、border-bottom、border-left
3.4  margin 外边距:清除边框外的区域,外边距是透明的。
  •  指定元素四个方向的外边距
  • 取值为长度、百分数、auto
  •  百分数相对于容器宽度

4. 盒子模型的布局规则

4.1块级和行级

image.png 块级上下排列,行级左右排列。行级上下文会根据内容长度自动换行,但遇到长单词无法拆分换行时,可以使用overflow-wrap : break-word ; 对长单词进行拆分换行。

4.2块级和行级的区别

在常规流中,一个子集的盒子只能都是块级的盒子或者都是行级的盒子。如果一个盒子里既有块级的盒子又有行级的盒子,这是浏览器会创建两个匿名的(不是在html中写的,DOM树中看不到)块级盒子包裹文字,进行排版。

5. 布局grid:二维的

  • display:grid使元素生成一个块级的Grid容器
  • 使用grid-template相关属性将容器划分为网格
  • 设置每一个子项占哪些行/列
5.1划分网格

grid-template-columns:100px 100px 200px; grid-template-rows:100px 100px grid-template-columns:30% 30% auto; grid-template-rows:100px auto grid-template-columns:100px 1fr 1fr; grid-template-rows:100px 1fr

5.2网格线:可以通过线的标号表示线

image.png

总结与思考

通过深入CSS的学习,更加深入的理解了CSS,对CSS的学习保持不断持续的学习,CSS的新特性还在不断出现,反思自己了解的CSS的皮毛就搁置的行为,今后要像老师说的那样保持好奇心,善用浏览器的开发者工具,充分利用MDN和W3C CSS规范,真正学扎实CSS。