引言
参见
https://mp.weixin.qq.com/s/U8oI7n1xch89QvERdQMjUA
内容一
一、CSS是什么, 它从哪来?
想象一下, HTML就像是一个人的骨架, 它决定了网页的结构——哪里是头, 哪里是身体, 哪里放按钮. 但光有骨架可不行, 看起来太吓人了! 这时候就需要CSS来当”化妆师”, 给网页穿上漂亮的衣服.
CSS全称是Cascading Style Sheets(层叠样式表), 简单说就是一套给网页”化妆”的规则. 比如:
<!--这是HTML -->
<p>我是普通文字</p>
<p class="fancy">我是fancy文字</p>
<!--这是CSS -->
<style>
.fancy {
color: pink;
font-size: 20px;
text-shadow: 2px 2px 4px #000;
}
</style>
二、CSS的核心概念
2.1 选择器
选择器就像化妆时的”定位工具”, 告诉浏览器你要给谁化妆. 常见的有:
1)标签选择器:
p { color: blue; } /*所有<p>变蓝色*/
2)类选择器:
.warning { color: red; } /*class="warning"的元素变红色*/
3)ID选择器:
#header { height: 60px; } /*id="header"的元素高度60px*/
4)后代选择器:
nav a { text-decoration: none; } /*nav里的所有<a>去掉下划线*/
5)伪类选择器:
a:hover { color: orange; } /*鼠标悬停时<a>变橙色*/
2.2 盒模型
在CSS眼里, 每个元素都是一个盒子, 由内到外分别是:
内容(content) → 内边距(padding) → 边框(border) → 外边距(margin)
用代码表示:
.box {
width: 200px; /*内容宽度 */
padding: 20px; /*内边距 */
border: 5px solid; /*边框 */
margin: 10px; /*外边距 */
/*实际占用宽度 = width + padding*2 + border*2 + margin*2
= 200 + 40 + 10 + 20 = 270px */
}
用box-sizing: border-box可以让width包含padding和border, 计算更直观:
.box {
box-sizing: border-box;
width: 200px; /*现在200px包含content+padding+border */
padding: 20px;
border: 5px solid;
/*实际内容宽度 = 200 - 40 - 10 = 150px */
}
2.3 层叠与继承
当多个样式规则作用于同一个元素时, 浏览器会根据以下规则决定用哪个:
1、来源优先级(从高到低)
用户标记为!important的样式.
开发者标记为!important的样式.
开发者写的普通样式.
用户设置的普通样式.
浏览器默认样式.
2、选择器权重:
行内样式(style属性) : 1000.
ID选择器: 100.
类/伪类/属性选择器: 10.
标签/伪元素选择器: 1.
通配符(*): 0.
3、书写顺序: 后写的覆盖先写的
/*权重计算示例 */
#nav .item { color: red; } /*100 + 10 = 110 */
div#nav .item { color: blue; } /*1 + 100 + 10 = 111 (胜出) */
继承则是指某些样式会从父元素传递给子元素, 比如font-family、color等.但不是所有属性都能继承, 比如border、margin就不会.
三、现在CSS核心特性
1)Flexbox弹性布局:
.container {
display: flex;
justify-content: center; /*水平居中 */
align-items: center; /*垂直居中 */
gap: 10px; /*子项间距 */
}
.item {
flex: 1; /*自动伸缩 */
}
2)Grid网格布局:
.container {
display: grid;
grid-template-columns: 1fr 2fr 1fr; /*三列,中间列是两倍宽 */
grid-template-rows: 100px auto;
gap: 15px;
}
.header {
grid-column: 1 / 4; /*跨3列 */
}
3)CSS变量:
:root {
--main-color: #4CAF50;
--padding: 15px;
}
.button {
background: var(--main-color);
padding: var(--padding);
}
4)动画:
@keyframes bounce {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(-20px); }
}
.ball {
animation: bounce 1s infinite;
}
四、浏览器如何渲染CSS
4.1 关键渲染路径
当浏览器加载网页时, 会经历以下步骤:
解析HTML -> 构建DOM树.
解析CSS ->构建CSSOM树.
合并DOM和CSSOM -> 形成渲染树(Render Tree).
计算布局(重排/回流) -> 确定每个节点的位置和大小.
绘制(重绘)->把元素画到屏幕上.
4.2 重排(reflow)与重绘(repaint)
重排: 当元素几何属性改变(宽度、位置等), 浏览器需要重新计算布局
重绘: 当元素外观改变但不影响布局(颜色、阴影等), 只需重新绘制
4.3 浏览器引擎差异
不同浏览器使用不同的渲染引擎:
Chrome/Safari/Edge: Blink(Chrome)、WebKit(Safari)
Firefox: Gecko
IE: Trident
这导致了著名的”浏览器兼容性”问题. 解决方法:
/*原始代码 */
.box {
display: flex;
}
/*处理后 */
.box {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
}