理解CSS | 青训营笔记

96 阅读5分钟

重点内容:

  • 基础
  • 布局和定位
  • 层叠上下文
  • 变形、过渡、动画
  • 响应式设计
  • CSS 生态相关

详细知识点介绍:

层叠优先级:

层叠三大规则(优先程度递减):

1. 样式表来源

2. 选择器优先级:

  • 内联样式不属于选择器
  • :is() :not() :has() 本身不计入优先级,以参数中最高的优先级为准,:where() 优先级为0

3. 源码位置

  1. 对于 @import 的样式,根据 @import 的顺序
  2. 对于 link 和 style 标签的样式,根据在 document 中的顺序决定

层叠概念 引申出的 good practice:

  1. 选择器尽量少用 id
  2. 尽量不要用 !important
  3. 自己的样式要加载在引用库样式的后面

继承:

  • 大部分具有继承特性的属性跟文本相关
  • 可以使用 inherit 关键字显式指定一个属性值从其父元素继承

盒模型:

浏览器根据视觉格式化模型,将所有元素表示为盒子模型,css 通过盒模型做 layout

布局:

Normal Flow常规流:

默认的布局方式:块级格式化上下文和内联格式化上下文

Float 浮动流:

用 float 属性控制脱流,做横向布局

Positioning 定位流:

用 Position 属性控制,fixed 和 aboulute 脱离文档流可以自由定位、覆盖

  1. relative:元素相对于自己原来在文档流中的位置进行定位,但原来文档流的空间还在
  2. absolute:元素被移出正常文档流,且没有预留空间,相对于最近的非 static 定位祖先元素的进行定位
  3. fixed:元素被移出正常文档流,且没有预留空间,相对于屏幕视口进行定位,屏幕滚动也不会改变位置
  4. sticky:元素相对于它的最近滚动祖先的视口进行定位

Flex 弹性盒子布局:

为了提供更高效、灵活的布局方式,在即便是宽高未知的情况下,也能排列和分割一个盒子内部的布局。而且在不同布局方向的调整更为灵活

Grid 网格布局:

2017年推出,可以定义由行和列组成的二维布局,然后将元素放置到网格中。元素可以只占其中一个单元格,也可以占据多行或多列

Flex 弹性盒子布局 与 Grid 网格布局 对比:

Flex:

  1. 一维布局
  2. 基于内容
  3. 浏览器兼容性更好

Grid:

  1. 二维布局
  2. 基于布局
  3. 2017年后的浏览器版本普遍支持

大面积或整体布局,推荐使用 Grid,小面积 或 组件中,或 Grid item 中可以使用 Flex 做灵活布局

层叠上下文:

层叠上下文是对 HTML 元素的三维构想,将元素沿着垂直屏幕的虚构的 Z 轴排开,层叠顺序不仅指不同的层叠上下文的顺序,同一个层叠上下文内,元素间也有顺序

  • z-index 只在同一个层叠上下文内比较
  • 子元素的 z-index 无法超越父元素的 z-index 显示顺序

transform 变形:

2D 相关属性

  • transform:translate(移动)、rotate(旋转)、scale(缩放)等
  • transform-origin:right top、center等,表示变形时依据的原点

3D 相关属性

  • transform:translate3d、rotate3d、scale3d等
  • transform-origin:right top、50px、30px等,表示变形时依据的原点
  • transform-style: flat 或 preserve-3d 看子元素的3d表现
  • perspective:观看点距离 z=0 这个平面的距离
  • perspective-origin:观看者的位置
  • backface-visibility:元素正面只有朝向观察者的时候可见

animation 动画:

  • @keyframes 关键帧 用来定义动画过程中出现的关键字样
  • animation 相关属性 用来为元素添加动画

如何让动画性能更好

  1. 尽量不用触发 reflow 的属性
  2. 遇到性能问题时可以触发硬件加速
  3. 尽量使用 transform 和 opacity 去写动画

响应式设计:

遵循原则:

  • 优先选用流式布局,如百分比、flex等
  • 使用响应式图片,匹配尺寸,节省宽带
  • 使用媒体查询为不同的设备类型做适配
  • 给移动端设备设置简单、统一的视口
  • 使用相对长度,em、rem、vw 作为长度度量

使用媒体查询的 tips:

  1. 媒体查询遵循 cascading 层叠覆盖原则,min- 和 max- 选择一个
  2. 由于设备的多样化逐渐不可枚举,断点的选择尽量根据内容选择
  3. 由于断点的增加会增加样式处理的复杂度,所以尽量减少断点

CSS 预处理器:

如何提高研发效率:

  • 自定义变量: 提高可复用
  • 嵌套、作用域: 避免全局污染、结构层次清晰、减少复杂组合选择器
  • mixins、继承:提高可复用、可维护性
  • 操作符、条件/循环语句、自定义函数: 提高可编程能力、增加灵活性

CSS 模块化:

CSS Modole 是为解决全局污染而出现的方案,解决CSS全局污染、本质上是保证样式集合对应的选择器是唯一的。
从这个角度看,主流的单纯针对于防止全局污染的方案大概有:

  • BEM 命名规范
  • vue-loader 的 scoped 方案
  • CSS Modules