css解析是在什么时候
- css解析会阻塞渲染树构建,但不会阻塞HTML解析(和css可并行)
- css未解析完成,浏览器会延迟渲染。
- css解析的核心产物树CSSOM --》 描述所有样式规则的树形结构,包括选择器、样式属性以及优先级等信息。 css核心解析实际是:
- 首次加载阶段:与html解析并行,遇到css资源触发(外部/内部),生成CSSOM
- 动态更新阶段:CSS内容变化,重新解析并更新CSSOM
本质上为渲染树提供样式信息
垂直居中的几种方式
flex
css
.t1 {
display: flex;
justify-content: center;
align-items: center;
}
grid
css
.parent {
display: grid;
align-items: center;
/* 可选:水平居中加 justify-items: center; */
height: 300px;
}
.child {
/* 无需额外样式 */
}
margin1
css
.t1 {
position: relative;
}
.t2 {
margin: auto;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
margin2
css
.t1 {
position: relative;
}
.t2 {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
margin: auto;
}
Line-height(单行文本专用)
css
/* 父元素 */
.parent {
height: 100px; /* 固定高度 */
line-height: 100px; /* 行高 = 父元素高度 */
}
/* 子元素(文本) */
.child {
/* 文本默认垂直居中 */
}
Table-cell(传统方法)
css
.parent {
display: tall-cell;
vertical-align: middle;
height: 300px;
}
.child {
display: inline-block; /* 才会被 vertical-align 影响 */
}
总结
- 现代项目首选:flex / grid
- 未知高度: position + Transform
- 单行文本:直接用 line-height
- 兼容性要求高(如 IE8):Table-cell 布局
块元素和行内元素的差异
|差异|块|行内| |占据空间的方式|独占一行|不独占一行| |宽高|有效|宽高有元素内容决定| |边距|有效|左右有效,上下无效| |代表元素|div/navigator/aside/article/p/h1-h6 |span/strong/a/img/input | |嵌套|可嵌套 块/行内| 可嵌套行内/文本 | 注意:img/input 虽然是行内元素(替换元素),但是可以设置宽高(内容由外部资源决定、图片的实际尺寸)
rem优缺点
优点
- 天然支持响应式布局
- 避免嵌套
- 灵活适配设计稿
- 兼容性良好
缺点
- 依赖根元素字体大小
- 精确尺寸控制不便
- 转化成本 (rem->px)
- 极端场景兼容性(ie8完全不支持)
0.5px的线
css
.line {
width:300px;
height:1px;
transform:scaleY(0.5);
background:black;
transform-origin:top; /* 为了对齐 */
}
.vertical-line {
width:1px;
height:300px;
transform:scaleX(0.5);
background:black;
transform-origin:left; /* 为了对齐 */
}
float
float 是 CSS 早期的布局属性,设计初衷是实现 “文字环绕元素” (如新闻中图片左 / 右浮动,文字围绕图片排列)
基本取值
取值:left
、right
、none
、inherit
核心行为:浮动元素会”脱离文档流“,但不会完全脱离(区别position:absolute
) ---- 文本、行内元素会自动环绕浮动元素、而非覆盖。
关键特性
- 脱离文档流,但保留文字环绕:
- 包裹性 (内容宽度会“收缩”以适应内容)
- 破坏性(高度塌陷)
- 浮动元素同行排列。多个同方向浮动的元素(如均为 float: left)会自动在一行排列,超出父容器宽度时会换行
清除浮动
为解决 “高度塌陷” 和 “浮动元素影响后续布局” 的问题,需通过 clear 属性 或 learfix 技巧 清除浮动:
css
.st{
overflow:hidden;
}
.clearfix::after {
content: "";
display: block;
clear: both; /* 不允许两边有浮动元素 */
visibility: hidden;
height: 0;
}