深入CSS | 青训营笔记

92 阅读6分钟

这是我参与「第四届青训营」笔记创作活动的第11天,学习内容为《深入CSS》

1. CSS优先级:

根据特异度

# id > 伪类 > 标签
 100   10     1

2. 继承

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

2.1 显示继承

有些元素不可继承

这就要使用 inherit

* {
  box-sizing: inherit;
}
​
html {
  box-sizing: border-box;
}
​
.some-widget {
  box-sizing: content-box;
}

2.2 初始值

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

  • background-color 的初始值为 transparent
  • margin-left 的初始值为 0

可以使用 initial 关键字显式重置为初始值

  • background-color: initial

3. CSS求值过程

每一个元素我在寻找一个特定的属性时,就需要经历这么一个长的过程

resolve : 还有图片相对路径转成绝对路径

formatting之后:init,inherit,60%这些进行转换

计算值:浏览器拿到的,我通过分析css,我就知道你这个font-szie是多少的。

但是又一些情况,你单纯拿到css和背景图等,你算不出来,只能在formatting阶段进行。

比如宽度100%,这种实际布局的时候在能够计算的。

继承父亲的计算值:不仅仅是父亲设置的值,还有行高等

4. 布局相关技术

4.1 常规流

行级 块级 表格布局 FlexBox Grid布局

盒子模型

margin - border - padding - content (width - height)

4.2 width
  • 指定 content box 宽度
  • 取值为长度、百分数、auto
  • auto 由浏览器根据其它属性确定
  • 百分数相对于容器的 content box 宽度
4.3 height
  • 指定 content box 高度
  • 取值为长度、百分数、auto
  • auto 取值由内容计算得来
  • 百分数相对于容器的 content box 高度
  • 容器有指定的高度时,百分数才生效
4.4 padding
  • 指定元素四个方向的内边距(上右左下))
  • 百分数相对于容器宽度
4.5 border
  • 三种属性

    • border-width
    • border-style
    • border-color
  • 四个方向

    • border-top
    • boder-right
    • border-bottom
    • border-left
border: 1px solid #ccc;
​
border-left: 1px solid #ccc;
border-right: 2px dotted red;
​
border-width: 1px 2px 3px 4px;
border-style: solid;
border-color: green blue;
​
border-left-width: 3px;
border-top-color: #f00;
4.6 margin
  • 指定元素四个方向的外边距
  • 取值可以是长度、百分数、auto
  • 百分数相对于容器宽度
4.7 使用 margin:auto 水平居中
4.8 margin collapse

margin在垂直方向上会塌陷 合并:只会取一个较大的

如果不需要的话,可以创建BFC

4.9 box-sizing: border-box

Content-box算的是content的width和hegith

如果是box,那就是包括了border+content的宽高

5. overflow

scroll visitable hidden

5.1 块级 vs. 行级

下面是css的概念

Block Level BoxInline Level Box
不和其它盒子并列摆放和其它行级盒子一起放在一行或拆开成多行
适用所有的盒模型属性盒模型中的width、height不适用

下面是HTML的概念

块级元素行级元素
生成块级盒子- 生成行级盒子 - 内容分散在多个行盒 (line box) 中
body、article、div、main、section、h1-6、p、ul、li 等span、em、strong、cite、code 等
display: blockdisplay: inline

5.2 display 属性

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

5.3 常规流 Normal Flow

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

5.4 行级排版上下文

一行放不下,就换行。

  • Inline Formatting Context (IFC)

  • 只包含行级盒子的容器会创建一个IFC

  • IFC 内的排版规则

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

5.5 overflow-wrap: break-word 太长单词可以换行

5.6 块级排版上下文

  • Block Formatting Context (BFC)

  • 某些容器会创建一个BFC

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

    BFC 内的排版规则

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

行级:从左到右 块级:从上到下

都有:遇到块级,就换行

5.7 QA:

1、水印思路:整个页面上 去盖一个半透明的水印层,这个水印层 可以 去 重叠地去显示一些文字,但是这个水印层不会影响页面的一个交互。可以通过 css里pointer-event,来忽略水印层的鼠标事件。

2、tailwind、unocss等相比传统CSS工程化有什么优势

组件化地开发优势

3、响应式布局

rem这个方案,如果是从手机适配到电脑,宽方位的 用到 medium等

4、预处理器

5.8 Flex Box 是什么?

  • 一种新的排版上下文

  • 它可以控制子级盒子的:

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

6. Flexibility

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

6.1 flex

flex: 1flex-grow: 1
flex: 100pxflex-basis: 100px
flex: 2 1flex-grow: 2; flex-shrink: 1
flex: 1 100pxflex-grow: 1; flex-basis: 100px
flex: 2 0 100pxflex-grow: 2; flex-shrink: 0; flex-basis: 100px
flex: autoflex: 1 1 auto
flex: noneflex: 0 0 auto

6.2 Flex Box VS Grid 这个更重要

6.3 浮动

6.4 Float 浮动性现在不是很重要

Position属性

relative: 想对自身原本位偏移,不脱离文档流

Absolute 绝对定位,相对非static祖先元素定位

static 默认值,非定位元素

fixed 相对于视口绝对定位 还有一个粘性定位,stick

6.5 绝对定位

MDN

回流重绘

先通过layout算出来每个元素的宽高

在进行一个绘制,颜色,边框

重排 relayout 因为js,改变了元素的布局高度,layout就得重新触发

改了color,不会影响位置,就不用回流,就直接重绘就好

transclate gpu 3D

为什么获取元素的一些位置属性,如offsetTop会引起重排

浏览器内部的原因

之前老问css局中?

flex或者grid就很容易实现

CSS Sprites

优化的技巧,用的也不多了