前言
本文主要介绍部分CSS知识模块,如布局、层叠上下文等,讲解一下CSS生态相关的知识,为我们的同学提供一个简明的CSS知识脉络
CSS简要发展历史
1.基础知识
层叠(Cascading)、优先级
层叠三大规则
- 样式表来源
- 这里先忽略了transition和animation,原因是不同浏览器和css规范规定的表现不一致
- 选择器优先级
- 源码位置
- CSS层叠概念的最好实现
继承
CSS的值和单位
盒模型
盒模型的一些展现形式
- 由盒模型的特性能实现一些展现形式?
-或者使用新特性也可实现固定比例矩形:aspect-ratio
盒模型-负外边距
-
padding、border、margin中,只有marigin可以设置负值
-
设置左边或顶部的负外边距,元素就会相应地向左或向上移动,导致元素与它前面的元素重叠:
- 如果设置右边或者底部的负外边距,并不会移动元素,而是将她后面的元素拉过来
- margin负值最终减少的是外界可感知的宽高
2.布局和定位
概述
常规流布局
块级格式化上下文(block formatting context)
外边距塌陷
- 会产生外边距塌陷的情况:
- 消除外边距塌陷的方法:
内联级格式化上下文
内联级格式化上下文
- 一些实际case:
弹性盒子布局
- Flexible Box Layout是为了提供更加高效灵活的布局方式,在即便是宽高未知的情况下,也能排列和分割一个盒子内部的布局。而且在不同布局方向(横向/纵向)的调整更为灵活
- 弹性盒子的相关属性分为两类:
使用弹性盒子布局的示例
- 展示灵活的文件长度省略展示:例子出处
网格布局
- 2017年推出的Grid布局可以定义由行和列组成的二维布局,然后将元素放置到网格中。元素可以只占其中一个单元格,也可以占据多行或多列
使用Grid布局的示例
Grid和Flex布局的使用策略
定位Position
- 为了我们可以在文档流的基础上,让元素移动,做出更多灵活的改变。当position属性的取值非static的时候,可以使用top,right,bottom,left对其进行定位
使用定位的示例
3.层叠上下文(The Stacking Context)
层叠上下文简述
- 层叠上下文是对HTML元素的三维构想,将元素沿着垂直屏幕的虚构的Z轴排开
形成层叠上下文的条件
stacking order
- 层叠顺序
- position
- z-index
编写z-index的建议
- 1.使用css变量或者预处理语言的变量,管理z-index的值
- 2.将预设间隔设置10或100,方便后续的插入
4.变形、过渡、动画
transform变形
- transform变形
- 2D相关属性:
- transform:translate(移动)、rotate(旋转)、scale(放缩)、matrix(变形矩阵)等
- transform-origin:right top、center等,表示变形时依据的原点
trannsform 变形 3D
- 例子演示
transition 过渡
animation动画
transform、transition、animation-性能相关
5.响应式设计
响应式设计推荐遵循的原则
- 优先选用流式布局,如百分比、flex、grid等
- 使用响应式图片,匹配尺寸,节省带框
- 使用媒体查询为不同的设备类型做适配
- 给移动端设置简单、统一的视口
- 使用相对长度,em、rem、vw作为长度度量
媒体查询
- 媒体查询允许某些样式只在页面满足特定条件时才生效。我们可以将媒体类型(如screen、print) 以及媒体特性(如视口宽度、屏幕比例、设备方向:横向或纵向)做为约束条件
- 使用每天查询的一些Tips
- 1.媒体查询同样遵循cascading层叠覆盖原则,min=和max-选择一个
- 2.由于设备的多样化逐渐不可枚举断点的选择尽量根据
- 3.由于断点的增加会增加样式处理的复杂度,所以尽量减少断点
设备像素
- 设备像素(物理像素 :显示器上绘制的最小单位,显示屏通过控制每个像素点的颜色,使屏幕显示出不同的图像
- 设备像素和设备相关,屏幕从工厂出来那天起,它上面的物理像素点就固定不变了
DPI&&PPI
- dpi(dots per inch):英寸多少点
- ppi(pixels per inch):每英寸多少像素数
-当用于描述显示器设备时ppi与dpi是同一个概念,说的是每英寸多少物理像素及显示器设备的点距
- 当屏幕分辨率是X*Y,计算公式:
CSS像素
- CSS像素(reference pixel)其实是一个视角单位、规范给出的定义是,1css像素是从一臂之遥看解析度为98DPI(即1英寸96点)的设备输出时,1点(即1/96英寸)的视角
- 通常认为常人臂长为28英寸,那么视线与水平线的夹角是:
- 如果1css像素永远等于1设备像素,那么
- 但是真正使用的CSS像素并不是用0.0213度去精确计算的,因为css像素存在的目的是为了保证阅读体验一致,所以对不同的物理设备,CSS使得浏览器中1css像素的大小在不同物理设备上看上去总是差不多
- 真正实现时,为了方便基本都是根据设备像素换算的。浏览器根据硬件设备能够直接获取css像素
DPR设备像素比
-设备像素比(dpr):描述的是为缩放状态下,设备像素和CSS像素的初始比例关系
移动端的viewport
-布局视口(viewport)是页面中html元素(根元素)的包含块,默认情况下,window.document.documentElement.clientWidth就是viewport的宽度
- 在移动设备中,默认的布局视口由于历史兼容pc屏幕的原因,并不符合要求,我们经常需要用标签对viewport进行设定,来完成移动端设备的适配
- 比如:默认iphone的布局视口是980px,展示视图:
移动端的viewport
em
rem
- rem:根元素的字体大小。通过伪类:root或者html选择器选定。由于根元素的font-size,所以不会像em那样出现多重嵌套问题,减少了复杂性同时作为一个相对单位,可以进行适配放缩,可以用来做响应式布局
vw和vh
- vw:视窗宽度的1%
- vh:视窗高度的1%
- 同样,vw也可以作为响应式布局的基准单位。由于vw天然是视口宽度的1%,所以不需要js动态设置
6.CSS生态相关
语言增强-CSS预处理器
- 如何提高研发效率
- 自定义变量
- 提高可复用
- 嵌套、作用域
- 避免全局污染
- 结构层次清晰
- 减少复杂组合选择器
- mixins、继承
- 提高可复用
- 可维护性
- 操作符、条件/循环语句、自定义函数
- 提高可编程能力
- 增加灵活性
- scss、less、stylus简单对比
语言增强-广义CSS预处理器
- 现在项目中常见的样式处理流程
语言增强-CSS后处理器
-
CSS后处理器是对CSS进行处理,并最终生成CSS的预处理器,它属于广义上的CSS预处理器。
-
最典型的例子是CSS压缩工具(如clean-css)。
-
后处理器例如:PostCSS通常被视为在完成的样式表中根据CSS规范处理CSS,让其更有效;目前最常做的是给CSS属性添加浏览器私有前缀,实现跨浏览器兼容性的问题。
-
后处理器框架地址:postcss插件
语言增强-postcss机制浅析
工程架构-CSS模块化
- CSS Module 就是为了解决全局污染问题出现的方案,解决CSS全局污染,本质上是保证样式集合对应的选择器是唯一的,从这个角度看,主流的单纯针对于防止全局污染的方案大概有:
- BEM命名规范
- 通过.block_element-modifier这种命名规范来约束开发者,从而实现样式隔离
- vue-loader的scoped方案
- 通过编译的方式,在html元素上添加data-xxx的唯一属性,然后css添加属性选择器[data-xxx]的方式,实现样式隔离
- CSS Modules
- 通过编译的方式,将一个css file中的样式命名默认转换为一个全局唯一的名称,实现样式隔离,(常用css-loader或postcss-module)
- css module地址:css-modules
工程架构-CSS-in-JS
- css-in-js:将应用的CSS样式写在JavaScript文件里面,利用js动态生成css
工程架构-styled-component机制浅析
- Step1
- 生成第一个classname作为componentld
- 这个类名没有CSS样式,但是当需要引用其它组件的时候,可以作为一个嵌套选择器来使用
- Step2
- 生成第二个classname作为唯一类名(hash值),使用stylis,生成和唯一类名关联的CSS字符串
- Step3
- 唯一类名对应的css样式insert到
<head>的<style>中
- 唯一类名对应的css样式insert到
- Step4
- 将两个类名写到目标节点的class中
工程架构-CSS-in-JS pros&cons
工程架构-原子化CSS
- 原子化CSS是一种CSS的架构方式,它倾向于小巧且用途单一的class,并以视觉效果进行命名
- 现有的库or框架:
- Tailwind为例:
工程架构-原子化CSS
- Tailwind如何做的?
- 1.实用工具库优先(Utilities-First)
- 2.按需生成
- 3.支持配置样式规则&自定义插件
工程架构-原子化CSS
- Facebook重构拥抱atomic css:Atomic CSS-in-JS (sebastienlorber.com)
引用
- 字节内部课: 前端语言串讲-理解CSS