Skip to content

学成在线(一) ​

本页对应 学成在线,共 8 段视频,约 1 小时 28 分。

学习目标 ​

  • 能独立完成 banner 区域左侧 left 侧导航的 HTML 结构搭建,使用 ul > li > a 组织导航项,并通过浏览器效果验证结构层级正确。
  • 能将导航链接 a 转换为可设置宽高的元素,完成高度、行高、左右内边距、悬停背景色与文字颜色设置,并验证鼠标点击热区覆盖整行。
  • 能在导航项内使用小图标盒子并通过 Flex 两端对齐实现文字居左、图标居右,验证图标位于链接右侧且随链接悬停变色。
  • 能搭建右侧 right 标题与 content 内容区盒子,完成背景色、圆角、内边距、标题字号颜色及内容区间距设置,验证页面效果与参考图一致。
  • 能使用 dl > dt + dd 完成课程表内容布局,设置标题加粗、说明文字颜色、局部文字高亮、下边框及模块间距,验证多组课程信息排列整齐。
  • 能完成“全部课程”链接按钮和“精品推荐”大盒子,使用块级链接、圆角、居中、悬停变色/阴影及多类名复用版心样式,验证按钮可点击且推荐模块水平居中。

知识点 ​

先看结构:为什么用 ul>li>a ​

为什么需要:侧导航是一组可点击的分类入口,既要语义清楚,又要保证整行都能点。
怎么想:转写稿强调“li 包 A”,A 包住文字,这样鼠标放在这一行的任意位置都能触发链接;结构先搭大盒子,再填内容。
怎么做:保留笔记结构:

html
<div class="left">
  <ul>
    <li><a href="#">前端开发</a></li>
    <li><a href="#">后端开发</a></li>
    <li><a href="#">移动开发</a></li>
    <li><a href="#">人工智能</a></li>
    <li><a href="#">商业预测</a></li>
    <li><a href="#">云计算&大数据</a></li>
    <li><a href="#">运维&测试</a></li>
    <li><a href="#">UI设计</a></li>
    <li><a href="#">产品</a></li>
  </ul>
</div>

易错点:不要只给 li 设高度就以为能点;A 默认是行内元素,点击范围小。转写稿反复提醒:先把 .banner .left 这个父级写全,避免后面 left/right 继承混乱。

父容器 .banner .left:先把盒子量准 ​

为什么需要:侧导航有半透明底色、固定宽高和内边距,先把父盒子做对,里面的 A 才有稳定参照。
怎么想:先写宽、高、背景色,再看位置;转写稿说“先画盒子,再填内容”。
怎么做:保留笔记 CSS:

css
/* 侧导航 */
.banner .left {
  padding: 3px 20px;
  width: 191px;
  height: 420px;
  background-color: rgba(0,0,0,0.42);
}

易错点:padding: 3px 20px 是上下 3、左右 20;不要写成只给上。转写稿里量到首项约 49、其余 46,最终取 46,上方 3px 用父级 padding-top 处理,底部剩余 3px 可不管,避免总高超出。

让 A 变成可点击的整行 ​

为什么需要:A 是行内元素,默认没有可设置的高度,整行点击热区不够。
怎么想:转写稿的推导是:A 要“这么大才对”,所以转成块级并给高;高度取 46,行高 46 让文字垂直居中。
怎么做:保留笔记样式:

css
.banner .left a {
  /* 块级:宽度是父级的100% */
  display: block;
  height: 46px;
  background: url(../images/right.png) no-repeat right center;
  line-height: 46px;
  font-size: 16px;
  color: #fff;
}

转写稿还强调 A 左右各 20 的内边距来扩大点击范围,可补为 padding: 0 20px;;笔记把左右 20 放在 .left 上,两者都能让文字内缩,但 A 的点击热区不同,实际以笔记代码为主、按转写稿理解即可。
易错点:不要用 margin 代替 padding。转写稿解释:给 A margin,盒子会移动,左侧区域可能点不到;给 padding,文字内缩但 A 的范围还在。也不要给 49,否则累计会超出。

悬停:背景图和文字颜色 ​

为什么需要:鼠标经过要有反馈,提示当前项可点。
怎么想:默认右侧小箭头图,hover 换成另一张图,同时文字变蓝。
怎么做:保留:

css
.banner .left a:hover {
  background-image: url(../images/right-hover.png);
  color: #00a4ff;
}

易错点:背景颜色和文字颜色别写反;hover 只换 background-image,不要误写成 background-color。本节没有独立图片标签,图片资源保留在 CSS 的 url 中。

转写稿补充:小箭头与调试 ​

为什么需要:右侧小箭头要跟着整行 hover 变色,后续还要换字体图标。
怎么想:转写稿做法是把 i 放在 A 里面,A 用 flex 两端对齐,让文字在左、箭头在右;i 默认倾斜,可先 font-style: normal。
怎么做:转写稿示例思路为:

html
<a href="#">前端开发<i>&gt;</i></a>
css
.banner .left a {
  display: flex;
  justify-content: space-between;
}
.banner .left a i {
  font-style: normal;
}

易错点:i 放 A 外,hover 时箭头不联动;字体图标需要盒子,别用伪元素替代。调试时转写稿提醒:先看左侧结构,再看样式是否被划掉,遵循“上看层叠、下看继承”;点标签右边完全没样式,99% 是类名写错。

先看效果与结构 ​

课程表区域效果图

课程表在 banner 右侧,是一个蓝色卡片里套白色内容区的结构。布局思路仍然遵循转写稿里反复强调的顺序:先大后小、先上后下、先画盒子再填内容。先确定 .right 大盒子,再放标题 h3,最后用 .content 白色盒子承载课程列表。这样想的好处是:宽高、背景色、圆角先稳定,后面填内容时不会一边写内容一边猜盒子位置。

原始笔记结构如下:

html
<div class="right">
  <h3>我的课程表</h3>
  <div class="content">1</div>
</div>

原始样式如下:

css
/* 课程表 */
.banner .right {
  margin-top: 60px;
  width: 218px;
  height: 305px;
  background-color: #209dd5;
  border-radius: 10px;
}

.banner .right h3 {
  margin-left: 14px;
  height: 48px;
  line-height: 48px;
  font-size: 15px;
  color: #fff;
  font-weight: 400;
}

.banner .right .content {
  padding: 14px;
  height: 257px;
  background-color: #fff;
  border-radius: 10px;
}

右侧大盒子:先定位置和外观 ​

为什么需要先写 .right?因为它是课程表的外壳,决定整块在 banner 中的位置、尺寸和蓝色背景。怎么想:它和左侧导航是兄弟关系,所以选择器写成 .banner .right,避免和页面其他 right 冲突。怎么做:给 margin-top: 60px 让它下移,宽 218px、高 305px,背景 #209dd5,圆角 10px。易错点:类名不要只写 .right,否则容易受继承或同名类影响;高度要记住,后面标题 48px 加内容区 257px 正好是 305px。

标题 h3:高度、行高和字重 ​

为什么标题要单独设?因为 h3 默认有外边距和加粗,直接放进去会贴边、字重也不符合设计。怎么想:标题在蓝底上,白字、15px、不加粗;用高度和行高让文字垂直居中。怎么做:height: 48px; line-height: 48px;,左边距 14px,font-weight: 400 去掉默认加粗。易错点:只写 line-height 不写 height 也可以居中,但这里高度参与总高计算;h3 默认 margin 要留意,必要时重置。

内容区 content:白底卡片盖在蓝底上 ​

为什么需要 .content?因为课程表下半部分是白色卡片,蓝底只露出标题区域。怎么想:先给 .content 白底、圆角、内边距,再用高度控制它和标题拼满大盒子。怎么做:padding: 14px; height: 257px; background:#fff; border-radius:10px;。这里 257px 要理解为含 padding 的盒子高度,项目里通常有 box-sizing: border-box;转写稿也强调过“有宽高再给 padding,是往里减”。易错点:如果没有 border-box,257px 再加上下 28px 就会撑高溢出,调试时先在开发者工具看盒模型。

课程项用 DL/DT/DD 填充 ​

转写稿里 content 内部用 dl 包 dt 和 dd 做课程项:dt 是课程名,14px、加粗 700;dd 是说明,12px、灰色 #7d7d7d;“正在学习”用 span 包起来设蓝色 #00A4FF。每个 dl 加下边框和 margin-bottom 做分隔。为什么这样?盒与盒之间用 margin,盒内文字距离用 padding。易错点:复制课程项时复制的是整个 dl,不要只复制 dt 或 dd;颜色不要写到父级导致所有文字都变蓝。

底部链接与调试 ​

“全部课程”是链接,a 默认是行内元素,直接给宽高无效,所以要 display:block,高 32px、行高 32px、文字居中,背景 #00A4FF,圆角取高度一半 16px,形成胶囊按钮;悬停可换深色背景。易错点:胶囊圆角不是 50%,50% 会变椭圆。调试时按转写稿的方法:先看左侧结构,再看盒模型;“上看层叠,下看继承”;点标签右边完全没样式,优先检查类名是否写错。

先看课程表条目的语义结构 ​

为什么需要:banner 右侧的课程表不是零散文字,而是“课程名 + 学习状态 + 当前章节”成组出现。用 dl 包住一组 dt、dd,语义上就是“标题—说明”的列表,比一堆 div 更容易维护。转写稿里反复说“先搭大盒子再填内容”,这里也应先把每条课程当成一个 dl 条目。

怎么想:一个课程对应一个 dl;dt 放课程名,dd 放“正在学习-章节”。dd 里“正在学习”是状态词,用 span 单独包起来,后面的章节名用 strong 表示强调但样式上可弱化。

怎么做:

html
<dl>
  <dt>数据可视化课程</dt>
  <dd><span>正在学习</span>-<strong>echarts使用步骤</strong></dd>
</dl>
<dl>
  <dt>Vue3医疗项目课程  </dt>
  <dd><span>正在学习</span>-<strong>认识组合式API</strong></dd>
</dl>
<dl>
  <dt>React核心技术课程</dt>
  <dd><span>正在学习</span>-<strong>rudex配合TS使用</strong></dd>
</dl>

易错点:dt、dd 必须放在 dl 里面,不要写成孤立的 dt、dd;转写稿里说的“滴D/DR”就是口误,对应的是 dd 和 dl,写代码时别跟着口误写错标签。

容器与分隔线 ​

为什么需要:三条课程如果直接堆在一起,视觉上分不清边界。给每个 dl 加下边框和下外边距,可以让每条课程形成独立行组。

怎么想:分隔线属于“每条课程整体”,不是属于某一行文字,所以边框应给 dl,不是给 dt 或 dd。转写稿也提到“盒子和盒子之间用 margin,盒子里面的字用 padding”,这里 dl 之间用 margin-bottom 更合适。

怎么做:

css
.banner .right dl {
  margin-bottom: 12px;
  border-bottom: 1px solid #e0e0e0;
}

易错点:选择器要限定在 .banner .right 下,避免影响页面其他 dl;如果发现分隔线贴着文字太近,先检查 dl 的 margin-bottom 和内部 dd 的 margin-bottom,不要盲目加 padding。

标题与说明文字层级 ​

为什么需要:课程名是主信息,章节是辅助信息,字号和字重要有层级,否则用户扫读时抓不到重点。

怎么想:dt 用 14px、700 加粗、20px 行高;dd 用 12px、16px 行高。dd 里的 strong 虽然语义强调,但视觉上不应比课程名更抢眼,所以把 strong 的字重降为 400,并给灰色。

怎么做:

css
.banner .right dt {
  margin-bottom: 8px;
  font-size: 14px;
  line-height: 20px;
  font-weight: 700;
}

.banner .right dd {
  margin-bottom: 8px;
  font-size: 12px;
  line-height: 16px;
}

.banner .right dd strong {
  color: #7d7d7d;
  font-weight: 400;
}

易错点:dt 默认就有加粗,但仍建议显式写 font-weight: 700;strong 默认加粗,若不写 font-weight: 400,章节名会过重。转写稿里“加粗 700”“DD 12 像素”就是这部分调试依据。

状态词高亮 ​

为什么需要:“正在学习”是状态提示,需要和课程名区分。用 span 单独包起来,才能只改这一小段颜色。

怎么想:不要给整个 dd 变蓝,否则章节名也会变蓝;应精确选择 .banner .right dd span。

怎么做:

css
.banner .right dd span {
  color: #00a4ff;
}

易错点:如果“正在学习”没变蓝,先检查 HTML 里有没有 span,再检查选择器是不是写成了 dd span 却层级不对。转写稿里说“正在学习套一个 span,给蓝色”,就是这一步。

复制条目与调试顺序 ​

为什么需要:三条课程结构相同,调好一条后复制最稳,避免重复写错标签。

怎么想:先调好第一个 dl 的 dt、dd、span、strong,确认字号、颜色、间距、边框都正确,再复制整个 dl 两份。转写稿强调“复制的是 DL,不要复制错”,这里同样适用。

怎么做:先保存并刷新,检查第一条课程的下边框、8px 间距、蓝色状态词;确认后再复制两条并替换文字。若文字贴边,检查外层 .right 内容容器是否已有内边距;若分隔线位置不对,检查 border-bottom 是否误给到 dd。

易错点:不要只复制 dt 或 dd 导致结构残缺;不要为了省事把三条课程塞进一个 dl,本节笔记的写法是每条课程一个 dl。调试时先看结构,再看样式,和转写稿里“先看左边结构,再看右边样式”的顺序一致。

先确认结构与选择器:它首先是链接 ​

为什么需要:这个“全部课程”不是普通文字,而是可点击跳转的入口,所以 HTML 用 <a> 而不是 <span> 或 <div>。本节笔记只聚焦这个链接本身,外层沿用已有的 .banner .right 结构。

怎么想:先看它在 banner 右侧内容模块中的位置,再确认样式作用域。笔记用 .banner .right a 选中链接;转写稿里也提醒“不要直接写 A,要写 content 里面的 A”,本质是防止选择器范围过大,误伤右侧其他链接。

怎么做:保留笔记结构:

html
<a href="#">全部课程</a>

样式仍从 .banner .right a 进入,先保证选择器能命中目标链接。

易错点:.banner .right a 会选中 .right 下所有 a。如果右侧还有其他链接,要核对是否被一起改样式;调试时点开元素,看右侧样式是否命中,若完全没样式,优先检查类名和层级是否写错。

块级化与尺寸:A 默认没有宽高 ​

为什么需要:a 是行内元素,直接给 height: 32px 往往不按预期撑开。转写稿里明确说“A 有没有大小?怎么办?转换成块级”,所以要先解决显示模式。

怎么想:这个按钮要横向撑满父容器、形成一整块可点击区域,宽度不必单独写,块级元素默认和父亲一样宽;高度按笔记给 32px。因此先写 display: block,再给高度和背景色。

怎么做:

css
.banner .right a {
  display: block;
  height: 32px;
  background-color: #00a4ff;
  text-align: center;
  line-height: 32px;
  font-size: 14px;
  color: #fff;
  border-radius: 15px;
}

易错点:只写 height 不写 display: block,高度可能不生效;把 background-color 写成 color,会出现“背景怎么不出来”的典型问题。调试时先看盒子是否撑开,再看背景和文字颜色是否写反。

文字居中与胶囊圆角:高度、行高、圆角要配套 ​

为什么需要:按钮文字要水平居中、垂直居中,视觉上才像完整按钮;圆角要形成胶囊感,不能写成大圆或椭圆。

怎么想:水平居中用 text-align: center;垂直居中用 line-height 等于高度,笔记高度 32px,所以行高也写 32px。圆角笔记给 15px,转写稿按“高度一半”推导是 16px,两者视觉接近,本节以笔记 15px 为准。

怎么做:字号 14px、文字白色 #fff,背景 #00a4ff,圆角 15px,都放在同一个选择器里。保存后看三件事:文字是否居中、按钮是否撑满、圆角是否接近胶囊。

易错点:不要随手写 border-radius: 50%,50% 是按宽高比例算的,容易变成椭圆;胶囊型应参考高度的一半。行高不等于高度时,文字会偏上或偏下。

交互态与调试:hover 是可选增强,先保证基础样式 ​

为什么需要:转写稿演示了鼠标移入换背景色、加阴影,让用户知道这里可点击;但笔记核心代码没有 hover,所以要先保证基础按钮正确,再按需增强。

怎么想:先调基础态:块级、高度、背景、文字、圆角。基础态没问题后,再加 :hover 换一个稍深或稍浅的背景色;阴影可用 box-shadow,但不要为了效果影响可读性。

怎么做:在笔记代码基础上可追加类似交互(非笔记原有核心代码,按转写稿思路补充):

css
.banner .right a:hover {
  background-color: #008fd6;
}

调试顺序:先看结构是否命中,再看盒子是否撑开,再看文字是否居中,最后看 hover 是否生效。

易错点:hover 不生效先检查选择器层级和拼写;背景色和文字颜色别写反;加阴影后若按钮发灰,检查阴影透明度和颜色。转写稿强调“先画盒子再填内容”,这里同样适用:先把链接盒子调正确,再追求交互效果。

先看效果,再拆盒子 ​

精品推荐区域最终效果

拿到这个效果图,不要急着写标签。按课上反复强调的布局总纲:先画好盒子,再往盒子里填内容。先分析结构——精品推荐整体是一条白色横条,宽度和版心一致;横条里面明显分三块:左边的标题“精品推荐”、中间一串兴趣标签、右边的“修改兴趣”。三块内容排在同一行,所以外层一个大盒子,里面放三个小盒子即可。

对应的 HTML 结构是:大盒子 .recommend 里放 h3 标题、ul > li > a 的标签列表,以及一个 a.modify 链接(“修改兴趣”能点击,所以用链接)。

html
<!-- 精品推荐 -->
<div class="recommend wrapper">
  <h3>精品推荐</h3>
  <ul>
    <li><a href="#">HTML</a></li>
  </ul>
  <a href="#" class="modify">修改兴趣</a>
</div>

易错点:不要一上来就把 h3、ul、a 全部写完再调样式,那样盒子位置一乱就无从下手。正确顺序是先写大盒子,量宽高、给背景色,确认位置正确,再逐个添加里面的小盒子。

命名:用 recommend,不要用 box1、box2 ​

为什么需要:类名是写给人看的,自己回头看代码、同事接手项目,都要靠类名认模块。课上同学把盒子命名成 box、box1、box11,虽然“有规律”,但过两天自己都分不清哪个 box 是哪个区域。

怎么想:模块里装什么,类名就叫什么。不确定单词就打开有道翻译,直接查“推荐”,得到 recommend,就用它。

怎么做:外层盒子类名写 recommend,以后遇到新闻模块就查 news、广告模块查 banner/ad,直译即可。公司里一般还有命名规范文档,进公司按文档来。

易错点:不要纠结“单词没背过就写不出网页”,单词是在写案例的过程中记住的,容易忘的记到纸质笔记本上反复看。

一个盒子挂两个类名:recommend + wrapper ​

为什么需要:这个盒子宽度要是版心 1200px、还要水平居中,而这两句代码在 .wrapper 里已经写过了。再抄一遍既啰嗦又容易写错。

怎么想:一个盒子可以有多个类名,写了几个名字,就同时拥有这几套样式。

怎么做:<div class="recommend wrapper">,wrapper 负责 width: 1200px; margin: 0 auto 把盒子拉到中间,recommend 负责这个模块自己的样式。中间必须用空格隔开。

易错点:写成 class="recommendwrapper" 就连成一个词了,页面上根本找不到这个类,盒子不会居中;也不要再写第二个 class 属性。

先搭大盒子:宽高、背景色、阴影 ​

盒子结构定了,先只做外层。宽度交给 wrapper;高度用像素大厨量出来是 60px;背景白色;它和上面的 banner 之间有一小段距离,笔记代码里给的是 margin-top: 11px。三块内容要在一行,所以加 display: flex;再给 line-height: 60px 让文字垂直居中,padding: 0 20px 让内容与左右边缘留出空隙。最后复制一条阴影,让白条有立体感。

css
/* 精品推荐 */
.recommend {
  display: flex;
  margin-top: 11px;
  padding: 0 20px;
  height: 60px;
  background-color: #fff;
  box-shadow: 0px 1px 2px 0px rgba(211, 211, 211, 0.5);
  line-height: 60px;
}

调试过程:课上写完发现盒子是通栏的、没在中间,原因是只写了 recommend,忘了挂 wrapper;还有一次改完样式页面没反应,是忘了保存。所以每写一小步就保存、刷新、看效果,确认无误再往下写。

易错点:

  1. banner 写完后先折叠起来,精品推荐是 banner 的兄弟盒子,要写在 banner 外面,别不小心写进 banner 里面造成继承干扰;
  2. 高度一定要量,不要凭感觉写;
  3. 阴影可以直接复制,能复制的就不要手写,抄错一个参数反而更麻烦;
  4. 多类名之间只敲一个空格就够,不要连写。

课件图示 ​

课件第32页:精品课程-标题区域(hd) 思路:“标题”与“查看全部” 各个区域样式复用 •

课件第28页:左侧侧导航(left) 实现方法: • 标签结构:.left > ul > li

课件第30页:精品推荐(recommend) 实现方法: • 标签结构:.recommend

课件第33页:精品课程-内容区域 思路:“课程卡片”各个区域样式复用 标签结构:.bd > u

课件第27页:banner 区域 – 布局 结构:通栏banner > 版心 > .left

课件第31页:精品课程(course) 实现方法: • 标签结构:.hd + .bd • 布局

课件第38页:今日 作业 1. 按照“前端学科课程”布局方式实现“其他学科课程” 区域的布局效

课件第14页:网站根目录是指存放网站的第一层文件夹,内部包含当前网站的所有素材,包含 HTML

代码示例 ​

示例一:banner 左侧侧导航(11-banner区域-侧导航) ​

html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <title>banner 左侧侧导航</title>
  <style>
    /* 基础重置 */
    * { margin: 0; padding: 0; }
    li { list-style: none; }
    a { text-decoration: none; }

    /* 演示用:banner 大盒子,left / right 左右排布 */
    .banner {
      display: flex;
      width: 1200px;
      height: 420px;
      margin: 0 auto;
      background-color: #f5f5f5;
    }

    /* 侧导航 */
    .banner .left {
      padding: 3px 20px;
      width: 191px;
      height: 420px;
      background-color: rgba(0, 0, 0, 0.42);
    }

    .banner .left a {
      /* 块级:宽度是父级的100% */
      display: block;
      height: 46px;
      background: url(../images/right.png) no-repeat right center;
      line-height: 46px;
      font-size: 16px;
      color: #fff;
    }

    .banner .left a:hover {
      background-image: url(../images/right-hover.png);
      color: #00a4ff;
    }
  </style>
</head>
<body>
  <div class="banner">
    <div class="left">
      <ul>
        <li><a href="#">前端开发</a></li>
        <li><a href="#">后端开发</a></li>
        <li><a href="#">移动开发</a></li>
        <li><a href="#">人工智能</a></li>
        <li><a href="#">商业预测</a></li>
        <li><a href="#">云计算&amp;大数据</a></li>
        <li><a href="#">运维&amp;测试</a></li>
        <li><a href="#">UI设计</a></li>
        <li><a href="#">产品</a></li>
      </ul>
    </div>
  </div>
</body>
</html>

要点解释

  • display: block 是这段的核心:a 默认是行内元素,没有高度,必须转成块级元素才能设置 height: 46px;转成块级后宽度自动等于父级的 100%,所以不用再写 width。
  • li 不给宽高:li 的高度是靠里面的 a 撑开的(“孩子能撑开父亲”),这是本案例刻意训练的点。
  • padding: 3px 20px 写在 .left 上:上 3px 是量出来的首项留白(49px 与 46px 的差值),左右 20px 让文字和右侧箭头内缩。如果改成给 a 加 margin,鼠标经过时可点击区域不包含 margin,点击范围会缩水——所以要用 padding。
  • background: url(...) no-repeat right center:一条简写同时定位箭头到右侧、垂直居中。hover 时只写 background-image,不要写 background: 简写,否则会把 no-repeat、right center 一起重置掉。
  • 易错点:../images/right.png 是相对 CSS 文件的路径,图片缺失时箭头不显示,但盒子布局不受影响,别误判成“样式写错了”。

示例二:banner 右侧课程表(12/13/14-课程表布局、内容、全部课程) ​

html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <title>banner 右侧课程表</title>
  <style>
    * { margin: 0; padding: 0; }
    a { text-decoration: none; }

    /* 演示用:banner 大盒子,right 靠右 */
    .banner {
      display: flex;
      justify-content: flex-end;
      width: 1200px;
      height: 420px;
      margin: 0 auto;
      background-color: #f5f5f5;
    }

    /* 课程表 */
    .banner .right {
      margin-top: 60px;
      width: 218px;
      height: 305px;
      background-color: #209dd5;
      border-radius: 10px;
    }

    .banner .right h3 {
      margin-left: 14px;
      height: 48px;
      line-height: 48px;
      font-size: 15px;
      color: #fff;
      font-weight: 400;
    }

    .banner .right .content {
      padding: 14px;
      height: 257px;
      background-color: #fff;
      border-radius: 10px;
    }

    .banner .right dl {
      margin-bottom: 12px;
      border-bottom: 1px solid #e0e0e0;
    }

    .banner .right dt {
      margin-bottom: 8px;
      font-size: 14px;
      line-height: 20px;
      font-weight: 700;
    }

    .banner .right dd {
      margin-bottom: 8px;
      font-size: 12px;
      line-height: 16px;
    }

    .banner .right dd span {
      color: #00a4ff;
    }

    .banner .right dd strong {
      color: #7d7d7d;
      font-weight: 400;
    }

    .banner .right a {
      display: block;
      height: 32px;
      background-color: #00a4ff;
      text-align: center;
      line-height: 32px;
      font-size: 14px;
      color: #fff;
      border-radius: 15px;
    }
  </style>
</head>
<body>
  <div class="banner">
    <div class="right">
      <h3>我的课程表</h3>
      <div class="content">
        <dl>
          <dt>数据可视化课程</dt>
          <dd><span>正在学习</span>-<strong>echarts使用步骤</strong></dd>
        </dl>
        <dl>
          <dt>Vue3医疗项目课程</dt>
          <dd><span>正在学习</span>-<strong>认识组合式API</strong></dd>
        </dl>
        <dl>
          <dt>React核心技术课程</dt>
          <dd><span>正在学习</span>-<strong>rudex配合TS使用</strong></dd>
        </dl>
        <a href="#">全部课程</a>
      </div>
    </div>
  </div>
</body>
</html>

要点解释

  • 两段式结构:.right 负责蓝色底 + 圆角,.content 是白色卡片 + 更小的圆角,用“白盒子盖在蓝盒子上”做出效果,而不是分别给上下两块上色。
  • h3 的 height: 48px; line-height: 48px:单行文字垂直居中的标准写法;font-weight: 400 去掉标题默认加粗,否则会和设计稿不符。
  • dl / dt / dd 的分工:dl 加 border-bottom 做分割线,margin-bottom: 12px 拉开三个模块;dt 加粗(700),dd 小一号;两者各自的 margin-bottom: 8px 控制行与行的距离。
  • span 只包“正在学习”三个字,所以只有它变蓝;strong 必须写 font-weight: 400 去粗,否则“echarts使用步骤”会是粗体灰字。
  • a 必须 display: block:a 是行内元素,不转块级,height: 32px 直接失效。border-radius: 15px 是胶囊圆角,标准算法是高度的一半(32 / 2 = 16),笔记里写 15 也可以。
  • 易错点:.content 写了 height: 257px 又写 padding: 14px,因为没有 box-sizing: border-box,盒子实际高度会变大;这是笔记中的原始写法,量尺寸时要心里有数。

示例三:精品推荐(15-精品推荐-区域布局,多类名) ​

html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <title>精品推荐</title>
  <style>
    * { margin: 0; padding: 0; }
    li { list-style: none; }
    a { text-decoration: none; }

    /* 版心:控制页面整体布局宽度并水平居中 */
    .wrapper {
      width: 1200px;
      margin: 0 auto;
    }

    /* 精品推荐 */
    .recommend {
      display: flex;
      margin-top: 11px;
      padding: 0 20px;
      height: 60px;
      background-color: #fff;
      box-shadow: 0px 1px 2px 0px rgba(211, 211, 211, 0.5);
      line-height: 60px;
    }
  </style>
</head>
<body>
  <!-- 精品推荐 -->
  <div class="recommend wrapper">
    <h3>精品推荐</h3>
    <ul>
      <li><a href="#">HTML</a></li>
    </ul>
    <a href="#" class="modify">修改兴趣</a>
  </div>
</body>
</html>

要点解释

  • 一个盒子两个类名:class="recommend wrapper",中间必须有空格。写成 class="recommendwrapper" 浏览器会当成一个根本不存在的类名,两条样式全部失效——这是本段最大的易错点。
  • 职责分离:.wrapper 只管版心(width: 1200px; margin: 0 auto),.recommend 只管本模块(高度、白底、阴影、flex)。这样后面的模块也能直接复用 wrapper,不用重复写宽和居中。
  • display: flex 让 h3、ul、a 三个子元素排到一行;配合 line-height: 60px 让文字在 60px 高的条里垂直居中。
  • padding: 0 20px 给内容左右留白;margin-top: 11px 与上面的 banner 拉开距离(兄弟盒子之间的间距用 margin)。
  • box-shadow: 0px 1px 2px 0px rgba(...) 四个值依次是:x 偏移、y 偏移、模糊半径、颜色,做出一点立体感。
  • 易错点:h3、ul 的具体字体样式笔记未给出,此处保持浏览器默认,只做了 * { margin: 0; padding: 0 } 和 li { list-style: none } 的重置,避免出现列表符号和默认外边距。

常见错误 ​

  1. 现象:a 设了 margin-left,文字看起来右移了,但鼠标移到左侧空白处无法点击。
    原因:margin 改变盒子位置,不扩大 a 的点击区域。
    修法:给 a 用 padding: 0 20px,必要时配合 display: block / display: flex 扩大可点击范围。

  2. 现象:侧导航每项高度写 49px,最后整体超出或底部距离不对。
    原因:首项/末项测量值特殊,直接逐项写 49px 导致累计误差。
    修法:统一每项 height: 46px,顶部 3px 用父级 padding-top: 3px 处理,底部剩余 3px 不强行补。

  3. 现象:课程表内容贴边,或白色 content 盒子高度/圆角不协调。
    原因:只给了 content 宽高,没有处理内边距;圆角直接照抄父级。
    修法:content 设 height: 257px、白底、较小圆角,并用 padding: 14px 让内部 dl 不贴边。

  4. 现象:课程表多个 dl 之间距离不对,下边框位置也不对。
    原因:把间距/边框加在 dd 或内容上,没有按模块边界处理。
    修法:模块间距给 dl 的 margin-bottom,下边框给 dl 的 border-bottom;dt/dd 只处理自身文字和上下间距。

  5. 现象:精品推荐盒子没有居中,或 recommend 样式不生效。
    原因:多类名之间漏空格,写成 class="recommendwrapper"。
    修法:写成 class="recommend wrapper",一个空格分隔;确保 wrapper 已有版心宽度和居中样式。

  6. 现象:样式明明写了却不生效,调试工具右侧没有对应样式。
    原因:类名拼写错误、选择器层级不对,或样式被层叠覆盖。
    修法:先看结构是否错位;再点选元素看右侧样式,上看层叠划掉项,下看继承来源;类名优先复制,避免手写错。

练习 ​

  1. 改错:侧导航 a 当前写成 margin-left: 20px; margin-right: 20px;,导致点击区域不完整。请改为更合适的写法,并说明原因。

  2. 手写关键 CSS:让 .banner .left 顶部有 3px 距离,内部每个 a 高 46px、行高 46px、左右内边距 20px,并实现 hover 时背景变深、文字变蓝。

  3. 课程表结构练习:用 dl > dt + dd 写出一条课程记录,并补出 dt 加粗、dd 灰色、dd span 蓝色、dl 下边框和模块间距的关键样式。

  4. 精品推荐模块:写出大盒子的类名组合,使其同时具备版心居中和推荐模块自身样式;再写出标题、列表、修改兴趣三块横向排列的关键 flex 设置。

  5. 调试题:页面中某个盒子设置了 padding 但视觉上没变化。请按“先结构、后样式;上看层叠、下看继承”的顺序写出排查步骤。

原视频对照 ​

#视频时长
1复习反馈和今日内容26:31
2左侧left模块制作13:13
3左侧模块制作完成08:43
4右侧标题部分10:54
5右侧content制作06:50
6右侧content里面的dl布局完成08:17
7右侧content链接制作05:58
8精品推荐模块大盒子搭建08:22

小结 ​

  1. 布局先定大盒子,再拆小盒子;按先大后小、先左后右、先上后下推进。
  2. 每个盒子先看宽高、背景色、位置,确认外形正确后再填内容。
  3. 需要整块可点击时,用 a 包内容,并优先用 padding 扩大点击区域。
  4. 背景图适合装饰性、少更换的小图;产品图、广告图、常换图优先用插入图片。
  5. 模块命名优先语义化,能用公司规范就用规范;多类名必须用空格分隔。
  6. 课程表这类模块要分清模块边界:dl 管模块间距和边框,dt/dd 管内部文字层级。
  7. 调试时先确认 HTML 结构,再查样式来源;类名错误和层叠覆盖是最常见问题。
  8. 当天综合案例优先独立复写,再处理作业;能脱离代码还原效果,才算真正掌握。