20251018-CSS八股文整理版

100 阅读1小时+

📚 第1页:CSS 盒模型介绍

CSS 盒模型是什么?

CSS 盒模型(Box Model)是网页布局的基础概念,它定义了元素的尺寸和布局结构。每个 HTML 元素都可以看作一个矩形框,而这个框由 内容区内边距(padding)边框(border)外边距(margin) 组成。

就像生活中的“礼物包装”🎁

想象一下,你买了一个礼物并用盒子包装好。

  • 内容(Content) 就是盒子里的礼物。
  • 内边距(Padding) 就是礼物和盒子之间的空隙,让它看起来更美观。
  • 边框(Border) 是盒子的外框,它决定了包装盒的外形。
  • 外边距(Margin) 是盒子外面与其他物体之间的空隙,确保礼物不会挤到其他物品。

图解说明:

图中的“盒子”通过层次结构表示了 CSS 中的盒模型: image.png

  • Content(内容) 是你网页元素的实际内容(比如文字或图片)。
  • Padding(内边距) 给内容加了些空间,让它不贴着边界看起来更舒服。
  • Border(边框) 可能是你设定的框线,增加了更多的视觉效果。
  • Margin(外边距) 给元素和其他元素之间留出空间。

📄 第2页:CSS 盒模型的组成部分

图解描述了盒模型的四个部分:

  1. 内容(Content)
  2. 内边距(Padding)
  3. 边框(Border)
  4. 外边距(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页:标准盒模型

image.png

💻 代码解释:

当你写:

.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)

image.png

💻 代码示例:

同样的代码:

.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 + border200ml 含杯壁和垫层
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 属性来激活的:

  1. overflow:设置为 hiddenautoscroll
  2. display:设置为 inline-blockflexgrid 等。
  3. position:设置为 absolutefixed
  4. float:设置为 leftright

举个生活案例:

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> 元素会排列在一起而不影响外部布局。

生活中的例子:

可以想象你的房间里面有两个桌子(浮动元素),每个桌子放了一个物品(HahaHehe)。 因为房间被隔离(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页:总结与使用场景

使用场景:

  1. 避免浮动元素对父元素影响:使用 BFC 可以让父元素容纳浮动元素,不被其“拉伸”。
  2. 清除浮动问题:使用 overflow:auto 来清除浮动,确保布局正常。

生活中如何理解?

假设你的房间里有一个高脚凳(浮动元素),它的高度会影响到整个房间(父元素)。 但如果你把房间设置成 BFC,那么这个高脚凳就不会影响到房间的整体布局。


小可爱总结:

  • BFC 就像一个独立的房间,它让房间里的物品互不干扰,每个元素的大小和布局只与自己有关,不受外界影响
  • 通过 overflowdisplayposition 等属性,可以轻松 创建 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页:常见的响应式布局方式

响应式布局的常见方法:

  1. 媒体查询(Media Query) :根据不同设备尺寸来调整 CSS 样式。
  2. 百分比宽度(%) :设置宽度为百分比值,使元素在容器中按比例缩放。
  3. 弹性盒模型(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页:remem 单位

3.2.4 rem 和 em 单位

remem 是两种相对单位,常用于响应式设计:

  • rem:相对于根元素(<html>)的字体大小。
  • em:相对于父元素的字体大小。

举个例子:

  • 如果你设置了 html { font-size: 16px; },那么 1rem 就是 16px。
  • em 则是相对于当前元素的父级元素来计算的。

📄 第20页:水平居中与垂直居中

4.1 水平居中

水平居中有几种常见方法,最常用的是通过设置 marginauto 来实现:

div {
  width: 50%;
  margin: 0 auto;  /* 上下边距为0,左右边距自动 */
}

这样,div 元素会水平居中。

生活中的例子:

就像你把一张纸放在桌子上,纸的宽度占据了桌子的一部分,剩余的空间会自动均匀分配在纸的两边。

4.2 垂直居中

垂直居中的方式有很多,最常用的包括:

  1. 使用 flex 布局。
  2. 使用 positiontransform

代码示例(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-celldisplay: 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 控制居中。
  • widthheight: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 提供的一种 二维 布局方式。它允许你定义多个行和列来精准布局页面元素。

栅格布局的基本结构:

  1. grid-template-columns:定义列的宽度。
  2. grid-template-rows:定义行的高度。
  3. 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;
}

在这个例子中,1fr3fr 表示侧边栏和主内容区的比例,侧边栏占 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

floatmargin 通常结合使用,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 选择器的优先级决定了哪个样式应用于元素。如果多个选择器作用于同一个元素,优先级高的选择器样式会覆盖优先级低的样式。

选择器优先级:

  1. 内联样式(最高优先级)
  2. ID 选择器
  3. 类选择器、伪类选择器
  4. 标签选择器(最低优先级)

生活中的例子:

就像你在选择穿什么衣服时,选择的规则有很多。比如,你可能会首先选择你最喜欢的衣服(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-leftborder-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;
}
  • 解释:

    • widthheight 设置为 0,我们不需要定义盒子的宽度和高度。
    • border-leftborder-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 效果:元素被点击时发生样式变化。

通过这些交互效果,你可以让页面上的元素变得更有趣和吸引用户。


总结:

  1. CSS 动画 使得页面内容变得动态,通过 @keyframestransition 可以在页面元素之间添加平滑的动画效果。
  2. CSS 三角形 使用 border 属性来绘制,设置透明边框并指定一个带颜色的边,从而创建不同形状的图形。
  3. 交互效果 让用户与页面进行互动时,元素样式发生变化,提高用户体验。

第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更复杂的动画功能,可以设置多个步骤,使元素能够根据定义的关键帧发生多个变化。
  • flexboxgrid:这两个是CSS布局的现代方法,提供了更加灵活和强大的布局控制。

11.1 新增特性的类别

CSS3新增的特性有很多种,它们分别用于:

  • visual(视觉效果)
  • layout(布局)
  • transformations(变换)
  • animations(动画)
  • text effects(文本效果)

11.2 常见的新特性(详细介绍)

  1. background-clip:这个属性控制背景图像或背景颜色的绘制区域。可以控制背景只显示在元素的某一部分,如 content-box, padding-box 等。

    background-clip: content-box;
    
    • 解释: 这个属性指定了背景颜色/图片只会显示在元素的内容区域,而不会扩展到内边距或边框区域。
    • 生活例子: 比如你给一张纸涂上背景色,而不让颜色扩展到纸的边缘。
  2. background-size:设置背景图片的尺寸,可以控制它的缩放。

    background-size: cover;
    
    • 解释: cover 会让背景图覆盖整个元素的区域,即使需要裁剪图片。
    • 生活例子: 你用一张纸盖住桌面,纸的尺寸可以变大或小,确保它完全覆盖桌面,可能会超出桌面一部分。
  3. word-wrap:这个属性控制文本是否能在容器边界内换行。

    word-wrap: break-word;
    
    • 解释: 如果文本超出容器宽度,它会强制在合适的位置换行,避免文本溢出。
    • 生活例子: 比如你有一长段文本,像把一段长长的绳子折叠,确保它不会超出桌子。
  4. text-overflow:当文本溢出容器时,可以使用这个属性来控制显示的方式。常用的值有 ellipsis,表示用省略号代替溢出的文本。

    text-overflow: ellipsis;
    
    • 解释: 当文本超出容器的可见区域时,显示为“...”,并不让文本溢出到容器外。
    • 生活例子: 就像你写字在纸上,字写得太长,纸张不够,最后只能显示“...”。
  5. 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-columnsgrid-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-gapgrid-column-gapgrid-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-itemsalign-itemsplace-items

用于对齐格子里的内容

.container {
  justify-items: center; /* 水平居中 */
  align-items: center;   /* 垂直居中 */
  place-items: center;   /* 两个合并写法 */
}

📘 区别口诀:

“justify” 管横向, “align” 管纵向, “place” 是二合一。

🧠 生活比喻:

像整理书架:

  • justify-items: start → 靠左排书;
  • center → 居中放好;
  • end → 靠右收紧。

⚙️ 13.2.7 justify-contentalign-contentplace-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 / endgrid-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-selfalign-selfplace-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-directionflex-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-contentalign-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 = 600px
  • 50vh = 400px

🧠 生活比喻:

想象浏览器是一扇“窗户 🪟”:

  • vh 看窗户高;
  • vw 看窗户宽; 页面会随窗户大小变化而自动适应。

🧩 二、Chrome 为什么字体小于 12px 会失效?(第108–110页)


🧠 背景介绍(第108页)

在 Chrome 里,默认不允许小于 12px 的字体显示。 因为太小会影响阅读体验,尤其在高分屏上可能模糊或看不清。

🧩 三种方式可以“突破限制”:

  1. 使用 transform: scale() 缩放;
  2. 使用 -webkit-transform: scale()
  3. 使用 -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 元素;
  • 元素尺寸变化(宽高、内外边距、边框);
  • 浏览器窗口大小变化;
  • 获取元素的布局信息(如 offsetTopclientHeight 等)。

🧠 小白记忆法:

“动了结构,就会回流; 改了样式,就会重绘。”


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)LessStylus
变量符号$@无符号
嵌套支持
运算
函数 / Mixin
语法风格严谨(要大括号)类似 CSS可省括号、省分号

🧠 一句话总结:

Sass 最强,Less 最简,Stylus 最自由。


🌈 五、小可爱速记口诀

🧋 Sass 是旗舰款,功能多; 🍰 Less 是轻量版,小巧快; 🪶 Stylus 是极简派,爱自由;

💡 变量像调料,mixin 是配方, 嵌套写法就是“样式套娃”~👩‍🍳


🧠 六、开发实战感悟

在 Vue / React 项目中:

  • 推荐用 SCSS(兼容性最好)

  • 配合 vitewebpack 自动编译即可使用:

    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 是主文件夹,lia 都在它里面。 更有层次感,也不用重复写前缀。


🧩 三、混入(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 的区别总结

功能SassLessStylus
变量符号$@可省略
嵌套写法
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

浏览器是这样查的:

  1. 先找所有 h3
  2. 再看它的父级是不是 .content
  3. 最后再看 .content 的父级是不是 #markdown

所以如果层级太多,浏览器得“倒着查好几次”,自然变慢 🐢。

优化建议:

  • 尽量不要超过三层嵌套
  • 不用太复杂的选择器
  • 能用 class 就别用标签选择器
  • 避免使用低效选择器,比如 *:nth-child

🧠 生活比喻:

选人办事也是, “张三 → 他同事 → 他部门 → 他公司” 太绕了~ 直接点名 .zhangsan 最快!🏃‍♀️


💅 三、20.2.5 减少使用昂贵的属性

box-shadowborder-radiusfilter透明度 等属性, 浏览器渲染时都得重新计算像素,耗性能!

✅ 尽量少用,尤其在大面积使用时(例如卡片阴影、毛玻璃背景)。

🧠 生活比喻:

这就像给每杯奶茶都贴上“金边标签”——好看但贵又慢。 一点点用可以,别全场特效开满格 💸。


🚫 四、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)

  • 修改样式前,先用 transformopacity, 不要频繁改 left / top
  • 合并多次 DOM 改动,批量更新。

使用 CSS Sprite

  • 把多个小图标合成一张大图,用 background-position 定位;
  • 这样能减少 HTTP 请求(减少网络往返)。

icon 转 base64

  • 小图标可以转成 base64,直接嵌进 CSS,加载更快。

🧩 六、20.3 总结

CSS 优化的三大核心方向: 1️⃣ 选择器优化:少嵌套、少通配、直接命中。 2️⃣ 属性优化:少用复杂特效、控制层叠关系。 3️⃣ 加载优化:压缩、合并、用 link 替代 import。

🧠 小可爱记忆口诀:

“三少一压缩”: 少层级、少特效、少重绘,压缩合并快飞起 🚀。


💬 一句话总结:

🌸 CSS 优化的目标不是写更炫,而是让浏览器更轻盈、页面更丝滑~ 就像做奶茶:料多不一定好喝,关键是比例刚刚好 💖。