基础知识
- CSS: Cascading Style Sheets, 层叠样式表
层叠规则 & 优先级
推荐阅读:
- 最后声明的优先
- 由层叠概念引申出的CSS代码good practice:
- 选择器尽量少用id
- 尽量不要用!important
- 自己的样式加载在引用库样式的后面
继承
- 上图中,.card h1的font size本会是28px,由于指定了inherit,变成从父元素(card)处继承,即24px
单位
长度单位
绝对长度:
px(像素):最常见的单位,通常用于屏幕显示。一个像素对应于屏幕上的一个点。cm(厘米)、mm(毫米)、in(英寸)、pt(磅,1/72 英寸)、pc(点,1/6 英寸):这些单位主要用于打印媒体,它们基于物理尺寸。相对长度:
em:相对于当前元素的字体大小。例如,如果当前字体大小是 16px,那么 2em 等于 32px。rem:相对于根元素(通常是<html>)的字体大小。与em类似,但始终基于根元素的字体大小。vw(视窗宽度)、vh(视窗高度):相对于视口(浏览器可见区域)的宽度和高度。1vw 等于视口宽度的 1%,1vh 等于视口高度的 1%。vmin、vmax:分别等于视口宽度和高度中的较小值和较大值。
盒模型
-
内边距(padding): 不可为负
-
外边距(margin): 可为负或auto
- 提供4个数据:将依次作用于上,右,下,左。(顺时针)
- 提供3个数据:将依次作用于上,左右,下
- 提供2个数据:将依次作用于上下,左右
- 提供1个数据:将作用于上下左右
- 一些展现形式
居中
- 水平居中
- 行内元素: 给父元素设置 text-align:center
- 定宽块级元素:margin: 0 auto (块状元素一定要有width值)
- 不定宽块级元素:
- display: table + margin: 0 auto
- 子元素设置display: inline-block,同时父元素设置text-align: center
- 父元素设置display:flex + justify-content: center
- position + 负margin
- position + margin:auto
- position + transform
- 方法4, 5, 6同下面垂直居中2, 3, 4一样,只需把top/bottom改为left/right
- 垂直居中
- 单行文本:
- paddingtop = paddingbottom
- line-height = height
- 多行文本:父元素display: table,子元素display: table-cell + vertical-align: middle
- 块级元素:
- 父元素设置display:flex和align-items:center (父元素必须设置height值)
- 利用position和top和负margin(需知height)
- 设置position: absolute/relative/fixed
- top = 50%
- margin = 负一半height
- 利用position和top/bottom和margin:auto(注意不是margin:0 auto)
- position:absolute/relative/fixed
- top & bottom:0
- margin:auto
- 利用position和top和transform(可用于未知元素大小)
- position: absolute/relative/fixed
- top = 50%
- transform: translate(0, -50%)
- 单行文本:
- 水平垂直居中
- position + margin:auto
- position: absolute;
- left & right & top & bottom: 0;
- margin: auto;
- position + 负margin (须知高宽)
- position: absolute;
- left: 50%;
- top: 50%;
- margin-left: 负一半width;
- margin-top: 负一半height;
- position + transform
- position: absolute;
- left: 50%; /*父元素的50% */
- top: 50%;
- transform: translate(-50%,-50%); /*自己的50% */
- flex布局
- display:flex;
- justify-content: center; //子元素水平居中
- align-items:center; //子元素垂直居中
- table-cell
- display: table-cell;
- text-align: center;
- vertical-align: middle;
- position + margin:auto
来源/推荐阅读:
布局和定位
常规流
块级格式化上下文(BFC, block formatting context)
- 外边距塌陷
内联级格式化上下文(IFC, inline formatting context)
-
看不见的Line Box
-
高度由
line-height决定 -
vertical-align确定位置
-
-
使用以上特性,实现单行元素居中/对齐:
-
单行文字垂直居中: 将
line-height和height设置为相同的高度 -
文字和icon垂直对齐:
vertial-align: middle, 垂直对齐,但不是完全垂直居中;- 如果设置 父元素
font-size: 0, 基线和中线重叠,则居中对齐
- 如果设置 父元素
-
Flex Box 弹性盒子
flex布局学习参考地址:www.ruanyifeng.com/blog/2015/0…
flex布局实例地址:www.ruanyifeng.com/blog/2015/0…
- 两类属性
- 作用于父元素:所有子元素的排列属性
- 作用于子元素:当前单个子元素的属性
Grid 网格
- fr: fraction, 划分剩余部分
- repeat(3, 1fr): 均分三等份
Grid和Flex布局的使用策略
-
Flex
- 一维布局
- 基于内容
- 浏览器兼容性更好
-
Grid
- 二维布局
- 基于布局
- 2017年后浏览器的版本普遍支持
-
Grid for lavout, Flexbox for components
- 大面积或整体布局推荐使用Grid布局
- 小面积或组件中,或Grid ltem中可以使用Flex做灵活布局
定位
层叠上下文(The Stacking Context)
- 条件:
- 注意:
- z-index只在同一个层叠上下文内比较
- 子元素的z-index无法超越父元素的z-index 显示顺序
变形、过渡、动画
变形 Transform
- 2D相关属性
- transform: translate(移动) 、rotate(旋转)、scale(放缩)、matrix(变形矩阵)等
- transform-origin: right top、center等表示变形时依据的原点
- 3D 变形
过渡 Transition
动画 Animation
性能相关
响应式设计
响应式设计原则
- 优先选用流式布局,如百分比、flex、grid等
- 使用响应式图片,匹配尺寸,节省带宽
- 使用媒体查询为不同的设备类型做适配
- 给移动端设备设置简单、统一的视口
- 使用相对长度,em、rem 、vw 做为长度度量
媒体查询
设备像素、参考像素和移动设备视口
-
设备像素(物理像素): 显示器上绘制的最小单位显示屏通过控制每个像素点的颜色,使屏幕显示出不同的图像。设备像素和设备相关,屏幕从工厂出来那天起它上面的物理像素点就固定不变了。
-
DPI&PPI:
- dpi (dots per inch): 每英寸多少点
- ppi (pixels per inch): 每英寸多少像素数
- 当用于描述显示器设备时,ppi与dpi是同一个概念。说的是每英寸多少物理像素及显示器设备的点距
- CSS像素
- DPR设备像素比
- 移动端Viewport
- 常见移动端viewport设置方式
- 保持scale为1: width = device-width, initial-scale = 1;
- 保持scale为1/DPR -> 1个css px等于一个设备像素
相对长度
em
- 一般不用于字体大小,可以用于宽高属性(相对自己字体大小)
rem
- 相对根元素字体大小
vw&vh
CSS生态相关
语言增强
CSS预处理器
- Examples:
- scss less stylus 简单对比:
- 常见样式处理流程:
后处理器
- postcss机制
工程架构
CSS 模块化
- CSSModule 就是为了解决全局污染问题出现的方案,
- 解决CSS全局污染,本质上是保证样式集合对应的选择器是唯一的
CSS-In-Js
- JS 动态生成CSS
- 行内样式(已弃用)
- 唯一类名
- styled.main: styled函数接受一个main标签(可以是任何标签),生成react component,唯一类名
- CSS-in-JS pros & cons
- Pros
- 有效避免样式全局污染
- 复杂交互样式可以更灵活的编写
- 首屏渲染无多余css阻塞
- Cons
- 有一定的学习成本
- 存在运行时的消耗
- css-in-js的库导致打包体积增大
- 代码的可读性降低
- Pros
原子化 CSS (Atomic CSS)
-
小巧 用途单一的class
-
Tailwind
- 原子化 CSS Pros & Cons
- Pros
- 减少css体积
- 原子类复用率高
- 移动和删除html节点变得容易
- 减少classname的命名复杂度
- Cons
- 增加html类名长度
- 初始使用时有学习和记忆成本
- 样式库的定义成本(不完全是缺点)
- Pros
推荐阅读
理解CSS | 青训营笔记
理解CSS 两万字笔记 | 青训营笔记 juejin.cn/post/722563…