深入CSS|青训营笔记

77 阅读5分钟

第三天的CSS笔记,整理了一下自己不是特别熟悉的部分,特别是CSS的求值部分。

选择器的特异度(Specificity)

特异度也称优先级 。下面列表中,选择器类型的优先级是递增的:

  1. 继承或者通配符选择器——0,0,0,0
  2. 元素选择器——0,0,0,1
  3. 类选择器、伪类选择器——0,0,1,0
  4. ID选择器——0,1,0,0
  5. 行内样式——1,0,0,0
  6. !important——无穷大

优先级注意点:权值是由4组数字组成,但是不会有进位

继承

某些属性会自动继承其父元素的计算值,除非显示指定一个值。有些属性就是不能继承的,我们可以显式继承 如果从一个元素一层一层往上找,还是没有找到有一个CSS来指定这个值,或者说是可继承的但是一层一层都没有继承到。这个情况就要用到初始值的概念。

初始值

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

CSS求值过程

首先浏览器拿到会对HTML进行一个解析,解析成一个树,那同样的在解析的过程中,我们会发现一些link或者style的样式,把样式也收集起来,都放在一起叫样式规则。

接下来浏览器要做的一件事情是为了布局或者渲染这个页面,他,需要去找到页面上每一个元素对应的每一个CSS属性的值,就要遍历到所有的元素,这个流程描述的是每一个元素,它的就是我在寻找一个特定的一个CSS属性首先筛选这些规则,比如说选择器是不是匹配。选择出来能够匹配到的值,叫做声明值,声明值是一组一个元素的某个属性可能有0个或者多个声明值。

两个声明值最终决定用哪一个呢?这个就要cascading来决定,这会有一个优先级的样式。按照来源,选择器特异性,书写顺序等等选择出一个优先级最高的一个属性值。这个被选出来的值就是层叠值。

有些时候层叠值是空的,那么就会继承或者使用初始值。总是能得到一个值的,但是这个值不能直接浏览器进行渲染,所以会进一步做转换,比如把em转化为px,相对路径转化为绝对路径。但不是所有的相对值会转化为绝对值。但是这个时候也不能直接用,有些情况下经过转化以后,有些东西是没有办法渲染的,比如是0.2px,这个时候只能四舍五入。

0892134e6f510af31504ef2c7d94d8c.png

布局(Layout)是什么?

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

布局相关技术有三种,一种是常规流,一种是浮动还有一种是绝对定位。 在常规流里面又存在很多不同的布局方式:行级、块级、表格布局、FlexBox布局、Grid布局。

默认情况下我们指定盒子的高度宽度指定的是盒子的内容,如果还要指定paddingmarginborder那就要在这个内容的基础上去扩展。宽度和高度的取值是数值、百分数和auto,容器有指定的高度时,百分数才生效。padding是指定元素四个方向的内边距,百分数相对于容器宽度,值按照顺时针的顺序。border是边框,指定容器边框样式、粗细和颜色,可以利用边框的特性来设置特殊的三角形。margin指定元素四个方向的外边距,取值可以是长度、百分数、aotu,百分数同样是相对于容器宽度。可以利用margin: auto来水平居中。外边距会出现外边距合并的情况,外边距只会取排版中外边距大一些的那个。

但如果盒子是border-box,那么设置的宽和高是包括了paddingborder。在一般情况下是使用border-box

块级:不和其他盒子并列摆放,适用所有的盒模型属性。块级元素生成块级盒子。

行级:和其他行级盒子一起放在一行或拆开多行,盒模型中的widthheight不适用。行级元素生成行级盒子,行级盒子并列排在行盒里。

行级排版上下文(IFC)只包含行级盒子的容器会创建一个IFC。 IFC内的排版规则:

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

块级排版上下文件(BFC),某些容器会创建一个BFC:

  • 根元素
  • 浮动、绝对定位、inline-block
  • Flex子项和Gird子项
  • overflow值不是visible的块和
  • display: flow-root;

BFC内的排版规则:

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

Flex Box是什么?

一种新的排版上下文,它可以控制子级盒子的:

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

display: grid

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

几天的课下来,我发现其实课程主要作用还是帮大家整理复习,构建系统的知识结构,对于自己不够熟悉的地方老师是不会过多停留的,需要我们自己在课外进行拓展学习。