📚 第1页:CSS 盒模型介绍
CSS 盒模型是什么?
CSS 盒模型(Box Model)是网页布局的基础概念,它定义了元素的尺寸和布局结构。每个 HTML 元素都可以看作一个矩形框,而这个框由 内容区、内边距(padding) 、边框(border) 和 外边距(margin) 组成。
就像生活中的“礼物包装”🎁
想象一下,你买了一个礼物并用盒子包装好。
- 内容(Content) 就是盒子里的礼物。
- 内边距(Padding) 就是礼物和盒子之间的空隙,让它看起来更美观。
- 边框(Border) 是盒子的外框,它决定了包装盒的外形。
- 外边距(Margin) 是盒子外面与其他物体之间的空隙,确保礼物不会挤到其他物品。
图解说明:
图中的“盒子”通过层次结构表示了 CSS 中的盒模型:
- Content(内容) 是你网页元素的实际内容(比如文字或图片)。
- Padding(内边距) 给内容加了些空间,让它不贴着边界看起来更舒服。
- Border(边框) 可能是你设定的框线,增加了更多的视觉效果。
- Margin(外边距) 给元素和其他元素之间留出空间。
📄 第2页:CSS 盒模型的组成部分
图解描述了盒模型的四个部分:
- 内容(Content)
- 内边距(Padding)
- 边框(Border)
- 外边距(Margin)
每个部分都有不同的作用,最简单的理解就是:
- 内容区是实际的网页内容。
- 内边距就是内容和边框之间的空隙。
- 边框定义了元素的边界。
- 外边距则是与其他元素之间的空隙。
代码块解释:
div {
margin: 10px;
border: 1px solid black;
padding: 15px;
width: 300px;
}
- margin: 10px; :为元素四周添加了 10px 的外边距。
- border: 1px solid black; :元素周围有 1px 黑色边框。
- padding: 15px; :元素内部的内容与边框之间有 15px 的间隙。
- width: 300px; :元素的宽度是 300px,记住它是 内容区的宽度,不包括内边距和边框。
📄 第3页:标准盒模型
💻 代码解释:
当你写:
.box {
width: 200px;
padding: 20px;
border: 10px solid;
}
浏览器的理解是:
width = “content 内容的宽度 = 200px”
但实际盒子占的空间要加上 padding 和 border!
所以实际占宽:
200(内容) + 20×2(内边距) + 10×2(边框) = 260px
🍵 奶茶店比喻:
你跟店员说:“给我一杯200ml 奶茶。”
但这 200ml 只是奶茶液体的量!
实际上:
- 杯壁(border)要占空间;
- 杯子内侧的空气垫层(padding)也占点体积;
- 外面再套个袋子(margin)放桌上还会留距离。
所以整杯放桌上,空间远不止 200ml 😆!
📄 第4页:IE 怪异盒模型(Quirks Box Model)
💻 代码示例:
同样的代码:
.box {
width: 200px;
padding: 20px;
border: 10px solid;
}
这次:
实际总宽度 = 200px ✅
因为 padding 和 border 都已经被算在 width 里面了。
🍰 奶茶店比喻:
这就像一个奇怪的奶茶品牌,说:
“我们标的 200ml 包含杯壁厚度!”
顾客以为能喝 200ml,结果实际奶茶液体只有 140ml 😂
(因为 200 - 20×2 - 10×2 = 140)
💎 box-sizing 属性(盒子计算模式切换开关)
CSS 提供了一个神奇开关:
box-sizing: content-box | border-box | inherit;
它决定 width / height 到底算哪一层:
| 属性值 | 含义 | 奶茶比喻 |
|---|---|---|
content-box | 默认值,只计算内容(content) | 200ml 纯奶茶液体 |
border-box | 包含 padding + border | 200ml 含杯壁和垫层 |
inherit | 继承父元素的设定 | 跟你师傅(父盒子)学 |
💻 示例:
.box {
width: 200px;
padding: 20px;
border: 10px solid;
box-sizing: border-box;
}
这时盒子的总宽度 就是 200px!
浏览器自动在 200px 内“挤出空间”给 padding 和 border。
也就是:
“奶茶总容量 200ml,包含杯壁和泡泡层。”
📄 第5页:CSS 盒模型总结
我们通过 box-sizing 来控制元素的大小计算方式,这对于布局非常重要,特别是当你需要精确控制网页元素的大小时。
小可爱记忆法:
-
盒模型就像是给 网页元素包装礼物,包装的每一部分都可以定制:
- 内容区:礼物。
- 内边距:让礼物与包装盒之间有空间。
- 边框:包装盒的外框。
- 外边距:盒子外面与其他物体的空隙。
生活小技巧:
就像在包装礼物时,你要先确定礼物的大小(内容区),然后再根据需要加上包装纸(内边距)和装饰物(边框)。 然后把包装好的礼物放在桌子上(外边距),确保它和其他礼物有足够的空间。
📚 第6页:BFC是什么?
什么是BFC?
BFC(Block Formatting Context)是一种 独立的渲染区域,它决定了页面上如何处理布局,尤其是元素的 浮动(float) 和 垂直外边距合并(margin collapse) 问题。
生活案例:
可以把 BFC 想象成一个 封闭的房间,房间内的物品不会影响到外面的东西,但房间里的物品依然会互相影响。 在 CSS 中,BFC 就像这样 隔离了元素之间的关系,使它们独立存在,不会影响到外部元素。
举个例子:
<div style="overflow:auto;"> <!-- BFC 开启 -->
<div style="float:left;">浮动元素</div>
<div>普通元素</div>
</div>
在这个例子中,<div> 元素开启了 BFC,它不会受到 浮动元素 影响,两个子元素的布局就会按照 BFC 来进行计算。
📄 第7页:BFC的触发条件
BFC的触发条件:
BFC 是通过以下几种 CSS 属性来激活的:
- overflow:设置为
hidden、auto或scroll。 - display:设置为
inline-block、flex、grid等。 - position:设置为
absolute或fixed。 - float:设置为
left或right。
举个生活案例:
BFC 就像是房间门的“开关”。
- 如果门是开着的(例如设置了
overflow:auto),房间里的一切都互相独立。 - 如果门是关着的(例如没有设置),房间里的物品就会相互挤在一起,无法正常分布。
📄 第8页:BFC应用示例
示例解释:
<div style="overflow:auto;">
<div style="float:left;">Haha</div>
<div style="float:left;">Hehe</div>
</div>
这里,<div> 的 overflow:auto 属性触发了 BFC,因此它可以确保其中的 浮动元素 互不干扰,两个浮动的 <div> 元素会排列在一起而不影响外部布局。
生活中的例子:
可以想象你的房间里面有两个桌子(浮动元素),每个桌子放了一个物品(Haha 和 Hehe)。 因为房间被隔离(BFC),这两个桌子不会互相碰撞,每个桌子都能好好放物品。
📄 第9页:BFC应用细节
注意点:
BFC 会 阻止外边距合并(margin collapse) ,即在一个 BFC 内部,即使元素之间有外边距(margin),它们也不会像通常的块级元素那样合并成一个更大的外边距。
举个例子:
<div style="overflow:auto;">
<div style="margin-top:20px;">元素1</div>
<div style="margin-top:20px;">元素2</div>
</div>
这里,两个 div 之间的 margin 不会合并,它们会被 BFC 分开,每个元素的外边距都会被保留。
📄 第10页:总结与使用场景
使用场景:
- 避免浮动元素对父元素影响:使用 BFC 可以让父元素容纳浮动元素,不被其“拉伸”。
- 清除浮动问题:使用
overflow:auto来清除浮动,确保布局正常。
生活中如何理解?
假设你的房间里有一个高脚凳(浮动元素),它的高度会影响到整个房间(父元素)。 但如果你把房间设置成 BFC,那么这个高脚凳就不会影响到房间的整体布局。
小可爱总结:
- BFC 就像一个独立的房间,它让房间里的物品互不干扰,每个元素的大小和布局只与自己有关,不受外界影响。
- 通过
overflow、display和position等属性,可以轻松 创建 BFC,让页面中的布局更加稳定。
📚 第11页:浮动布局(Float Layout)
什么是浮动布局?
浮动布局就是将元素 “浮动” 到页面的左边或右边,让它们不再占据普通的文档流位置。通常我们用 float 属性来控制元素的浮动。
生活案例:
可以把浮动布局想象成在河里放几个浮木,它们会随着水流浮动并靠着一边。比如,你将两个浮木分别放在水面左边和右边,它们会漂浮到靠近河岸的地方,而不再随水流的方向漂移。
代码示例:
<div style="float: left; width: 50%;">左侧浮动</div>
<div style="float: left; width: 50%;">右侧浮动</div>
在这个例子中,float: left 将两个 <div> 元素分别浮动到左边,每个占据 50% 的宽度,从而让它们在同一行内排列。
生活中的例子:
就像你将两个篮子放在一个长桌子上(宽度 100%),每个篮子占据 50% 的桌面,两者并排放置。
📄 第12页:清除浮动(Clear)
为什么要清除浮动?
浮动元素会脱离文档流(normal flow),所以它们可能会影响到后面的内容,导致布局问题。为了防止这种情况,我们使用 clear 属性来 清除浮动,确保后续的元素不受浮动元素的影响。
举个例子:
.clearfix::after {
content: "";
display: block;
clear: both;
}
这里,.clearfix 类通过 clear: both 清除了 左右浮动 元素,确保后面的内容不会受到影响。
生活中的例子:
可以把清除浮动想象成,在两辆汽车(浮动元素)之间插入一个停车位(清除浮动),确保后面停的车(其他元素)不会被前面的车挡住。
📄 第13页:响应式设计(Responsive Design)
什么是响应式设计?
响应式设计就是根据不同的屏幕大小,自动调整页面的布局和样式。它可以让网页在手机、平板和电脑等设备上都能保持良好的显示效果。
生活案例:
想象一下,你为自己的书桌准备了一个书架。如果你有一个大书桌(大屏幕),书架上放更多的书;如果你有一个小书桌(小屏幕),书架就会调整放更少的书,确保桌面上不会太拥挤。
代码示例:
@media (max-width: 600px) {
div {
width: 100%;
}
}
这段代码表示:当屏幕宽度小于 600px 时,div 元素的宽度将变为 100% ,适应小屏幕设备的显示。
生活中的例子:
就像你将书架的宽度调整为 100% ,确保它能够适应桌面空间,不管桌子大小如何。
📄 第14页:常见的响应式布局方式
响应式布局的常见方法:
- 媒体查询(Media Query) :根据不同设备尺寸来调整 CSS 样式。
- 百分比宽度(%) :设置宽度为百分比值,使元素在容器中按比例缩放。
- 弹性盒模型(Flexbox) :让元素按比例自动填充空间。
生活中的例子:
如果你把桌子看作网页元素,那么:
- 媒体查询 就是根据桌子的尺寸调整书架的高度;
- 百分比宽度 就是根据桌子的宽度让书架占据一定比例的空间;
- 弹性盒模型 就是桌子上的物品会自动调整位置,以适应不同的桌面空间。
📄 第15页:Flexbox 基础
Flexbox 是什么?
Flexbox 是一种现代的 CSS 布局方式,能使容器内的元素按照设定规则 自动对齐,并且能更好地处理元素之间的空间分配。
代码示例:
.container {
display: flex;
justify-content: space-between;
}
.item {
width: 30%;
}
display: flex;让容器成为一个弹性容器(Flex container),它内部的子元素(.item)会自动排列。justify-content: space-between;会让元素之间有等距离的间隔。
生活中的例子:
想象你在一个长桌子上排放书籍,每个书籍之间保持一定的间距,并且自动调整它们的位置,确保它们排得整齐。
小可爱总结:
- 浮动布局(float) :让元素脱离正常文档流,可以左右浮动,类似让物品在桌子上自由漂浮。
- 清除浮动(clear) :防止元素被浮动影响,类似给浮动元素之间插入空白区域。
- 响应式设计:根据设备的屏幕大小调整布局,就像为不同大小的桌子准备不同的书架。
- Flexbox:自动调整元素的位置,确保它们在容器中分布均匀。
📚 第16页:CSS 定位和布局基础
3.2.1 定位(Position)
position 属性:
position 用来控制元素在页面中的位置,常见的取值有:
- static:默认值,元素按照文档流排布。
- relative:相对定位,元素相对于它自己原本的位置进行偏移。
- absolute:绝对定位,元素相对于最近的已定位(非
static)父元素定位。 - fixed:固定定位,元素相对于浏览器窗口进行定位,滚动页面时元素保持固定位置。
- sticky:粘性定位,元素在滚动到一定位置时变得“固定”,当你滚动页面时,它会停留在页面的某个位置。
生活中的例子:
想象你在桌子上放了几个物品:
- static:物品按顺序摆放,随意而自然。
- relative:你可以微调物品的位置,但它们会从原始位置“稍微移动”。
- absolute:物品不再受桌面上其他物品的影响,可以随意放置在任何地方。
- fixed:把物品粘在桌面上,即使桌子(浏览器窗口)移动,它也不会动。
- sticky:物品随着你滑动桌面,固定在某个位置。
代码示例:
div {
position: relative;
top: 10px;
left: 20px;
}
这个例子中,div 元素相对于它原始的位置(默认位置)向下移动了 10px,向右移动了 20px。
📄 第17页:浮动(Float)与清除浮动(Clear)
3.3.1 浮动(Float)
float 用于让元素脱离文档流,并向左或向右浮动。通常我们用 float 来实现文字环绕或让图片浮动。
生活中的例子:
就像你在桌子上放一个浮动的物品,其他物品会围绕它排布,除非你把它固定在某个位置。
代码示例:
div {
float: left;
width: 50%;
}
这个例子表示 div 元素会向左浮动,并占据容器宽度的 50%。
📄 第18页:清除浮动(Clear)
由于浮动元素会脱离文档流,它们可能会影响到周围的元素。为了防止这种影响,使用 clear 属性来清除浮动。
代码示例:
.clear {
clear: both;
}
这个代码清除了左右两边的浮动,使得后面的元素不会被浮动元素干扰。
生活中的例子:
可以想象你在桌子上放了两块浮动的物品(例如:两个大书籍)。如果后面放一个物品,它可能会被浮动的物品影响位置。为了避免这种情况,你给后面放的物品留出空间,就像为它插入了一个空白区域。
📄 第19页:rem 与 em 单位
3.2.4 rem 和 em 单位
rem 和 em 是两种相对单位,常用于响应式设计:
- rem:相对于根元素(
<html>)的字体大小。 - em:相对于父元素的字体大小。
举个例子:
- 如果你设置了
html { font-size: 16px; },那么 1rem 就是 16px。 em则是相对于当前元素的父级元素来计算的。
📄 第20页:水平居中与垂直居中
4.1 水平居中
水平居中有几种常见方法,最常用的是通过设置 margin 为 auto 来实现:
div {
width: 50%;
margin: 0 auto; /* 上下边距为0,左右边距自动 */
}
这样,div 元素会水平居中。
生活中的例子:
就像你把一张纸放在桌子上,纸的宽度占据了桌子的一部分,剩余的空间会自动均匀分配在纸的两边。
4.2 垂直居中
垂直居中的方式有很多,最常用的包括:
- 使用
flex布局。 - 使用
position和transform。
代码示例(Flex) :
.container {
display: flex;
justify-content: center;
align-items: center;
}
这个例子使用了 flex 布局,justify-content 是水平居中,align-items 是垂直居中。
总结:
- float 和 clear:通过浮动和清除浮动来控制元素的排列。
- rem 和 em:两种相对单位,适用于响应式设计。
- 居中:通过
flex布局或者margin:auto来实现元素的水平或垂直居中。
📚 第21页:CSS transform 属性
4.2.3 transform 属性
transform 是用来对元素进行 平移、旋转、缩放和倾斜 的。常用的值有:
- translate(x, y) :平移元素。
- rotate(deg) :旋转元素。
- scale(x, y) :缩放元素。
- skew(x, y) :倾斜元素。
生活案例:
想象你有一个物品(例如桌子上的杯子):
- 平移 就是移动桌子上的杯子到另一边。
- 旋转 就是把杯子转动,让它的开口朝向不同方向。
- 缩放 就是让杯子变大或变小,但保持它的形状。
- 倾斜 就是把杯子倾斜,让它看起来有点歪。
代码示例:
div {
width: 100px;
height: 100px;
background-color: red;
transform: translate(50px, 50px) rotate(45deg);
}
translate(50px, 50px):让div元素向右平移 50px,向下平移 50px。rotate(45deg):让div元素旋转 45 度。
生活中的例子:
就像你把杯子从桌子的一端移动到另一端,并顺便转动它 45 度。
📄 第22页:table 布局
4.2.4 tab 样式
通过 display: table-cell 和 display: inline-block,
可以实现内容在父容器中水平垂直居中的效果!
🧱 代码结构(小蓝爸爸 & 小红儿子)
<style>
.father {
display: table-cell;
width: 200px;
height: 200px;
background: skyblue;
vertical-align: middle; /* 垂直居中 */
text-align: center; /* 水平居中 */
}
.son {
display: inline-block;
width: 100px;
height: 100px;
background: red;
}
</style>
<div class="father">
<div class="son"></div>
</div>
🟦 .father 是父容器:
display: table-cell
👉 让它像表格单元格(<td>)一样工作。
表格单元格的特性:能使用vertical-align来垂直对齐内容。vertical-align: middle
👉 子元素在垂直方向居中。
(就像表格里的文字总能上下居中那样)text-align: center
👉 子元素在水平方向居中。
📏 width: 200px; height: 200px;
设置了父容器的大小。
💙 背景 skyblue 只是为了看得更清楚。
🟥 .son 是子元素:
display: inline-block
👉 让它像“文字一样”可以被父级的text-align控制居中。width、height:100px 正方形- 背景红色方便对比。
🍰 视觉效果(脑补图)
🟦 father 容器 (200x200)
├── 垂直居中:vertical-align: middle
└── 水平居中:text-align: center
🟥 son (100x100)
正好居中在蓝色方块正中!
💡 所以最终你看到的效果是:
一个 200×200 的蓝色方块(爸爸),
中间有一个 100×100 的红色小方块(儿子),
上下左右都完美居中。
🍵 生活类比(记忆法)
想象你在餐厅吃饭:
-
蓝色区域是一个“餐桌(father)”;
-
红色小盒子是你的“奶茶杯(son)”;
-
你把杯子放在餐桌中央;
text-align: center→ 左右居中;vertical-align: middle→ 上下居中;
-
因为桌子是“table-cell”类型,它天生就能帮你摆正所有物品的中心点。
📄 第23页:Flexbox 布局
4.2.5 Flexbox 布局
flexbox 是一种现代的布局模型,用来简化布局问题,尤其是在 动态和响应式设计 中非常有效。它能够让子元素按比例填充空间,并且可以让元素 居中对齐。
代码示例:
.container {
display: flex;
justify-content: space-between;
}
.item {
width: 30%;
background-color: lightblue;
}
display: flex;:让容器div的子元素变成弹性容器。justify-content: space-between;:让子元素之间有相等的间距。
生活中的例子:
想象你有一排书架(容器),你把书(子元素)放在架子上。justify-content: space-between; 就像是每个书架之间放置了相等间距的书。
📄 第24页:Grid 布局
4.2.6 Grid 布局
grid 布局是一种强大的二维布局系统,用来更灵活地安排页面内容。通过设置 行和列,你可以精确控制元素的位置。
代码示例:
.container {
display: grid;
grid-template-columns: repeat(3, 1fr);
}
.item {
background-color: lightgreen;
}
display: grid;:设置容器为网格布局。grid-template-columns: repeat(3, 1fr);:设置容器为 3 列,每列的宽度是相等的(1fr表示每列的宽度为 1 个份额)。
生活中的例子:
就像你有一个 网格状的书架,你按行和列来摆放书籍,每个书架的格子大小相等,每个格子里放一本书。
小可爱总结:
- transform:让元素平移、旋转、缩放或倾斜,就像你移动和调整桌上的物品。
- tab 样式:模拟选项卡布局,像排列在一起的书架,方便快速切换内容。
- flexbox 布局:弹性布局,让元素能够灵活对齐,就像你在一个灵活的桌面上摆放书籍。
- grid 布局:网格布局,让你可以精确地按照行和列安排元素的位置,像有规律的书架。
📚 第26页:栅格布局(Grid Layout)
4.2.7 栅格布局(Grid Layout)
栅格布局是 CSS 提供的一种 二维 布局方式。它允许你定义多个行和列来精准布局页面元素。
栅格布局的基本结构:
- grid-template-columns:定义列的宽度。
- grid-template-rows:定义行的高度。
- grid-gap:定义行和列之间的间隔。
生活中的例子:
想象你有一个 网格状的书架,每个格子都是一样的大小,书本放进去时会根据这些格子自动排列。
代码示例:
.container {
display: grid;
grid-template-columns: 1fr 1fr 1fr; /* 三列 */
grid-gap: 10px; /* 设置列与列之间的间距 */
}
在这个例子中,grid-template-columns: 1fr 1fr 1fr 表示容器分成三列,每列的宽度相等,grid-gap: 10px 表示列与列之间的间距是 10px。
📄 第27页:两栏布局
5.1 栅格两栏布局
两栏布局 是最常见的网页布局之一,通常是一个主内容区和一个侧边栏。
代码示例:
.container {
display: grid;
grid-template-columns: 1fr 3fr; /* 侧边栏占 1fr,主内容区占 3fr */
grid-gap: 20px;
}
在这个例子中,1fr 和 3fr 表示侧边栏和主内容区的比例,侧边栏占 1 份,主内容区占 3 份。
生活中的例子:
想象你有一个长桌子(容器),桌子分为两部分。左边的部分占 1 份空间,右边的部分占 3 份空间,这就是典型的两栏布局。
📄 第28页:三栏布局
5.2 三栏布局
三栏布局 是网页中非常常见的布局方式,通常是左侧导航栏、右侧侧边栏和中间的主内容区。
代码示例:
.container {
display: grid;
grid-template-columns: 1fr 3fr 1fr; /* 左右栏占 1fr,主内容区占 3fr */
}
在这个例子中,grid-template-columns: 1fr 3fr 1fr 表示三列布局,左右两列(例如侧边栏)各占 1 份,主内容区占 3 份。
生活中的例子:
想象你有一个长桌子(容器),这次桌子分成了 三部分,左边和右边各占 1 份,中间的部分占 3 份,这种布局适合大多数新闻网站或者博客。
📄 第29页:响应式布局与两栏布局的实现
5.2.1 使用 flex 实现两栏布局
flex 布局 是一种非常灵活的布局方式,适用于各种响应式设计。它允许你 自动调整子元素的大小和位置。
代码示例:
.container {
display: flex;
justify-content: space-between; /* 让两栏之间有空隙 */
}
.left {
width: 30%;
}
.right {
width: 60%;
}
在这个例子中,display: flex; 让容器成为弹性容器,justify-content: space-between; 确保左右栏之间有空隙,width: 30% 和 width: 60% 控制左栏和右栏的宽度。
生活中的例子:
想象你有一个桌子(容器),上面放了两个物品。你让左边的物品占桌子的 30%,右边的物品占 60%,中间有空隙。
📄 第30页:响应式设计与三栏布局
5.2.2 使用 grid 实现三栏布局
在响应式设计中,使用 grid 来实现三栏布局非常方便。
代码示例:
.container {
display: grid;
grid-template-columns: repeat(3, 1fr); /* 每一列都占 1fr */
}
这个例子中,grid-template-columns: repeat(3, 1fr) 表示容器内分成 3 列,每列占 1 个份额,适用于简单的三栏布局。
生活中的例子:
你有一个桌子(容器),分成三部分,每部分的宽度是相等的,就像你把三本书平等地放在桌子上。
小可爱总结:
- 栅格布局(Grid Layout) :像有规律的网格,把页面分成多个部分。
- 两栏布局:常见的左侧导航栏和右侧主内容区,像桌子上两边的物品。
- 三栏布局:左、右侧栏和中间主内容区,就像有三个部分的长桌子。
- Flexbox 布局:灵活排列,元素可以自动调整大小和位置,适应不同屏幕大小。
📚 第31页:三栏布局
5.3 三栏布局
5.3.1 使用 float 实现三栏布局
使用 float 可以非常方便地实现三栏布局,但由于 float 的一些特性,可能会带来一些问题(例如,父容器的高度丢失)。通过使用 float,可以让网页内容分布成左侧、主内容区和右侧三个区域。
代码示例:
.container {
width: 100%;
}
.left {
float: left;
width: 30%;
background-color: red;
}
.center {
float: left;
width: 40%;
background-color: blue;
}
.right {
float: left;
width: 30%;
background-color: green;
}
.left、.center、.right分别表示三个区域,使用float: left来让它们并排显示。width: 30%和width: 40%控制每个区域的宽度。
生活中的例子:
想象你有一个长桌子(容器),这个桌子分为 左边占 30% ,中间占 40% ,右边占 30% ,并且它们都并排摆放。
📄 第32页:定位元素
5.3.2 使用 absolute 定位与 margin
position: absolute 用于将元素从文档流中完全脱离,可以让元素定位在页面中的任何位置。它是相对于最近的已定位父元素进行定位的。
代码示例:
.container {
position: relative;
width: 100%;
height: 300px;
}
.box {
position: absolute;
top: 50px;
left: 100px;
width: 200px;
height: 100px;
background-color: blue;
}
.container作为定位父元素,position: relative确保它成为定位参照。.box使用position: absolute,它会相对于.container定位,top: 50px; left: 100px表示.box离父元素顶部 50px,离左边 100px。
生活中的例子:
你把一个物品固定在桌子的某个位置,并且不管桌子怎么动,这个物品的位置始终保持不变。
📄 第33页:浮动与 margin
5.3.3 使用 float 和 margin
float 和 margin 通常结合使用,float 用于排列元素,margin 用于调整元素之间的距离。
代码示例:
.container {
width: 100%;
}
.left {
float: left;
width: 45%;
margin-right: 10px;
background-color: red;
}
.right {
float: left;
width: 45%;
background-color: green;
}
- 使用
float: left来让.left和.right两个元素并排显示。 margin-right: 10px设置.left元素右侧与.right元素之间的间距。
生活中的例子:
想象你把两个物品并排放在桌子上,一个物品(left)和另一个物品(right),你在它们之间留了 10px 的空隙。
小可爱总结:
- 三栏布局:通过
float可以实现三个区域的排布,左侧栏、主内容区和右侧栏。 - 绝对定位(absolute) :将元素固定在页面的特定位置,不受其他元素影响。
- 浮动与 margin:浮动让元素并排显示,
margin则用于调整元素间的间距。
📚 第36页:使用 display: table 布局
5.3.4 使用 display: table 布局
在 CSS 中,display: table 用来让元素表现得像一个表格元素。它适合于有复杂结构的布局,能够让你以表格的方式排列元素。
代码示例:
.container {
display: table;
width: 100%;
}
.row {
display: table-row;
}
.cell {
display: table-cell;
border: 1px solid black;
}
.container使用display: table将其变成一个表格。.row使用display: table-row将其变成一行。.cell使用display: table-cell使其成为一个表格单元格。
生活中的例子:
想象你有一个餐桌(容器),桌子上的每一行是菜品(.row),每道菜就是一个菜品单元(.cell)。这些元素就像表格一样,按照行列的方式排列。
📄 第37页:使用 float 布局
5.3.5 使用 float 布局
float 是一个用来让元素向左或向右浮动的属性。它可以让元素脱离文档流,向左或右排列。
代码示例:
.container {
width: 100%;
}
.left {
float: left;
width: 40%;
}
.right {
float: right;
width: 40%;
}
.left和.right都使用float属性,使它们在.container内并排显示。
生活中的例子:
就像你在桌子上把两个物品分别放在左边和右边,桌面空间剩下的区域被它们占据。
📄 第38页:grid 布局
5.3.6 使用 grid 布局
grid 是一种更先进的布局方式,允许你定义一个 二维 网格来布局元素,非常适合复杂的页面布局。
代码示例:
.container {
display: grid;
grid-template-columns: 1fr 2fr;
grid-template-rows: 100px 200px;
}
grid-template-columns: 1fr 2fr表示将容器分成两列,第一列占 1 份,第二列占 2 份。grid-template-rows: 100px 200px表示容器有两行,第一行高 100px,第二行高 200px。
生活中的例子:
想象你在画布上分成了两列,第一列较窄,第二列较宽,然后你在每行上有不同的高度,这样的布局适用于大部分复杂设计。
📄 第39页:CSS 选择器
6. CSS 选择器有什么?优先级如何?哪些能跨域使用?
CSS 选择器用于选中页面中的元素,通过选择器可以修改页面上元素的样式。CSS 选择器有很多种,比如 类选择器、ID 选择器、标签选择器,每种选择器的优先级是不同的。
常见的选择器:
- 类选择器:
.className(选择所有类名为className的元素)。 - ID 选择器:
#idName(选择ID为idName的元素)。 - 标签选择器:
div(选择所有div标签的元素)。
生活中的例子:
就像你给每个盒子贴上不同的标签,然后你根据标签来找盒子。你可以通过标签、编号、或颜色来标记并选择这些盒子。
📄 第40页:选择器的优先级
6.1 选择器优先级
CSS 选择器的优先级决定了哪个样式应用于元素。如果多个选择器作用于同一个元素,优先级高的选择器样式会覆盖优先级低的样式。
选择器优先级:
- 内联样式(最高优先级)
- ID 选择器
- 类选择器、伪类选择器
- 标签选择器(最低优先级)
生活中的例子:
就像你在选择穿什么衣服时,选择的规则有很多。比如,你可能会首先选择你最喜欢的衣服(ID 选择器),如果没有,就会选择一个合适的款式(类选择器),最后才会选择一个普通的衣服(标签选择器)。
小可爱总结:
- 三栏布局:使用
float可以让元素并排显示,display: table用于模拟表格结构。 - float 布局:元素会浮动在页面的左侧或右侧。
- grid 布局:更强大的布局方式,允许你使用网格定义元素的位置。
- CSS 选择器:帮助你选中并操作页面上的元素,优先级较高的选择器会覆盖优先级低的选择器。
📚 第41页:CSS 选择器 - 通配符
6.2. 选择器
CSS 选择器是用来选中 HTML 元素的,根据选择的元素类型不同,选中的方式也不同。
6.2.1 通配符选择器(*)
*是一个通配符选择器,它可以选中页面中所有的元素。- 例子:
* {
color: red;
}
- 这会将页面上所有元素的文字颜色设置为红色。
生活中的例子:
就像你要把桌子上所有的物品都涂上红色,只需要一个命令: “全部涂红” 。
📄 第42页:CSS 选择器 - ID 和类选择器
6.2.2 ID 和类选择器
-
ID 选择器:用
#来选择某个特定 ID 的元素。- 例如:
#header会选中 ID 为header的元素。
- 例如:
-
类选择器:用
.来选择某个类的元素。- 例如:
.menu会选中所有类名为menu的元素。
- 例如:
代码示例:
#header {
background-color: blue;
}
.menu {
font-size: 16px;
}
#header会将id="header"的元素背景色设置为蓝色。.menu会将所有具有class="menu"的元素字体大小设置为 16px。
生活中的例子:
想象你有一个房间,你通过 门的编号(ID)和 房间的标签(类)来区分房间,分别给它们涂上不同的颜色。
📄 第43页:嵌套规则
6.3 嵌套规则
有时候,我们希望根据元素的父子关系来选中某些元素。例如,可以通过嵌套选择器来选择某个元素中的特定部分。
代码示例:
.container div {
color: red;
}
.container > div {
color: blue;
}
.container div选择.container下的所有div元素(包括嵌套的div)。.container > div选择.container直接子元素中的div元素。
生活中的例子:
你可以把某个地方的所有家具都涂成红色(div),但你也可以特别指定“只涂门口那一排的家具”蓝色(直接子元素 div)。
📄 第44页:天选的元素选择器
6.3.1 天选的元素选择器
这种选择器用来选中特定的元素,并且与其他选择器结合使用。常见的有 :first-child、:last-child、:nth-child 等伪类选择器。
代码示例:
ul li:first-child {
color: red;
}
ul li:last-child {
color: green;
}
ul li:nth-child(2) {
color: blue;
}
:first-child会选中ul列表中的第一个li元素,设置它为红色。:last-child会选中ul列表中的最后一个li元素,设置它为绿色。:nth-child(2)会选中ul列表中的第二个li元素,设置它为蓝色。
生活中的例子:
就像你从桌子上拿起几本书,分别选定 第一本书、最后一本书 和 第二本书,然后给它们标上不同的颜色。
📄 第45页:CSS 隐藏元素
7. CSS 中,如何隐藏元素?
隐藏元素是开发中常用的技巧,有几种常用的隐藏方式:
常见的隐藏方式:
display: none;:将元素完全隐藏,从页面流中移除。visibility: hidden;:元素隐藏,但仍占据原来的空间。opacity: 0;:将元素透明度设为 0,虽然看不见,但元素仍然占据空间并能响应事件。
代码示例:
.hidden {
display: none;
}
.hidden-space {
visibility: hidden;
}
.transparent {
opacity: 0;
}
.hidden会完全隐藏元素。.hidden-space会隐藏元素,但仍占据页面空间。.transparent会让元素变得透明,但仍占据空间。
生活中的例子:
想象你有三个物品:隐藏物品,它完全消失不见;隐藏但占位物品,它变得看不见但仍占据空间;透明物品,它变得完全透明但仍然在桌子上。
小可爱总结:
- **通配符选择器 *** :用来选中页面上的所有元素。
- ID 和类选择器:用
#和.来分别选择具有特定 ID 和类的元素。 - 嵌套规则:通过父子关系来选择特定的子元素。
- 天选的元素选择器:通过选择第一个、最后一个或某个特定位置的子元素。
- 隐藏元素的方法:
display: none隐藏元素,visibility: hidden隐藏但占位,opacity: 0让元素透明但不移除。
📚 第46页:CSS 属性 - Display、Opacity 等
7.2. 显示方式
7.2.1 display 属性
-
display用于设置元素的显示行为,它有多个选项:block:使元素成为块级元素,占据整行。inline:使元素成为内联元素,不占据整行。none:隐藏元素,并且不占据任何空间。inline-block:元素行为类似内联元素,但具有块级元素的特性。
div {
display: block; /* 使 div 占据整行 */
}
- 生活案例:想象你有一张桌子,
block就是整个桌子占满了整张桌子,而inline则是你在桌子上放置一块纸,它只占用桌面的一部分空间。
7.2.2 opacity 属性
opacity用于设置元素的透明度。值从 0(完全透明)到 1(完全不透明)之间。
div {
opacity: 0.5; /* 设置元素透明度为 50% */
}
- 生活案例:如果你用玻璃做成的窗户,
opacity就像调整玻璃的透明度,值为 1 是完全透明,而 0.5 是半透明,0 是完全不透明。
7.2.3 visibility 属性
visibility用于控制元素的可见性,设置为hidden会隐藏元素,但元素依然占用空间。
div {
visibility: hidden; /* 隐藏元素但保留空间 */
}
- 生活案例:想象你把一个物品藏起来,
visibility就像把它放进盒子里,尽管你看不到它,但它依然占用桌面的一部分。
7.2.4 clip-path 属性
clip-path用于设置元素的剪裁区域,可以让元素显示特定的区域,超出部分被裁剪掉。
div {
clip-path: circle(50%); /* 把元素裁剪成圆形 */
}
- 生活案例:就像用剪刀剪纸一样,你决定只展示纸上的一部分内容,其他部分被剪掉。
📚 第47页:更多 CSS 属性 - Clip Path、透明度等
7.2.5 position: absolute 与 margin
position: absolute将元素从正常的页面流中移除,可以通过设置top,right,bottom,left属性来确定元素的位置。
div {
position: absolute;
top: 50px;
left: 100px;
}
- 生活案例:假设你把一个箱子从地面上抬起(
position: absolute),你可以准确地将它放置在一个特定的位置,而不管其他物品的位置如何。
📚 第48页:布局技巧 - 使用 display: flex
5.3.5 使用 flex 布局
display: flex用来创建一个弹性布局,能够轻松地让元素在水平和垂直方向上对齐。
.container {
display: flex;
justify-content: center; /* 水平居中 */
align-items: center; /* 垂直居中 */
}
- 生活案例:你有一群朋友站在一起,
flex就像是一种魔法,让他们站得又整齐又均匀,可以轻松调整他们的站位。
📚 第49页:展示多个布局的示例
6. CSS 中的选择器
6.1 选择器的类型
- 选择器有很多种类型,包括 元素选择器、类选择器 和 ID 选择器。
- 元素选择器:直接选择 HTML 元素。
- 类选择器:通过
.来选择某个类的元素。 - ID 选择器:通过
#来选择某个特定 ID 的元素。
h1 {
font-size: 24px;
}
.menu {
color: red;
}
#header {
background-color: blue;
}
- 生活案例:就像在学校里,老师给每个学生穿上不同颜色的衣服,
class就是为所有穿蓝色衣服的学生分配任务,而id则是给一个特定学生安排特别的任务。
📚 第50页:选择器深入解析
6.2 选择器的详细使用
- 父子关系选择器:选择父元素中的特定子元素。
- 相邻兄弟选择器:选择紧接着某个元素的兄弟元素。
.container div {
color: green;
}
.container > div {
color: red;
}
- 生活案例:你是一个老板,
>表示你只关心直接下属(子元素)做的工作,而div选择器则是你关心所有员工的工作。
总结:
- display, opacity, visibility, clip-path 等:这些属性用来控制元素的显示、透明度和剪裁,可以通过它们来灵活地设计网页布局。
- flex 布局:为页面元素提供了一种更直观的排列方式,使得你能够轻松实现居中对齐、等距分布等常见效果。
📚 第51页:CSS 动画与样式应用
8.1 CSS 动画的概念与基本用法
CSS 动画让你可以在网页上制作平滑的过渡和动画效果,使得页面不仅仅是静态的。
@keyframes slide {
0% {
left: 0;
}
100% {
left: 100px;
}
}
div {
animation: slide 2s ease-in-out;
}
- 生活案例:想象你有一个盒子,
@keyframes就是告诉盒子从左边(0%)滑动到右边(100%),而animation就是控制它移动的速度、方式和时长。
8.2 如何让元素平滑过渡
CSS 中的 transition 用于实现元素在状态改变时的平滑过渡。
div {
width: 100px;
height: 100px;
background-color: red;
transition: width 2s;
}
div:hover {
width: 200px;
}
- 生活案例:假设你有一个按钮,
transition就像是按钮从一个大小渐变到另一个大小的动画。鼠标移上去,按钮会慢慢变大,鼠标离开,它又慢慢变小。
8.3 JavaScript 控制动画
通过 JavaScript,你可以更精确地控制动画的触发与停止。
const box = document.querySelector("div");
box.addEventListener("click", () => {
box.style.animation = "slide 2s";
});
- 生活案例:你有一个盒子,点击它后,动画才会触发。就像你按下开关,动画才开始进行。
📚 第52页:CSS 三角形效果
9. CSS 如何画一个三角形
三角形是通过 CSS 的边框技术来实现的。通过调整四个边框的宽度和颜色,只保留一个颜色的边框,其余的设为透明,即可呈现出三角形。
div {
width: 0;
height: 0;
border-left: 50px solid transparent;
border-right: 50px solid transparent;
border-bottom: 50px solid red;
}
-
生活案例:就像用透明胶带将三角形的三条边固定,而中间留空,最终得到一个纯色的三角形。
-
解释:
border-left和border-right被设置为透明,这使得它们不可见。border-bottom设置为一个实际的颜色(如红色),形成了底部的边。- 宽度和高度为 0,因此剩下的就是一个三角形。
9.2 实现案例:城市位置图标
为了给城市名称添加位置图标,使用了前面的三角形效果,并通过相对定位来让图标显示在正确的位置。
.icon {
position: relative;
}
.icon::after {
content: '';
position: absolute;
top: 10px;
left: 50%;
transform: translateX(-50%);
width: 0;
height: 0;
border-left: 10px solid transparent;
border-right: 10px solid transparent;
border-top: 10px solid red;
}
- 生活案例:就像你在城市的地图上放了一个图标,图标下方有一个小三角形指示你所在的位置。
第56-60页 解释
9.2 CSS 动画制作三角形效果
在这一部分,我们学习如何利用 CSS 创建不同形状的图形,尤其是如何使用 border 创建三角形。
9.3 CSS 创建动态效果(例如:三角形、圆形)
我们可以利用 border 技巧来制作不同形状的图形。通过设置透明边框并指定颜色,我们可以控制图形的方向和大小。
代码实例:
div {
width: 0;
height: 0;
border-left: 50px solid transparent;
border-right: 50px solid transparent;
border-bottom: 50px solid red;
}
-
解释:
width和height设置为0,我们不需要定义盒子的宽度和高度。border-left和border-right设置为透明,显示不出来的边,只有border-bottom设置了颜色,形成了三角形。border-bottom: 50px solid red;这一行决定了三角形的颜色。
-
生活类比:
- 就像一个矩形的框框只留下一个带颜色的边(这里是底边),去掉剩下的边后,剩下的就是一个形状为三角形的图案。
9.4 多种三角形组合
通过改变 border 的大小和颜色,我们可以将多个三角形组合成更复杂的图形。
- 例如,可以通过设置不同的
border来组合多个色块,最终形成一个具有不同颜色的矩形或其它形状的图案。
第10页:CSS 完成视觉交互效果
我们接下来要学习如何使用 CSS 完成一些动态效果,比如页面上的动画或视觉效果。
10.1 动态效果与交互
CSS 动画和交互可以在网页上实现一些非常炫酷的效果,这些效果可以通过 @keyframes 来定义。常见的效果有旋转、颜色变化、位置变化等。
例如,我们可以制作一个简单的按钮,点击后改变颜色:
@keyframes changeColor {
0% {
background-color: red;
}
100% {
background-color: blue;
}
}
button:hover {
animation: changeColor 0.5s ease-in-out;
}
-
解释:
@keyframes定义了一个动画,我们让按钮的背景颜色从红色渐变到蓝色。button:hover表示鼠标悬停时触发动画。
-
生活类比:
- 就像你看到一个按钮,按下去会改变它的颜色(比如从红色变成蓝色),这就是一种交互效果。
10.2 其它交互效果:
hover效果:当鼠标悬停时改变元素的样式。focus效果:元素获得焦点时发生样式变化。active效果:元素被点击时发生样式变化。
通过这些交互效果,你可以让页面上的元素变得更有趣和吸引用户。
总结:
- CSS 动画 使得页面内容变得动态,通过
@keyframes和transition可以在页面元素之间添加平滑的动画效果。 - CSS 三角形 使用
border属性来绘制,设置透明边框并指定一个带颜色的边,从而创建不同形状的图形。 - 交互效果 让用户与页面进行互动时,元素样式发生变化,提高用户体验。
第61-65页解释
10.2 背景定位:背景图片的定位
背景定位有一个很重要的属性是 background-attachment,它控制背景图片是否随页面滚动,常见的值有:
scroll:默认值,背景会随着页面滚动。fixed:背景图片固定在视口,不会随页面滚动。
background-attachment: fixed;
- 解释: 使用
background-attachment: fixed时,背景图像会固定在屏幕上,滚动页面时背景不动。 - 生活案例: 就像你在网页上看到的固定背景(例如一张壁纸),无论你滚动页面,它总是在同一个地方。
10.2.1 background-attachment 示例
body {
background-image: url('image.jpg');
background-attachment: fixed;
background-size: cover;
}
- 解释: 这段代码使背景图片固定在页面上,并确保背景图片完全覆盖整个页面。
- 生活案例: 就像一张墙纸,贴在墙上,不随你移动而移动。
10.2.2 translate3d
translate3d 是一个可以在 3D 空间内平移元素的方法。它接受三个值:translate3d(x, y, z),分别表示在 X、Y、Z 轴上的平移。
div {
transform: translate3d(100px, 50px, 0);
}
- 解释: 上面的代码会让元素在水平(X轴)方向平移 100px,垂直(Y轴)方向平移 50px。Z轴通常用于调整元素的深度(例如使其更靠近或远离屏幕)。
- 生活案例: 就像你推着一辆小车,既可以推动它向前(X轴),也可以推到旁边(Y轴),同时也可以让它变得更远或更近(Z轴)。
10.3 示例展示
这些示例展示了如何通过 CSS 动画来给页面元素添加动感。background-attachment: fixed 可以让背景保持静止不动,而其他元素则可以自由移动。
总结
这些知识点帮助我们实现页面中各种动态和静态背景效果,增强用户的视觉体验。通过这些技术,你可以将一个简单的网页,转变为更具互动性和视觉冲击力的网页,提升用户的整体体验。
第66-70页知识点解读
11. CSS3 新增的特性
在CSS3中,很多新的特性被引入来增加页面的表现力和互动性。以下是一些CSS3新增的特性:
- transitions(过渡效果) :用来平滑地过渡到新样式。我们可以设置在某些属性发生变化时,元素的过渡动画效果。
- transforms(变换效果) :用于旋转、缩放、倾斜、平移元素。通过
transform,我们可以让元素进行多种形态的变化。 - animations(动画) :比transitions更复杂的动画功能,可以设置多个步骤,使元素能够根据定义的关键帧发生多个变化。
- flexbox 和 grid:这两个是CSS布局的现代方法,提供了更加灵活和强大的布局控制。
11.1 新增特性的类别
CSS3新增的特性有很多种,它们分别用于:
- visual(视觉效果)
- layout(布局)
- transformations(变换)
- animations(动画)
- text effects(文本效果)
11.2 常见的新特性(详细介绍)
-
background-clip:这个属性控制背景图像或背景颜色的绘制区域。可以控制背景只显示在元素的某一部分,如
content-box,padding-box等。background-clip: content-box;- 解释: 这个属性指定了背景颜色/图片只会显示在元素的内容区域,而不会扩展到内边距或边框区域。
- 生活例子: 比如你给一张纸涂上背景色,而不让颜色扩展到纸的边缘。
-
background-size:设置背景图片的尺寸,可以控制它的缩放。
background-size: cover;- 解释:
cover会让背景图覆盖整个元素的区域,即使需要裁剪图片。 - 生活例子: 你用一张纸盖住桌面,纸的尺寸可以变大或小,确保它完全覆盖桌面,可能会超出桌面一部分。
- 解释:
-
word-wrap:这个属性控制文本是否能在容器边界内换行。
word-wrap: break-word;- 解释: 如果文本超出容器宽度,它会强制在合适的位置换行,避免文本溢出。
- 生活例子: 比如你有一长段文本,像把一段长长的绳子折叠,确保它不会超出桌子。
-
text-overflow:当文本溢出容器时,可以使用这个属性来控制显示的方式。常用的值有
ellipsis,表示用省略号代替溢出的文本。text-overflow: ellipsis;- 解释: 当文本超出容器的可见区域时,显示为“...”,并不让文本溢出到容器外。
- 生活例子: 就像你写字在纸上,字写得太长,纸张不够,最后只能显示“...”。
-
text-shadow:为文本添加阴影效果。
text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);- 解释: 为文本添加一个阴影,可以指定阴影的偏移量和模糊程度。
- 生活例子: 想象一下在黑暗的背景下放置一个文字,文字的后面会有模糊的阴影,使其更加显眼。
总结
这些CSS3新增的特性,提供了更强的布局控制、更精美的视觉效果、更丰富的动画和转换效果。它们帮助开发者更加灵活地创建动感十足的网页,提升用户的视觉体验。
希望你能用生活中的例子来记住这些CSS技巧:比如用绳子代表文本、纸张代表容器、背景色就像墙纸,背景图片就像贴纸,文字阴影就像在光线下的影子。这些具体的比喻可以帮助你更容易理解这些属性。
第71–75页讲解:CSS3 动画与过渡效果 🌀
(这一部分非常重要,是面试和实战中最常考的地方之一~)
🧩 第71页:transition(过渡)
🌈 1. 是什么
transition 就像“缓慢变色的灯光”,可以让元素从一种样式平滑地过渡到另一种样式。 👉 没有它,变化会“嗖”一下完成;有它,变化会“慢慢地滑过去”。
💡 2. 语法格式
transition: 属性名 持续时间 速度曲线 延迟时间;
🌰 3. 示例
div {
width: 100px;
height: 100px;
background: skyblue;
transition: all 1s ease;
}
div:hover {
width: 200px;
background: pink;
}
🧠 通俗解释:
- 鼠标放上去时,div 变宽、变色都会慢慢发生;
- 就像按电梯按钮后门慢慢打开一样,而不是“咣”一下。
📍关键词记忆:
“Transition 像电梯开门” —— 慢慢变化、自动平滑。
🌀 第72页:transform(变形)
🌈 1. 是什么
transform 让元素能做出“物理上的变形”——像缩放、旋转、平移、倾斜。
🧱 2. 常见类型
| 效果 | 示例 | 说明 |
|---|---|---|
| 缩放 | scale(1.5) | 变大 1.5 倍 |
| 平移 | translate(100px, 50px) | 向右100px、向下50px |
| 旋转 | rotate(45deg) | 顺时针旋转45° |
| 倾斜 | skew(20deg, 10deg) | 水平倾斜20°,垂直10° |
🧠 生活类比:
“Transform 像魔术师”——能让物体瞬间变大、变小、漂浮、旋转。
🌰 3. 示例代码
div {
width: 100px;
height: 100px;
background: tomato;
transform: rotate(45deg);
}
🔍 效果:div 旋转 45°。 💬 像你把一个正方形卡片斜着放一样。
🎬 第73页:animation(动画)
🌈 1. 是什么
animation 是“比 transition 更强大的版本”。 它可以让元素循环播放复杂的变化,通过关键帧控制每个阶段。
🧩 2. 必要组成
@keyframes move {
0% { left: 0; }
100% { left: 200px; }
}
div {
position: relative;
animation: move 2s infinite alternate;
}
🔍 参数解释:
| 属性 | 含义 |
|---|---|
@keyframes | 定义动画的关键帧 |
animation-name | 动画名称 |
animation-duration | 动画持续时间 |
animation-iteration-count | 动画循环次数(infinite 为无限) |
animation-direction | 播放方向(alternate 往返) |
🧠 生活类比:
“Animation 像跳舞”——每个关键帧都是一个舞步,舞者(元素)跟着节奏变化姿势。
💡 第74页:transform + transition 联合使用
这页讲了如何把过渡和变形结合起来。 👉 举例:鼠标放上去时,元素慢慢旋转放大。
.box {
width: 100px;
height: 100px;
background: coral;
transition: all 1s;
}
.box:hover {
transform: rotate(360deg) scale(1.2);
}
🧠 形象记忆:
就像“风车转动”——你靠近时它慢慢旋转,还稍微变大一点!
✨ 第75页:总结要点
| 特性 | 功能 | 类比记忆 |
|---|---|---|
transition | 平滑过渡 | 电梯门缓慢打开 |
transform | 变形(旋转/缩放) | 魔术师变幻 |
animation | 连续动画 | 跳舞的关键帧动作 |
💬 小可爱速记口诀:
“电梯开门(transition)—— 魔术变身(transform)—— 连续舞蹈(animation)💃”
有了这三兄弟,CSS 就从“静态网页”变成了“会动的小精灵”✨
第76–80页:CSS 动画与 Grid 网格布局 💫
🎞️ 12.2.3 animation(动画)属性详解
CSS 的动画系统就像一场“舞蹈表演”,每个元素都可以根据关键帧(@keyframes) 去“跳舞”。
🧩 animation 常见属性总结表:
| 属性名 | 作用 | 示例 |
|---|---|---|
animation-name | 动画名称,对应 @keyframes 定义 | move |
animation-duration | 动画时长 | 2s |
animation-delay | 延迟执行时间 | 1s |
animation-iteration-count | 播放次数 | infinite(无限循环) |
animation-direction | 动画方向 | alternate(来回播放) |
animation-timing-function | 速度曲线 | ease、linear、ease-in、ease-out |
animation-fill-mode | 动画结束后保留状态 | forwards |
🌰 示例(第76页代码):
@keyframes move {
0% { transform: translateX(0); }
100% { transform: translateX(200px); }
}
.box {
width: 100px;
height: 100px;
background: coral;
animation: move 2s infinite alternate;
}
📘 解释:
- 方块从左移到右,来回摆动。
infinite表示“永不停止”;alternate表示“来回往复”。
🧠 生活案例:
像猫追着激光点跑来跑去,左一下右一下,永远不会累 🐈⬛💨。
🧱 13. Grid 网格布局简介(第78–80页)
🎯 13.1 什么是 Grid 布局?
Grid 是 CSS3 引入的二维布局系统,用来轻松实现复杂的网页布局。 如果说 flex 是“单行/单列布局”, 那 grid 就是“表格式多行多列布局”。
🧩 Grid 基本结构
HTML 示例:
<div class="container">
<div class="item item1">One</div>
<div class="item item2">Two</div>
<div class="item item3">Three</div>
<div class="item item4">Four</div>
<div class="item item5">Five</div>
<div class="item item6">Six</div>
</div>
CSS 示例:
.container {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: repeat(2, 200px);
gap: 10px;
}
📖 代码讲解:
| 属性 | 含义 |
|---|---|
display: grid | 启用网格布局模式 |
grid-template-columns | 定义列数(如3列,每列平分宽度) |
grid-template-rows | 定义行高(如2行,每行200px) |
gap | 设置格子之间的间距 |
🧠 生活案例理解:
把网页想象成一个蛋糕盒子🍰:
- “
grid-template-columns” 就是把盒子分成几列; - “
grid-template-rows” 是分成几层; - “
gap” 就是每块蛋糕之间的空隙。
📦 你在盒子里放6块蛋糕(div) ,它们会自动整齐排列成一个3x2的格子。 这就是 Grid 的魅力:对齐整齐、比例均匀、可控性超强。
🌈 Grid 的优势
✅ 一次性定义整版布局,不用嵌套多层 div。 ✅ 每个“格子”都能精确定位。 ✅ 能同时控制行与列(而 flex 只能一维控制)。
📎 小可爱记忆口诀:
🧱 Grid 是二维魔方,布局一次全搞定! 横竖都能分,像切蛋糕一样整齐🍰
💡
display: grid= “打开格子模式”;grid-template-columns= “切几块”;gap= “蛋糕之间的缝”。
✅ 总结(第80页)
动画(Animation)是“让元素跳舞”💃 Grid 是“让页面排队”📏
前者动感,后者整齐。 这俩组合起来,就是既“会动的页面”,又“排得漂亮”的网页 🎨
🧩 第81–85页讲解:Grid 网格布局进阶(布局神器登场)
✅ 13.2.1 display: grid
这是 Grid 布局的开关。 只要你写上这一行:
.container {
display: grid;
}
整个容器立刻变成一个“网格系统”,里面的每个元素(div)都自动变成格子里的小方块。
📦 生活类比: 就像你把一个空的收纳盒摆在桌上,每个小格子都能放一个东西。只要打开“格子模式”,所有物品就自动排列整齐~
🧱 13.2.2 grid-template-columns 与 grid-template-rows
定义列数和行高,控制“格子切割”的方式。
.container {
display: grid;
grid-template-columns: 100px 200px 1fr;
grid-template-rows: 100px 100px;
}
📖 解释:
- 创建一个 3列 × 2行 的网格;
- 前两列固定宽度(100px、200px);
- 第三列用
1fr(自适应剩余空间); - 每一行的高度都是 100px。
🧠 记忆法:
“grid-template” = 切格子的模具 columns = 垂直切几刀 rows = 横着切几刀
🍰 生活案例: 想象你在切蛋糕:
- “grid-template-columns” 是竖着切几块;
- “grid-template-rows” 是横着切几层。
🔢 13.2.3 grid-row-gap、grid-column-gap、grid-gap
这三个属性用来设置格子之间的“间距”。
.container {
grid-row-gap: 20px; /* 行间距 */
grid-column-gap: 10px; /* 列间距 */
grid-gap: 10px 20px; /* 同时设置 */
}
📘 总结:
grid-row-gap: 上下格子的间距grid-column-gap: 左右格子的间距grid-gap: 两个一起设
💡 小技巧: 新版 CSS 已简化为一个属性:
gap: 10px 20px;
📦 生活比喻:
就像摆放九宫格甜点,每块中间要留点空隙,不然奶油会挤在一起(那就糊成灾难啦😅)。
🗺️ 13.2.4 grid-template-areas(布局模板)
通过名字给格子定义位置,像拼图一样自由。
.container {
display: grid;
grid-template-areas:
"header header header"
"sidebar main main"
"footer footer footer";
grid-template-columns: 100px 1fr 1fr;
grid-template-rows: 80px 1fr 50px;
}
.header { grid-area: header; }
.sidebar { grid-area: sidebar; }
.main { grid-area: main; }
.footer { grid-area: footer; }
📖 解释:
- 上方一整行是
header; - 左下角一列是
sidebar; - 中间是
main; - 底部是
footer。
🧩 理解口诀:
“写出格子地图,名字自动归位”。
📘 生活类比:
像在“厨房摆家具”: 冰箱放左边(sidebar), 炉灶中间(main), 抽油烟机在最上(header), 垃圾桶放最下(footer)。
🔄 13.2.5 grid-auto-flow(自动填充方向)
控制多余的格子怎么自动排列。
.container {
display: grid;
grid-auto-flow: row; /* 默认按行填充 */
}
常用值:
row:按行放(默认);column:按列放;row dense:按行放且自动补空格(像俄罗斯方块)。
📦 生活类比:
“grid-auto-flow” 就像你往收纳盒里放东西:
- 按行放:一行一行排;
- 按列放:一列一列塞;
dense模式:会自动“补洞”,像整理高手。
📐 13.2.6 justify-items、align-items、place-items
用于对齐格子里的内容。
.container {
justify-items: center; /* 水平居中 */
align-items: center; /* 垂直居中 */
place-items: center; /* 两个合并写法 */
}
📘 区别口诀:
“justify” 管横向, “align” 管纵向, “place” 是二合一。
🧠 生活比喻:
像整理书架:
justify-items: start→ 靠左排书;center→ 居中放好;end→ 靠右收紧。
⚙️ 13.2.7 justify-content、align-content、place-content
用来调整整个网格在容器里的位置。
.container {
justify-content: center;
align-content: center;
}
📘 区别:
justify-content:控制整个网格在水平方向的位置;align-content:控制网格整体在垂直方向的位置;place-content:两个合写。
📦 生活比喻:
想象你把一个九宫格拼图放进盒子里,
justify-content= 左右移动盒子,align-content= 上下调整位置。
🧠 小可爱总结记忆法(第85页)
| 属性 | 功能 | 生活类比 |
|---|---|---|
grid-template-columns | 定义列宽 | 蛋糕竖着切几块 🍰 |
grid-template-rows | 定义行高 | 横着切几层 |
gap | 设置间距 | 奶油留空 |
grid-template-areas | 定义格子区域 | 拼家具位置图 |
grid-auto-flow | 自动放置规则 | 塞收纳格 |
justify/align-items | 格子内容对齐 | 摆书方式 |
justify/align-content | 网格整体对齐 | 移动整个书架 |
✨ 口诀:
“切格子 → 留缝隙 → 定区域 → 填空格 → 调对齐” Grid 就像一个聪明的“网页收纳师”📦, 让你的页面既整齐又优雅 ❤️
🌈 第86–90页讲解:Grid进阶与Flexbox弹性布局入门
🧩 一、Grid的更多属性(第86~88页)
🧱 13.2.8 grid-auto-columns / grid-auto-rows
💡 当你没明确定义所有格子时(比如放的元素超出了设定的行列范围),浏览器会自动创建新的行列。 这两个属性用来控制这些“临时生成的格子”多大。
.container {
display: grid;
grid-auto-rows: 150px;
grid-auto-columns: 200px;
}
📘 例子说明:
- 网格原本只定义了两列两行,但你后来放了第5个元素,它会自动补出新行;
- 新行就会用
grid-auto-rows的高度(150px)。
🧠 记忆法:
这是“Grid 的应急方案”——多出来的格子别慌,我帮你自动补齐尺寸!
📏 13.2.9 grid-column-start / end 与 grid-row-start / end
这些属性决定元素在网格中从哪一行哪一列开始,到哪结束。 通俗点说,就是“格子跨几格”。
.item1 {
grid-column-start: 1;
grid-column-end: 3;
}
📖 解释: item1 从第1列开始,到第3列结束 → 意味着它占了两列宽度。
🌰 例子: 页面上三个色块,红色方块(1号)横跨两列,其他方块正常占一格。
🧠 生活类比:
就像Excel里合并单元格一样! 比如表头要横跨两列,就用
grid-column: 1 / 3。
🧩 13.2.10 grid-area
这是个超级简写属性,能一次性定义:
grid-row-start / grid-column-start / grid-row-end / grid-column-end
比如:
.item1 {
grid-area: 1 / 1 / 3 / 3;
}
📘 含义: 从第1行第1列开始,到第3行第3列结束(跨2行2列)。
✨ 总结一句话记忆:
grid-area= “我在哪开始,在哪结束”——四个数字搞定定位。
🎯 13.2.11 justify-self、align-self、place-self
用于控制单个格子内元素的对齐方式。
.item1 {
justify-self: center; /* 横向居中 */
align-self: end; /* 纵向靠底 */
}
🌈 place-self 是简写:
place-self: center end;
= 横向居中 + 纵向靠底。
🧠 生活例子:
imagine你在收纳盒里放了一个小玩偶,
justify-self= 左中右放哪里;align-self= 上中下放哪里。place-self= 一次决定两个方向的位置。
🧩 二、Grid兼容性(第89页)
最后,书中展示了一个浏览器支持表格。 ✅ Chrome、Edge、Firefox、Safari 等主流浏览器全部支持。 ❌ 只有非常老的 IE 不支持(可以直接忽略它 🧓)。
📘 小贴士: 如果项目必须兼容老旧系统,建议改用 flexbox 或带前缀版本(display: -ms-grid)。
🧱 三、Flexbox 弹性布局入门(第90页)
🚀 14.1 什么是 Flexbox?
Flexbox(全称 Flexible Box)——弹性布局模型,是一种让容器里的元素“自动分配空间、对齐灵活”的布局方式。
💡 一句话概括:
“Grid 像表格,Flex 像橡皮筋。”
📦 它更适合:
- 一维布局(横排或竖排)
- 动态自适应(内容多少都能撑开)
🧩 14.2 属性介绍(Flex容器属性)
主要分两类: 1️⃣ 作用于 父容器(flex container) 2️⃣ 作用于 子元素(flex item)
🔄 14.2.1 flex-direction
控制主轴方向(横排还是竖排):
.container {
display: flex;
flex-direction: row; /* 默认:从左到右 */
}
常见值:
| 值 | 方向 | 举例 |
|---|---|---|
row | 水平从左到右 | 默认值 |
row-reverse | 水平从右到左 | 导航栏倒序 |
column | 垂直从上到下 | 竖版布局 |
column-reverse | 垂直从下到上 | 底部弹出栏 |
🧠 生活类比:
“row” 像排队买奶茶(横着一排); “column” 像电梯乘客(竖着排上去)。
📘 总结一句话(第90页核心)
Grid 像整理收纳盒(二维)📦 Flex 像橡皮筋队列(一维)🧘♀️
- Grid 强在“布局结构”;
- Flex 强在“元素分布”。
💡 小可爱记忆口诀:
“Grid 帮我切格子,Flex 帮我排队子!” 🧠✨
🧩 第91–95页讲解:Flexbox 弹性布局核心属性篇(入门到灵魂)
🌈 一、flex-direction(主轴方向)复习(第91页)
.container {
display: flex;
flex-direction: row; /* 默认横向排列 */
}
📘 四种常用值:
| 值 | 意义 | 说明 |
|---|---|---|
row | 从左到右(默认) | 常见水平导航栏 |
row-reverse | 从右到左 | 元素顺序反转 |
column | 从上到下 | 垂直排列,类似列表 |
column-reverse | 从下到上 | 反向堆叠布局 |
🧠 生活类比:
像是“排队买奶茶”:
row:大家横着排成一排;column:大家竖着排;reverse:后面的人插队到前面(倒序排列)。
🌊 二、flex-wrap(换行控制)
让元素是否换行。
.container {
flex-wrap: wrap;
}
📖 常见取值:
| 值 | 意义 |
|---|---|
nowrap | 不换行(默认) |
wrap | 超出宽度自动换行 |
wrap-reverse | 反向换行(从下往上) |
🧠 生活类比:
想象你在书架上放书 📚:
nowrap:硬塞在一行上;wrap:放不下就自动换层;wrap-reverse:从下层往上叠。
🧩 三、flex-flow(简写组合)
这是 flex-direction 和 flex-wrap 的组合写法。
.container {
flex-flow: row wrap;
}
相当于:
flex-direction: row;
flex-wrap: wrap;
📦 生活比喻:
“排队方向 + 是否换行” 一次搞定,就像“从左往右排,并且太多人就自动分两排”。
⚙️ 四、justify-content(主轴对齐方式)💡第92页重点
控制元素在主轴方向(横向或纵向) 的对齐。
.container {
justify-content: space-around;
}
| 值 | 效果 | 说明 |
|---|---|---|
flex-start | 靠起点 | 全部靠左或靠上 |
flex-end | 靠终点 | 全部靠右或靠下 |
center | 居中 | 整体居中 |
space-between | 两端对齐 | 元素之间平均分布 |
space-around | 两侧留空 | 间距更柔和 |
space-evenly | 全等间隔 | 每个间距都一样 |
🧠 生活比喻:
像几个人坐沙发:
flex-start:全挤在一边;center:坐中间;space-between:两头有人,中间平均分;space-around:每人左右都空点;space-evenly:每人之间距离完全一样(最整齐)。
📐 五、align-items(交叉轴对齐)💡第93页
控制所有子元素在垂直方向的对齐(如果主轴是横向)。
.container {
align-items: center;
}
| 值 | 效果 | 说明 |
|---|---|---|
flex-start | 顶对齐 | |
flex-end | 底对齐 | |
center | 垂直居中 | |
stretch | 拉伸填满容器 | |
baseline | 文字基线对齐 |
🧠 生活比喻:
一排同事站拍照:
flex-start:大家都站着;flex-end:大家蹲下;center:都半蹲;stretch:有高个子拼命伸长;baseline:让所有人的“下巴线”对齐(文字基线)。
🪄 六、align-content(多行对齐)💡第94–95页
当有多行flex元素时,控制整个行组的垂直对齐方式。
.container {
flex-wrap: wrap;
align-content: space-between;
}
| 值 | 效果 |
|---|---|
flex-start | 全部行挤在上面 |
flex-end | 全部行挤在下面 |
center | 所有行居中 |
space-between | 两端对齐(上下分布) |
space-around | 每行间隔留空 |
stretch | 每行自动拉满 |
📦 生活比喻:
想象多层衣柜放叠好的衣服:
flex-start:都堆上面;flex-end:都往下挤;center:放中间;space-between:上下贴边;space-around:每层衣服之间有空隙;stretch:每层都铺满柜子。
🌟 小可爱速记口诀
🧭
justify→ 横向排队 🎯align-items→ 单行垂直对齐 🧱align-content→ 多行垂直分布
🧠 一张脑图记住Flex核心概念:
| 分类 | 控主轴 | 控交叉轴 |
|---|---|---|
| 对齐单个 | justify-content | align-items |
| 对齐多行 | align-content | — |
💬 最后一句总结(第95页)
💡 Flex 就像是一根“可伸缩的橡皮筋”——
justify-content拉左右,align-items调上下,wrap让它能换行, 一套下来,网页元素像队形一样自动排好队 🧃✨
🌟 第96–100页讲解:Flexbox 子项核心属性 + 设备像素概念篇
🧩 一、order(排序)——谁先谁后?【第96页】
.item1 { order: 2; }
.item2 { order: 1; }
.item3 { order: 3; }
📘 作用: 控制子元素的显示顺序(默认都是 0,数值越小越靠前)。
🧠 通俗理解:
“网页里的小盒子像排队领奶茶🍵,order 就是排队号。”
- order 小的先被服务(排在前面)
- order 大的靠后显示
🧩 二、flex-grow(放大比例)——盒子谁能长胖?【第96–97页】
.item1 { flex-grow: 1; }
.item2 { flex-grow: 2; }
📖 解释:
- 控制多余空间“如何分配”给子元素。
- 值越大,占的剩余空间越多。
✨ 例子: 容器宽 600px,里面三个子项:
.item1 { flex-grow: 1; }
.item2 { flex-grow: 2; }
.item3 { flex-grow: 1; }
👉 总比例 = 1+2+1=4 所以宽度分配为:
- item1:150px
- item2:300px
- item3:150px
📦 生活比喻:
三个人吃披萨 🍕:
- 每人分的“饼”比例由
flex-grow决定;- 值越大,吃得越多。
🧩 三、flex-shrink(收缩比例)——盒子谁要变瘦?【第97–98页】
.item1 { flex-shrink: 0; }
.item2 { flex-shrink: 1; }
📖 作用: 当空间不够时,元素按比例“缩小”。
flex-shrink: 0→ 不缩!像“拒绝节食”的人;flex-shrink: 1→ 可以按比例缩;- 值越大,越容易被压缩。
🍱 生活比喻:
当网页宽度变窄,就像桌子太小: 有人不让位置(
shrink:0), 有人勉强挪点(shrink:1), 最后大家只能“瘦身”才能都坐下。
🧩 四、flex-basis(初始大小)——盒子默认有多大?【第98页】
.item {
flex-basis: 200px;
}
📘 解释:
- 表示元素在分配空间前的“基础宽度”。
- 如果和
width冲突,以flex-basis为准。
⚙️ 综合示例:
.item {
flex: 1 0 200px; /* grow shrink basis */
}
等价于:
flex-grow: 1;
flex-shrink: 0;
flex-basis: 200px;
🧠 记忆法:
“basis” = 基础体积(初始大小) 想象你先分配一个基础盒子大小,再看谁能变胖或变瘦。
🧩 五、align-self(单个元素对齐)【第99页】
控制单个元素的对齐方式,覆盖父容器的 align-items。
.item1 {
align-self: flex-end;
}
📘 常见值:
| 值 | 效果 |
|---|---|
auto | 跟随父容器 |
flex-start | 顶部对齐 |
flex-end | 底部对齐 |
center | 居中 |
stretch | 拉伸填满 |
🎯 生活比喻:
就像团队合照 📸:
- 大家都站着(align-items: center);
- 有个调皮鬼蹲下(align-self: flex-end);
- 他独立行事,不听指挥。
🧩 六、Flex 子项属性总结口诀(第99页)
| 属性 | 功能 | 生活比喻 |
|---|---|---|
order | 排序 | 排队号 |
flex-grow | 变胖 | 吃披萨分大块 |
flex-shrink | 变瘦 | 桌子太小挤一挤 |
flex-basis | 默认体型 | 初始体积 |
align-self | 独立对齐 | 团队里蹲下的调皮鬼 |
📘 一句话记忆:
“先排队(order),再长胖(grow),挤一挤(shrink), 量体裁衣(basis),最后单独站位(align-self)。”
🌟 七、flex 简写终极公式
flex: [grow] [shrink] [basis];
例如:
flex: 1 0 200px;
= “能长胖、不缩小、起始宽度200px”。
💡 默认值:flex: 0 1 auto;
🧠 口诀:
“flex 三兄弟:grow 胖、shrink 瘦、basis 初始秀。”
📱 八、设备像素、CSS像素、DPR、PPI(第100页)
🧠 15.1 定义:这些名词的关系图
CSS 像素(逻辑单位) → 显示在屏幕上时,会映射成 设备像素(实际物理点)
DPR = 每个 CSS 像素占几个设备像素 PPI = 每英寸的像素点密度
🎨 15.2 详解
🧩 15.2.1 CSS像素
网页开发中使用的虚拟像素单位。
div {
width: 100px;
}
这“100px”不是屏幕上的真实物理像素,而是浏览器逻辑像素。
🧠 生活比喻:
CSS 像素就像“地图比例尺”上的厘米,不是现实的米。
📺 15.2.2 设备像素(Device Pixel)
屏幕上的物理小点(屏幕硬件能点亮的最小单元)。
举例: iPhone 14 Pro 屏幕宽 1179 个物理像素。
🔍 15.2.3 DPR(设备像素比)
DPR = 设备像素 / CSS像素 决定了清晰度与缩放。
💡 例:
- DPR = 1 → 1个CSS像素 = 1个设备像素
- DPR = 2 → 1个CSS像素 = 2×2物理像素(Retina高分屏)
🧠 记忆:
DPR 越高,屏幕越“细腻”,像素点越密。
🧮 15.2.4 PPI(像素密度)
PPI = 每英寸像素点数 PPI 越高,图像越清晰。
📦 生活比喻:
PPI 就像“画布的像素密度”—— 一张小画布挤更多点,画面更细腻。
🌈 小可爱总结记忆表(第100页)
| 概念 | 中文名 | 举例 | 类比 |
|---|---|---|---|
| CSS 像素 | 网页逻辑像素 | 100px div | 地图比例尺上的厘米 |
| 设备像素 | 屏幕实际点 | iPhone屏幕点阵 | 实际砖块 |
| DPR | 设备像素比 | 2x、3x 屏 | 放大倍数 |
| PPI | 像素密度 | Retina高清屏 | 每英寸砖块数 |
✨ 一句话总结:
“CSS像素写网页,设备像素点屏幕, DPR调缩放,PPI定清晰。” 💻📱
📘 第101–105页讲解:像素原理 + 单位区别通俗版(小白速记)
🧩 一、设备像素 & CSS像素 复盘(第101–102页)
🔍 15.2.2 设备像素(Device Pixel)
就是屏幕上一个个实际发光的小点。 每个像素通常由 红 (R) 、绿 (G) 、蓝 (B) 三个子像素组成。 当这三种颜色亮度不同时,就能显示出各种颜色。
📘 图片中三张网格图(RGB排列):
- 左边:普通屏像素点大;
- 中间:Retina(高分屏)更密;
- 右边:4K 屏最细腻(像素点超小)。
🧠 生活比喻:
把屏幕想象成一面“彩色积木墙 🧱”, 每个积木块就是一个像素。积木越小、越密,画面就越细。
🧮 15.2.3 设备独立像素(CSS像素)
开发者写的网页像素(width: 100px;)其实不是物理像素,而是一种“逻辑单位”。 浏览器会自动把它换算成屏幕能显示的实际像素数量。
💡 举例:
- 网页写:
width: 100px; - 在普通屏上可能真是 100 物理像素;
- 在 Retina 屏(2x)上,实际是 200 个像素点显示。
🧠 类比:
CSS 像素 = “地图上的 1 厘米”; 设备像素 = “现实中的 1 米”。 不同屏幕密度下,比例尺不同而已。
🧩 二、DPR(设备像素比)公式【第103页】
📘 公式:
DPR = 设备像素 / 设备独立像素
💡 举例:
- 普通屏幕:1 个 CSS 像素 = 1 个物理像素 → DPR = 1
- Retina 屏幕:1 个 CSS 像素 = 4 个物理像素(2x2) → DPR = 2
📸 图示说明:
- 左边 Standard:每个方格 1:1;
- 右边 Retina:每个方格被细分为 4 小格,更细腻。
🧠 生活比喻:
就像你画一只猫 🐱:
- 普通纸:1cm 画一只猫 → 模糊;
- 高分纸(Retina):1cm 里能点 4 个点 → 超精细!
📏 三、PPI(每英寸像素密度)【第104页】
📘 公式:
PPI = √(X² + Y²) / 屏幕尺寸(英寸)
其中:
- X = 水平方向像素数
- Y = 垂直方向像素数
- 分子是屏幕对角线像素长度,分母是屏幕实际对角线长度
💡 举例: 13英寸 MacBook Pro 分辨率 2560x1600 👉 PPI = √(2560² + 1600²) ÷ 13 ≈ 227 → 所以画面细腻到爆 💎
🧠 生活类比:
PPI = “画布的密度”。 一英寸上挤越多点,画越细; 就像绣花针脚越密,图案越精致 🌸。
🧩 四、15.3 总结(第104页结尾)
- 设备像素:屏幕硬件点
- CSS像素:网页用的逻辑单位
- DPR:两者比例
- PPI:屏幕清晰度指标
🧠 一句话总结:
“CSS像素写代码,DPR调放大倍数,PPI定清晰等级。”
🧮 五、CSS长度单位全家桶(第105页开头)
💬 16.1 引言
网页的长度、字体、间距都要用单位。 常见单位有:
px, em, rem, vh, vw
📏 16.2 各单位详解
| 单位 | 含义 | 举例 |
|---|---|---|
px | 像素(最基本单位) | width: 100px; |
em | 相对父元素字体大小 | 如果父字体是16px → 1em=16px |
rem | 相对根元素字体大小(html) | 若 html 字体 10px → 1rem=10px |
vh | 相对视口高度 | 50vh = 屏幕一半高 |
vw | 相对视口宽度 | 50vw = 屏幕一半宽 |
🧠 生活比喻版记忆:
| 单位 | 类比 |
|---|---|
| px | 固定的“砖头大小” 🧱 |
| em | 看“父亲”的鞋码 👨👧(随父变化) |
| rem | 看“祖宗”(html)的鞋码 👴(全局统一) |
| vh / vw | 看“窗户”的大小 🪟(屏幕可视区) |
🌈 小可爱口诀记忆(第105页结尾):
🧱 px 固定砖, 👨👧 em 跟爹变, 👴 rem 看祖先, 🪟 vhvw 看窗面。
✅ 小总结
| 概念 | 核心点 | 类比 |
|---|---|---|
| DPR | 放大倍数 | 摄影镜头放大率 |
| PPI | 清晰度 | 画布密度 |
| px/em/rem/vh/vw | 尺寸单位 | 不同参考尺子 📏 |
✨一句话总记忆:
“像素讲清晰,单位讲比例。” DPR、PPI 让屏幕细腻; em、rem、vw、vh 让网页响应式 🧃
🌟 第106–110页讲解:CSS单位实践 + Chrome字体限制篇
🧩 一、继续长度单位详解(第106–107页)
🧱 rem(相对根元素)
html {
font-size: 10px;
}
div {
font-size: 1.6rem; /* 实际字体大小 = 10px * 1.6 = 16px */
}
📘 解释:
rem相对的是根元素(html)的字体大小。- 不会受父级影响,适合做全局统一布局。
🧠 生活比喻:
em是“跟爸爸走”,rem是“听爷爷的”。 就算爸爸改主意,rem 还是听爷爷(html)的。
📏 vh / vw(视口单位)
div {
height: 50vh;
width: 50vw;
}
📘 解释:
1vh= 视口高度的 1%1vw= 视口宽度的 1%
💡 例:如果浏览器宽 1200px,高 800px:
50vw= 600px50vh= 400px
🧠 生活比喻:
想象浏览器是一扇“窗户 🪟”:
vh看窗户高;vw看窗户宽; 页面会随窗户大小变化而自动适应。
🧩 二、Chrome 为什么字体小于 12px 会失效?(第108–110页)
🧠 背景介绍(第108页)
在 Chrome 里,默认不允许小于 12px 的字体显示。 因为太小会影响阅读体验,尤其在高分屏上可能模糊或看不清。
🧩 三种方式可以“突破限制”:
- 使用
transform: scale()缩放; - 使用
-webkit-transform: scale(); - 使用
-webkit-text-size-adjust: none;
💡 17.1 方法一:transform: scale() 缩放(第108–109页)
<p class="small">我是被缩小的文字</p>
.small {
font-size: 12px;
transform: scale(0.8); /* 视觉上缩小为 9.6px */
transform-origin: left center;
}
📘 原理:
- 实际字体仍是 12px,但视觉缩小;
- Chrome 不会拦截,因为字体仍是合法大小;
- 缩放比例 0.8 = 看起来约 9.6px。
🧠 生活比喻:
Chrome 是个“安全家长”,不让孩子字体太小; 我们就偷偷“让字体穿小鞋 👟”, 看起来变小,但本质上没违规!
💡 17.2 方法二:-webkit-transform: scale()(第109页)
.small {
font-size: 12px;
-webkit-transform: scale(0.8);
transform-origin: left center;
}
📘 同上,只是写法带浏览器前缀以兼容 Safari。
💡 17.3 方法三:-webkit-text-size-adjust: none;(第110页)
html {
-webkit-text-size-adjust: none;
}
📘 解释: 防止浏览器自动放大或缩小文字(尤其移动端)。
🧠 生活比喻:
有些手机浏览器会“好心”帮你把字体放大。 加上这个属性,就像对浏览器说: “别动!我自己调字号,谢谢~😆”
📘 小结复盘(第110页)
| 方法 | 核心思路 | 优点 | 缺点 |
|---|---|---|---|
transform: scale() | 缩放视觉大小 | 简单好用 | 影响布局 |
-webkit-transform: scale() | 兼容性更好 | 支持 Safari | 同上 |
-webkit-text-size-adjust: none | 禁止浏览器自动放大 | 移动端常用 | 可能影响响应式体验 |
🌈 小可爱速记口诀:
🧱 px 固定砖, 👨👧 em 跟爹变, 👴 rem 听祖先, 🪟 vhvw 看窗面。
✨ 字体太小?三招搞定: ①
scale()视觉缩, ②webkit-scale()兼容稳, ③text-size-adjust:none让浏览器别乱动!
💡 一句话总结:
Chrome 不让你字体太小?没关系! 我们不“减尺寸”,我们“变焦镜头” 📸~
📘 第111–115页讲解:浏览器回流与重绘机制(小白超易懂版)
🌀 一、什么是回流(Reflow)和重绘(Repaint)?【第111页】
🌈 1.1 概念区分
浏览器渲染页面的过程分为几个阶段:
HTML → 解析成 DOM → 计算样式 → 布局 (Layout) → 绘制 (Paint) → 合成显示 (Composite)
📘 解释:
- 回流(Reflow) :涉及“布局”的重新计算(位置、大小变化)。
- 重绘(Repaint) :涉及“外观”的重新绘制(颜色、阴影变化),但位置没变。
🧠 生活比喻:
想象你在布置客厅:
- 改变沙发位置 → 要重新规划摆放 → 回流;
- 只是换沙发颜色 → 不动家具 → 重绘。
🌍 1.2 浏览器渲染流程图(第111页图示)
HTML → 解析为 DOM CSS → 解析为 CSSOM 两者合成 → Render Tree(渲染树) 然后 → Layout → Paint → Composite
💡 所以:
- 改变结构 → 回流;
- 改变颜色 → 重绘;
- 改变动画或样式频繁时 → 可能导致性能抖动(卡顿)。
⚙️ 二、回流是如何触发的?【第112页】
2.1 会触发回流的操作:
- 页面初始化;
- 添加或删除 DOM 元素;
- 元素尺寸变化(宽高、内外边距、边框);
- 浏览器窗口大小变化;
- 获取元素的布局信息(如
offsetTop、clientHeight等)。
🧠 小白记忆法:
“动了结构,就会回流; 改了样式,就会重绘。”
2.2 会触发重绘的操作:
- 修改颜色、背景、阴影;
- 改字体样式;
- 改边框颜色等不影响尺寸的属性。
🧩 例子:
div.style.color = "red"; // ✅ 只重绘
div.style.width = "200px"; // ❌ 触发回流 + 重绘
🚀 三、怎么减少回流与重绘?【第113–115页】
🧩 3.1 合并 DOM 操作(减少频繁触发)
不要多次直接操作 DOM 树:
❌ 坏例子:
let el = document.getElementById('box');
el.style.width = '100px';
el.style.height = '100px';
el.style.margin = '10px';
✅ 好例子:
let el = document.getElementById('box');
el.style.cssText = 'width:100px;height:100px;margin:10px;';
💡 这样只触发 一次回流+一次重绘。
🧠 生活比喻:
就像快递员送 3 次包裹(多次操作)很累; 一次送完(合并操作)省时又高效。🚚
🧩 3.2 使用离线 DOM(减少影响)
方法一:使用 documentFragment
let frag = document.createDocumentFragment();
for (let i = 0; i < 100; i++) {
let li = document.createElement('li');
li.textContent = i;
frag.appendChild(li);
}
document.querySelector('ul').appendChild(frag);
📘 解释:
fragment不在 DOM 树中,操作时不会引发回流;- 最后一次性插入,触发 1 次回流即可。
🎯 比喻:
就像你在仓库打包好 100 个奶茶杯 🧋, 一次性搬进店铺,而不是每装一个就跑一趟~
🧩 3.3 批量操作样式前使用 class 替换
❌ 低效:
div.style.width = '100px';
div.style.height = '100px';
div.style.background = 'red';
✅ 高效:
div.className = 'active';
然后在 CSS:
.active {
width: 100px;
height: 100px;
background: red;
}
📘 好处: 只触发一次渲染。
🧩 3.4 动画优化技巧(第115页代码)
动画尽量使用:
transform
opacity
而不要频繁改变:
width / height / margin / padding / top / left
✅ 例如:
div {
transform: translateX(100px);
transition: transform 0.5s ease;
}
❌ 慎用:
div {
left: 100px;
transition: left 0.5s ease;
}
💡 因为 transform 不会触发布局变化,只在 合成层(GPU) 处理; 而 left 会触发回流,影响性能。
🧠 生活比喻:
transform 就像滑动玻璃门(只动外观层 🚪), 而 left 是拆墙改门(动结构 🧱)——当然更费劲啦!
🌈 小可爱终极总结表:
| 类型 | 定义 | 举例 | 是否耗性能 |
|---|---|---|---|
| 回流(Reflow) | 元素位置/大小变化 | 改宽、高、添加元素 | 💥高 |
| 重绘(Repaint) | 元素外观变化 | 改颜色、阴影 | ⚡中 |
| 合成(Composite) | GPU 视觉变化 | transform、opacity | 💨低 |
💡 一句话记忆法:
“回流最贵、重绘次之、合成最快。” 少动结构、多用 transform, 做动画要走 GPU 通道~ 🚀
📘 第116–120页讲解:CSS 预处理器(Sass / Less / Stylus)超通俗解析
🧩 一、什么是 CSS 预处理器?【第116页】
CSS 预处理器是一种 “增强版的 CSS” , 它让我们可以在写样式时用:
- 变量(像写代码一样复用颜色/字号)
- 嵌套结构(更清晰)
- 函数与运算(更智能)
然后通过编译器把它“翻译”成浏览器能理解的标准 CSS。
🧠 生活比喻:
预处理器就像奶茶工厂的“自动配料机 🧋”。 你写的是“配方” (
.scss), 机器(编译器)会自动调成成品(CSS)给浏览器喝~
💡 二、常见的三大预处理器【第116–117页】
| 名称 | 后缀 | 特点 |
|---|---|---|
| Sass / SCSS | .scss | 最强大、生态丰富(Vue、React 常用) |
| Less | .less | 简洁易上手(很多老项目用) |
| Stylus | .styl | 语法最自由(缩进式写法) |
🧱 三、语法差异与示例【第118–120页】
🎨 3.1 嵌套写法(像写树状结构)
📘 传统 CSS 写法:
.nav { color: red; }
.nav li { list-style: none; }
.nav li a { color: blue; }
📘 Sass / Less / Stylus 写法:
.nav {
color: red;
li {
list-style: none;
a {
color: blue;
}
}
}
🧠 比喻:
原来你要“搬砖式”写一层层的
.nav li a; 现在就像“文件夹嵌套”,一眼看清层级结构 🧱。
💰 3.2 变量写法(让颜色/大小可复用)
@color: red; /* Less 用 @ */
$color: red; /* Sass 用 $ */
div {
color: $color;
}
📘 好处: 改一处全局生效,比如项目主题色从红改蓝,不用到处找。
🧠 生活比喻:
像做奶茶菜单时,你只改一次“珍珠价格”, 全部门店价格自动同步~💸
🧮 3.3 运算功能
你甚至可以做加减乘除:
div {
width: (100px / 2) + 10px; // 结果 60px
}
💡 适用于响应式布局、动态间距计算等。
🧠 生活比喻:
写样式像算账, Sass 就是你的“会计小助手”,能自动帮你算好数 💼。
🧩 3.4 继承(@extend)
%common {
border: 1px solid #000;
padding: 10px;
}
.box {
@extend %common;
background: yellow;
}
📘 解释:
%common是一个“公共样式模板”;@extend表示“继承它”。
🧠 比喻:
像复制 Excel 模板格式,只改个颜色就能复用 💅。
🧩 3.5 混入(Mixin)——可传参的样式函数!
@mixin border-radius($r) {
border-radius: $r;
}
div {
@include border-radius(10px);
}
📘 解释:
- 定义一个“可复用样式函数”;
- 传入参数自动生成结果。
🧠 生活比喻:
就像点奶茶时说“珍珠加 1 份”、“冰少一点”~ mixin 就是“定制配方机” 😆。
⚙️ 四、Sass / Less / Stylus 区别速查表
| 特性 | Sass (SCSS) | Less | Stylus |
|---|---|---|---|
| 变量符号 | $ | @ | 无符号 |
| 嵌套支持 | ✅ | ✅ | ✅ |
| 运算 | ✅ | ✅ | ✅ |
| 函数 / Mixin | ✅ | ✅ | ✅ |
| 语法风格 | 严谨(要大括号) | 类似 CSS | 可省括号、省分号 |
🧠 一句话总结:
Sass 最强,Less 最简,Stylus 最自由。
🌈 五、小可爱速记口诀
🧋 Sass 是旗舰款,功能多; 🍰 Less 是轻量版,小巧快; 🪶 Stylus 是极简派,爱自由;
💡 变量像调料,mixin 是配方, 嵌套写法就是“样式套娃”~👩🍳
🧠 六、开发实战感悟
在 Vue / React 项目中:
-
推荐用 SCSS(兼容性最好)
-
配合
vite或webpack自动编译即可使用:npm install sass -D
然后在 .vue 文件中:
<style lang="scss" scoped>
$mainColor: #409eff;
.btn {
background-color: $mainColor;
&:hover {
background-color: lighten($mainColor, 10%);
}
}
</style>
💬 终极记忆法:
✅ CSS 是“成品奶茶” ✅ SCSS / Less 是“智能奶茶机” 你写的是配方,它帮你调好比例、加料、封杯~ 🧋
📘 第116–120页讲解:CSS 预处理器(Sass、Less、Stylus)详解 — 小白也能听懂的版本
💡 19.1 什么是 CSS 预处理器?【第116页】
CSS 预处理器(Preprocessor)是一种能让你用更聪明的方式写 CSS 的工具。 它支持变量、嵌套、函数(叫做 Mixin)、循环、条件判断等语法。 最后再编译(compile) 成普通 CSS,浏览器就能识别了。
🧠 举个生活例子:
假设普通 CSS 就是“做菜时手动切菜、配料、炒菜”, 而 Sass/Less 就是“智能炒菜机 🍳”: 你写菜谱(预处理器代码),机器帮你自动炒好成品(CSS)。
🧩 19.1.1 为什么要用预处理器?
- CSS 没有变量,复用差;
- 层级多时,选择器写起来太冗长;
- 没法模块化、没法传参数;
- 改一点颜色,得全文件找一遍。
👉 所以 Sass/Less 出现就是为了让 CSS 更像写代码。
🧱 19.2 三大预处理器介绍【第117页】
| 名称 | 文件后缀 | 特点 |
|---|---|---|
| Sass(.scss) | .scss | 功能最强、生态最广(Vue/React最爱用) |
| Less | .less | 学习成本低、语法接近 CSS |
| Stylus | .styl | 最简洁、可以省括号和分号 |
💬 19.3 区别与语法示例【第118–120页】
🧩 一、变量(Variable)
📘 Sass 用 $,Less 用 @,Stylus 可省略。
// Sass 写法
$color: red;
div {
color: $color;
}
// Less 写法
@color: red;
div {
color: @color;
}
🧠 生活比喻:
就像定义“珍珠奶茶单价 = 10 元”, 后面做几十种奶茶都能直接用这个“变量”代替。
🧩 二、嵌套(Nested)
传统 CSS:
.nav { color: red; }
.nav li { list-style: none; }
.nav li a { color: blue; }
Sass / Less:
.nav {
color: red;
li {
list-style: none;
a {
color: blue;
}
}
}
🧠 生活比喻:
就像文件夹嵌套结构:
nav是主文件夹,li、a都在它里面。 更有层次感,也不用重复写前缀。
🧩 三、混入(Mixin)
相当于“样式函数”!你写一次,就能反复调用,还能传参数。
@mixin btn($color) {
background: $color;
border-radius: 5px;
padding: 10px;
}
.btn-red {
@include btn(red);
}
.btn-blue {
@include btn(blue);
}
🧠 生活比喻:
就像奶茶机的“定制程序”: 你输入“红茶 + 冰 + 糖”,它自动给你配好。
🧩 四、继承(@extend)
公用的样式可提取出来统一管理。
%base {
border: 1px solid #000;
padding: 10px;
}
.card {
@extend %base;
background: yellow;
}
💡 %base 相当于模板,@extend 就是“套模板”。
🧠 比喻:
就像公司信纸模板: 所有文件共用页眉页脚,只改中间内容。
🧩 五、运算(Operation)
预处理器能直接做数学计算!
div {
width: (100px / 2) + 10px; // = 60px
}
🧠 生活比喻:
就像智能收银机,会自动帮你算找零 🧮。
📘 19.4 Sass / Less / Stylus 的区别总结
| 功能 | Sass | Less | Stylus |
|---|---|---|---|
| 变量符号 | $ | @ | 可省略 |
| 嵌套写法 | ✅ | ✅ | ✅ |
| Mixin 函数 | ✅ | ✅ | ✅ |
| 条件/循环 | ✅ | ✅ | ✅ |
| 写法自由度 | 🌟 规范(推荐) | 🌟 简单 | 🌟 最自由 |
🌈 小可爱专属速记口诀
🍰 Sass 最强大(功能全、适合大型项目) 🍵 Less 最轻巧(入门容易,配 Vue/Antd 常见) 🍃 Stylus 最自由(缩进式、写法极简)
💬 口诀: “Sass 玩转变量嵌套,Less 快速复用,Stylus 放飞自我。”
💡 一句话总结
💬 Sass / Less / Stylus 就像三种“CSS 超能力语言”:
- 它们让 CSS 不再只是样式表,而是能“编程”的样式代码。
- 写得少、结构清、改得快。
👉 写样式像写代码一样聪明, 就是预处理器带来的最大快乐 💻💖
📘 第121–125页讲解:CSS 预处理器进阶 + 性能优化入门(小白友好版)
🧩 一、19.3.6 插值语法(Interpolation)【第121页】
核心概念: 在 Sass/Less 中可以用插值语法
#{}或@{}来动态生成类名或属性名。
📘 例子:
$name: red;
.#{$name}-box {
color: $name;
}
📘 编译结果:
.red-box {
color: red;
}
🧠 小白解释:
插值语法就是“拼字符串”, 就像你在文件名模板中写
${date}→ 自动变成当天日期。 这里写#{$name}→ 自动变成类名.red-box。
💅 二、19.3.7 条件判断【第122页】
你可以在 Sass 中使用
@if、@else像写 JavaScript 一样写逻辑判断。
📘 例子:
$theme: light;
div {
@if $theme == light {
color: black;
} @else {
color: white;
}
}
📘 结果:
div {
color: black;
}
🧠 生活比喻:
这就像菜单选择逻辑:
- 如果点“热饮” → 出热奶茶;
- 否则(点冷饮)→ 加冰~❄️
🔁 三、19.3.8 循环【第123页】
当你需要生成多个相似样式时,用
@for、@each、@while来自动循环生成。
📘 例子(@for):
@for $i from 1 through 3 {
.item-#{$i} {
width: 10px * $i;
}
}
📘 结果:
.item-1 { width: 10px; }
.item-2 { width: 20px; }
.item-3 { width: 30px; }
🧠 生活比喻:
就像做一批编号的奶茶杯: 自动贴上编号 1、2、3,不用你手动写 3 遍!
🧰 四、19.3.9 函数(@function)【第124页】
你可以写自定义函数,实现更灵活的计算逻辑。
📘 例子:
@function double($num) {
@return $num * 2;
}
div {
width: double(10px);
}
📘 结果:
div { width: 20px; }
🧠 生活比喻:
这是 Sass 自带的“计算器”, 写一次逻辑公式,以后随便调用!
🧩 五、19.3.10 导入文件(@import)【第124页】
可以把样式拆分成多个文件,模块化管理。
📘 示例:
@import "reset";
@import "variable";
@import "layout";
💡 Sass 编译时会把这些文件内容合并为一个 CSS。
🧠 比喻:
像你点奶茶时可以“拼套餐”: 奶茶 + 小料 + 烤布蕾 = 一整份完整套餐!
⚙️ 六、20. CSS 性能优化(Performance Optimization)【第125页】
CSS 不仅要“写得漂亮”,还要“跑得快” 💨!
💡 20.1 为什么要优化?
因为浏览器渲染页面时,样式计算、回流重绘、选择器匹配等操作都会消耗性能。
目标: 让浏览器少干重复活、少重绘、少计算。
🚀 七、20.2 常见优化方式【第125页】
✅ 1️⃣ 减少嵌套层级
层级越深,浏览器匹配选择器时越慢。
❌ 不推荐:
.container .main .left .list .item .title {
color: red;
}
✅ 推荐:
.item-title {
color: red;
}
🧠 比喻:
像找快递📦, “小区 → 楼 → 楼层 → 门牌 → 柜子”太复杂;
直接写上快递柜编号最效率!
✅ 2️⃣ 合理使用简写属性
❌ 不推荐:
margin-top: 10px;
margin-right: 10px;
margin-bottom: 10px;
margin-left: 10px;
✅ 推荐:
margin: 10px;
💡 不仅写得少,解析更快!
✅ 3️⃣ 减少通配符与复杂选择器
❌ 慎用:
* { margin: 0; padding: 0; }
✅ 推荐:
html, body, ul, li { margin: 0; padding: 0; }
🧠 比喻:
*就像“全员会议”,每个员工都被叫来开会,浪费资源 🧑💻。
✅ 4️⃣ 善用继承(inherit)
让子元素自动继承父元素样式,减少重复定义。
body {
color: #333;
font-family: Arial;
}
p {
font: inherit;
}
✅ 5️⃣ 压缩与合并 CSS 文件
💡 使用构建工具(Vite、Webpack、Gulp)压缩 CSS:
- 去掉空格;
- 去掉注释;
- 合并重复规则。
🧠 比喻:
就像打包快递时,把松散的包裹压缩成一个箱子 📦, 传输更快。
🌈 小可爱终极总结表(第125页)
| 优化方向 | 原则 | 举例 |
|---|---|---|
| 选择器优化 | 减层级、少通配符 | .class 替代 ul li a |
| 样式优化 | 合理继承、用简写 | margin: 10px |
| 文件优化 | 压缩、合并、缓存 | .min.css 文件 |
💬 一句话记忆法:
“少嵌套、多继承,合并压缩效率增。” 写 CSS 就像开奶茶店——流程越顺、越省力,顾客(浏览器)越快喝到成品 🧋✨
📘 第126–127页讲解:CSS 性能优化(进阶篇)——让网页“飞”起来 🚀
🧩 一、20.2.3 资源压缩【第126页】
💡 核心思想: CSS 文件越大,浏览器加载越慢。 所以我们要通过工具 压缩代码、合并文件、减少体积。
📦 常见工具:
- webpack
- gulp
- grunt
- rollup
这些都是前端“打包机”,能自动帮你把:
/* 原始 */
body {
color: red;
}
/* 压缩后 */
body{color:red}
→ 文件体积瞬间减半,加载速度飞快 ⚡。
🧠 生活比喻:
就像你寄快递 📦,打包压缩一下比散装寄更省钱、更快到!
🧱 二、20.2.4 合理使用选择器
CSS 的匹配是从右往左查找的。 比如:
#markdown .content h3
浏览器是这样查的:
- 先找所有
h3 - 再看它的父级是不是
.content - 最后再看
.content的父级是不是#markdown
所以如果层级太多,浏览器得“倒着查好几次”,自然变慢 🐢。
✅ 优化建议:
- 尽量不要超过三层嵌套
- 不用太复杂的选择器
- 能用 class 就别用标签选择器
- 避免使用低效选择器,比如
*、:nth-child
🧠 生活比喻:
选人办事也是, “张三 → 他同事 → 他部门 → 他公司” 太绕了~ 直接点名
.zhangsan最快!🏃♀️
💅 三、20.2.5 减少使用昂贵的属性
像 box-shadow、border-radius、filter、透明度 等属性, 浏览器渲染时都得重新计算像素,耗性能!
✅ 尽量少用,尤其在大面积使用时(例如卡片阴影、毛玻璃背景)。
🧠 生活比喻:
这就像给每杯奶茶都贴上“金边标签”——好看但贵又慢。 一点点用可以,别全场特效开满格 💸。
🚫 四、20.2.6 不要使用 @import
CSS 有两种引入方式:
✅ 推荐:
<link rel="stylesheet" href="index.css">
❌ 不推荐:
@import url("reset.css");
因为
@import会阻塞页面渲染, 浏览器要先下载、执行第一个文件, 再去下载第二个文件(就像“串行”加载),很慢!
📘 举例:
/* index.css */
@import url("reset.css");
浏览器得: 1️⃣ 下载 index.css 2️⃣ 再下载 reset.css 3️⃣ 才能渲染页面
🧠 生活比喻:
就像点外卖要“先等饮料,再等主食”,不如一次下单直接打包来!🍱
🧩 五、20.2.7 其他优化建议【第127页】
✅ 减少重绘与重排(Reflow & Repaint)
- 修改样式前,先用
transform、opacity, 不要频繁改left/top。 - 合并多次 DOM 改动,批量更新。
✅ 使用 CSS Sprite
- 把多个小图标合成一张大图,用
background-position定位; - 这样能减少 HTTP 请求(减少网络往返)。
✅ icon 转 base64
- 小图标可以转成 base64,直接嵌进 CSS,加载更快。
🧩 六、20.3 总结
✨ CSS 优化的三大核心方向: 1️⃣ 选择器优化:少嵌套、少通配、直接命中。 2️⃣ 属性优化:少用复杂特效、控制层叠关系。 3️⃣ 加载优化:压缩、合并、用 link 替代 import。
🧠 小可爱记忆口诀:
“三少一压缩”: 少层级、少特效、少重绘,压缩合并快飞起 🚀。
💬 一句话总结:
🌸 CSS 优化的目标不是写更炫,而是让浏览器更轻盈、页面更丝滑~ 就像做奶茶:料多不一定好喝,关键是比例刚刚好 💖。