7. 理解CSS | 青训营笔记

167 阅读7分钟

00_CSS简要发展历史

CSS3之前所说的规范都是2.1,CSS3及之后的规范集合在习惯上都称为CSS3 image.png

image.png

01 基础知识

层叠cascading规则、选择器优先级

层叠-接轨规则声明之间的规则

层叠三大规则:

优先度最高-样式表来源

image.png

优先度其次-选择器的优先级

选择器的类型:

image.png 选择器优先级:

image.png

优先级最次-源码位置

谁先声明的谁生效

一个比较好的代码规范:

  • 选择器尽量少用id
  • 尽量不要用!important,后面再设置会无效
  • 自己的样式要加载在引用库样式的后面

继承

image.png 大部分具有继承特性的属性和文本相关: image.png 还有少部分列表、表格的属性 可以使用inherit关键字显式指定一个属性值从其父元素继承

值和单位

image.png image.png

盒模型

image.png image.png image.png 负margin不推荐使用,会导致可读性和复杂度提高

image.png

02 布局和定位

常规流

任意盒子的display:

  • 外部显示类型(display-outside):规定了该盒子如何与同一格式上下文中的其他元素一起显示
  • 内部显示类型(display-inside):规定了该盒子内部的布局方式。比如display: flex;其外部显示是block,参与 BFC;display: inline-flex,则外部显示是inline,参与IFC。他们内部的盒子都参与弹性盒子布局。 image.png 概念:
  • BFC(Block Formatting Context)为 块级格式化上下文
  • IFC(Inline Formatting Contexts)为 内联格式化上下文,IFC 的 line box(框)高度由其包含行内元素中最高的实际高度计算而来(不受到竖直方向的 padding/margin 影响)。

块级格式化上下文

格式上下文的布局规范为:

在一个块格式区域中,盒子会从包含块的顶部开始,按序垂直排列。同级盒子间的垂直距离会由“margin”属性决定。相邻两个块级盒子之间的垂直间距会遵循外边距折叠原则被折叠。在一个块格式区域中,每个盒子的左外边缘会与包含块左边缘重合(如果是从右到左的排版顺序则盒子的右外边缘与包含块右边缘重合)。

BFC本身是block formatting context的缩写,是一种格式规范。

如果说一个盒子是BFC或者有BFC特性,那么BFC表示的是block formatting context root。不管它外部显示类型是什么,但是它的内部显示类型是flow-root,其实就是这个盒子内部形成了一个新的块级格式化上下文。BFC具有一定的沙盒特性。

如何触发一个盒子的BFC特性? 以下条件满足任何一个即可

  • display: flow-root 、 inline-block;
  • position: absolute 、 fixed:
  • float:不为none;
  • overflow:不为 visible

外边距塌陷

image.png

image.png

内联级格式化上下文

在内联格式区域中,盒子会从包含块的顶部开始,按序水平排列。只有水平外边距、边框和内边距会被保留。这些盒子可以以不同的方式在垂直方向上对齐:可以底部对齐或顶部对其,或者按文字底部进行对齐。我们把包含一串盒子的矩形区域称为一个线条框。 (The rectangular area thatcontains the boxes that form a line is called a line box.)

image.png

实际用例:

  1. 单行文字垂直居中,利用line-height=盒子高度的垂直居中特性
  2. 文字和icon垂直对齐。利用了line box中计算高度的原理和vertical-align的设置,垂直对齐,但不是完全垂直居中。如果设置父元素font-size:0,基线和中线重叠,则居中对齐

Flex弹性盒子-一维空间布局

Flexible BoxLayout 是为了提供更加高效灵活的布局方式,在即便是宽高未知的情况下,也能排列和分割一个盒子内部的布局。而且在不同布局方向(横向/纵向)调整更为灵活。 image.png

弹性盒子的相关属性:

image.png

弹性盒子布局的例子: image.png

image.png

Grid网格布局-二维空间布局

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

image.png

image.png

网格布局示例

image.png

使用策略

Flex

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

Grid

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

Grid for layout, Flexbox for components

  • 1.大面积或整体布局 推荐使用Grid
  • 2.小面积或组件中,或Grid ltem内中可以使用Flex做灵活布局

Multicol多列布局

定位

为了我们可以在文档流的基础上,让元素移动,做出更多灵活的改变。当position属性的取值非static的时候,可以使用 top,right, bottom,left 对其进行定位

relative

元素相对于自己原来在文档流中的位置进行定位,但是原来文档流的空间还在。

image.png

absolute

元素被移出正常文档流,且没有预留空间,相对于最近的非static定位祖先元素的进行定位 image.png

fixed

元素被移出正常文档流,且没有预留空间,相对于屏幕视口进行定位,屏幕滚动也不会改变位置

image.png

sticky

元素相对它的最近滚动祖先(祖先的overflow是scroll/hidden/auto) 的视口(scrollport)定位 image.png

03 层叠上下文 the stacking context

层叠上下文是对HTML元素的三维构想,将元素沿着垂真屏幕的虚构的Z轴排开

image.png

形成新的层叠上下文的条件(任一即可)

CSS3之前·········

  • position:relative 或 absolute;并且 z-index 不是auto
  • position: fixed 或 sticky

CSS3之后.........

  • flex或 grid 的子元素;并且z-index 不是auto
  • opacity 的值小于 1
  • transform 的值不为 none
  • will-change的值不为 通用值
  • 详见规范.....

每个元素都有一个层叠水平 层叠上下文就是对层叠水平进行排序

image.png

image.png

image.png

如果z-index=0,则说明创建了个新的层叠上下文,其子元素也无法超越父元素(z-index=0)的层叠水平,这与z-index=auto不同

编写z-index的建议:

  1. 使用css变量或者预处理语言的变量,管理z-index的值
  2. 将预设间隔设置10或100,方便后续的插入

04 变形、过渡、动画

transform 变形

2D 相关属性

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

3D 相关属性

  • transform: translate3d 、rotate3d、scale3d、matrix3d等
  • transform-origin: right top、50px 30px 等表示变形时依据的原点
  • transform-style:flat 或 preserve-3d 看子元素的3d表现
  • perspective:观看点距离z=0这个平面的距离,可以在transform中用perspective()使用作用为当前元素,也可以直接使用,给后代元素一个统一值
  • perspective-origin: 观看者的位置,如 top、 bottom等
  • backface-visibility: 元素正面只有朝向观察者的时候可见

image.png

image.png

transition过渡

通过指定某些元素属性从一种起始状态,在一段时间内以某种变化节奏,过渡到终止状态

image.png 其中timing-function 一般有三种用法: 线性(linear)、贝塞尔曲线(cubic-bezier 或 ease-in等)、阶跃(step)

animation

image.png

image.png

image.png

如何写动画性能更好?

  1. 尽量不用触发reflow的属性
  2. 在遇到性能问题时可以触发硬件加速,比如设置will-change属性、设置transform3d等
  3. 尽量使用transform 和opacity 去写动画

05 响应式设计

应遵循的原则

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

06 CSS生态相关