理解CSS
- 大约3700+字符
- 需要背景知识:熟悉CSS
- 参考
课程介绍
- CSS发展简史
- 课程范围
- 课程目录
01 基础知识
层叠 优先级
-
样层叠概念
-
样式表是规则声明的集合
-
集合产生冲突
-
为了解决冲突,引入层叠概念
-
-
层叠的三大规则 优先度递减
- 样式表来源
- 选择器优先级
- 源码位置
-
样式表来源 重要性递增
- 用户代理样式 浏览器默认样式
- 用户样式表 很少有
- 作者样式表 开发者写的
- 作者样式表中的 !important
- 用户样式表中的 !important
- 用户代理样式表中的 !important
选择器
- 选择器列举与优先级
- 如果元素的两个样式计算出的优先级大小相同,则谁在后谁优先,需要注意,这个顺序是声明的顺序,而不是调用的顺序。
- 右层叠概念引出的CSS代码的 good practice
- 选择器少用 id,id级别过高,不利于后续覆盖
- 计量不要用 !important ,不利于覆盖与扩展
- 自己的样式加载在引用样式库样式的后面,使得自己的样式生效
继承
-
大部分具有继承特性的属性与文本相关,不是所有的属性都有继承属性
-
继承方向同意都是从父元素到子元素
-
可以使用inherit关键字显式地指定一个属性值从父元素继承
-
例子:在父元素div中制定了 font-size ,在子元素中使用inherit关键字显式指定子元素的字体大小是继承父元素的
CSS的值和单位
- 单位部分在响应式设计中详细展开
- 具体建议查看手册
盒模型
- 视觉格式化模型 - CSS:层叠样式表 | MDN (mozilla.org)
- 盒模型是视觉格式化模型的基础
- 例子
盒模型-负margin
- 在盒模型各个参数中,padding border margin 中,只有margin可以设置为负值
- 上面例子中,左侧会导致当前元素联通后面的元素一起上移,右边的例子改变 margin-bottom,会导致后面的元素上移50
02 布局
概述
常规流布局
-
常规流包含 块级格式化上下文与内联格式化上下文
- BFC默认占满一行
- IFC占据自身长度需要的空间
-
任意盒子都有外部显示类型与内部显示类型
- 常规流中的盒子外部显示类型只有 BFC与IFC
-
下图中的文本内容,如果外部没有显式的BFC包裹,是否参与到BFC布局中?
- CSS 会强制生成一个盒子,包裹这段文本(IFC),匿名盒子内部采用IFC,外部采用BFC
块级格式化上下文(block formatting context)
- 平时说的BFC,指的是 BFC root ,内部屏蔽外部,这个BFC元素是内部元素的root
外边距塌陷
- 外边距塌陷情况与解决方法
内联格式化上下文
- 相比于 BFC 更加复杂,主要介绍 Line box
- 最关键的内容在于 line box的高度为 位置最高元素的顶部与位置最低元素的底部之间的距离
- vertical-align 决定是的是内部元素的位置而不是高度
- 右侧示例中,上面,x下部为baseline,整个line-box的顶部是粉色的顶部,底部是青色的底部;下面使用 vertical-align:middle之后,line-box的baseline上移了半个x的高度,注意上移之后,line-box内部元素的最低位置发生了变化,因而line-box的高度发生了变化
- 关于vertical-align:middle的理解_vertical-align: middle;_流唸的博客-CSDN博客 这个文章中说清楚了
- 1.该属性定义行内元素的基线相对于
该元素所在行的基线的垂直对齐。
2.vertical-align:middle是将元素盒子的垂直中点和父盒子的baseline加上父盒子的x-height的一半对齐。
(注意字母x的关键作用)
- 1.该属性定义行内元素的基线相对于
- 一些例子
- 上图左侧:直接设置line-height,一般来说无需设置height,内部元素会将外部的元素撑开。line-height本身垂直居中
- 上图右侧:演示如何将icon与内容文本垂直对中,设置 icon与文本内容的 vertical-align:middle ,若不行,将父元素的 font-size:0,使得父元素的中线与基线对齐
弹性盒子布局
-
弹性盒子 布局 属于一维布局方式
-
作用父元素时,父元素内部所有元素的排列规则;作用在子元素时,只针对当前的子元素
-
一些例子
- 左侧:省略过长文件名但是展示文件后缀,将文件名与后缀分离开来,然后将文件名设置弹性布局,溢出隐藏
- 右侧,展示骰子,其中关键的点右:注意flex属于一维布局方式,当二维布局时,使用分层的div包含,另外注意一些特有的属性。
grid 属性
-
fr 表示 fraction 剩余
-
父元素用于定义行列
-
子元素用于定义当前子元素占据的位置
-
例子
- 上述左边代码:grid在使用之前需要先定义好布局,使用repeat快速布局,使用 areas 为占据的位置进行命名
- 左下代码展示如何规定元素所占据的areas
- 在右侧展示如何使用绑定的命名设置元素的样式
Grid 与 Flex 布局策略对比
定位 position
- 上面的内容很详细,不再补充
- 例子- 页面对话框
03 层叠上下文 The stacking context
- 层叠上下文时对HTML元素的三维构想,将元素沿着垂直屏幕的虚构的z轴排开
- 一个新的层叠上下文渲染时对应一个浏览器渲染时的render layer
- 形成层叠上下文的条件 任一
- 层叠顺序
- 子元素zindex不能超越父元素的zindex显示顺序
- 上述 100的元素还是在10之下
- 注意:
position:relative|absolute;
后使用z-index:0
与使用z-index:auto
是不一样的,前者会导致内部的子元素zindex不能超过父元素
- zindex编写建议
04 变形、过渡、动画
transform 2D
transform 3D
- 可与用于制作骰子
transition
例子
- 使用贝塞尔曲线可以使动画效果更加真实
- 使用阶跃可以做出来 定格动画 打字效果之类的动画
animation
- animation 相对于 transition 的好处是,transition只能定义开始和结束帧,animation可以定义中间的很多帧
- 例子 Animate.css | A cross-browser library of CSS animations.
上述三者性能
05 响应式设计
- 响应式设计原则
- 媒体查询
- 相对长度
- 绝对长度与视口
响应式设计的原则
- 优先选择使用流式布局,如百分比、flex、grid等等
- 使用响应式图片、匹配尺寸、节省带宽
- 使用 媒体查询 为不同的设备类型做适配
- 给移动端设备设置简单、统一的接口
- 使用相对长度、em、re、m、vw作为长度度量
媒体查询
- 媒体查询:作为流式布局实在没有办法解决问题时的最后一种手段使用
- 上述tips解释
- min- max-选择一个,依次排列,方便插入断点
设备像素、参考像素、移动设备视口
设备像素
- 物理像素,硬件固定的
DPI PPI
- 在描述设备的时候,这两个是同一个概念
- 简而言之,就是设备像素/物理像素的一个度量单位
CSS像素
- CSS像素的定义在规范中定义比较模糊,本质上是为了让人眼在一定距离下的感受是一样的
- 但是由于硬件不断升级,存在给同一个设备类型写的CSS,由于硬件的ppi/dpi不断升级,结果图片之类的显示的越来越小的问题,这个问题的解决,需要 DPR 设备像素比
DPR 设备像素比
- 设备会给出DPR,在渲染时会直接乘上(应该是这个意思
移动端的 viewport
相对长度的使用
em
- 一般不在 font-size 使用,因为多重嵌套很难计算
rem
- 相对根元素字体大小,不存在嵌套问题,所以适合于响应式设计
vw vh
- 天生 1% ,原理于rem一致
06 CSS生态相关
- 由于CSS可编程性比较差,所以衍生出了一堆用于辅助设计与提高效率的工具
语言增强
- 预处理器
- 后处理器
预处理器
-
发展领域特定语言,然后采用预处理器将领域特定语言编写的代码解析为CSS
-
预处理器的基本内容
-
常见预处理器对比
后处理器
-
编写CSS中,真实使用的CSS代码之前可用的代码处理都可以称为广义的与处理器
-
目前比较常用的后处理器
-
postcss 机制浅析
- 上述是一个后处理流程
工程架构
CSS 模块化
- 一般有三种方案,本质相同:保证样式集合对应的点是唯一的,本质上没有改变CSS的传统写法,只是使用了类似于加哈希值的方式保证了命名隔离
CSS-in-js
- 颠覆了传统的CSS代码编写方式,使用JS动态生成CSS代码
- inline-style 已经被抛弃了
- 主流的使用 "唯一类名" 这种方式,使用 styled-components 这个工具
- 上述右侧示例代码中,第一个红框中的main类似于一个形参,实参可以是任何一个标签,最终JS代码生成右侧dev模式中的CSS代码,可以看到是在class name处生成了一个唯一的类名
- styled-component 机制浅析
- 好处与坏处
Atomic CSS
- 通过设计最小化CSS类的样式来进设计,有点类似于LINUX小而美的哲学,但是直接进行原子化了,粒度更细。
- 实现机制
- 工具库优先:优先使用工具库中定义好的
- 按需生成:不引入多余的内容,减小打包
- 支持自定义
- 好坏