Skip to content

CSS 长度单位和颜色设置与CSS 基本选择器(Day5 4/4) ​

本页对应 Day05_CSS,共 5 段视频,约 42 分钟。

学习目标 ​

  • 能使用 letter-spacing 与 word-spacing 分别设置字间距和词间距,并通过示例说明 word-spacing 对中文通常无效、零值可省略单位、负值会产生紧凑或重叠效果。
  • 能使用 text-decoration 设置 underline、overline、line-through、none,并能去除 a、ins、del 等元素的默认修饰线。
  • 能使用 text-indent 设置段落首行缩进,正确使用长度、em 或百分比值,并说明该属性只影响首行。
  • 能使用 text-align 设置 left、right、center,并说明它影响元素内文本内容的水平对齐,而不是元素自身位置。
  • 能说明 vertical-align 不能设置普通块级元素内文本的纵向对齐,并能用它设置行内元素或行内块元素与同行文本按 baseline、top、middle、bottom 或长度值对齐。
  • 能使用 vertical-align 的 sub、super 实现下标和上标效果,并说明在表格 td、th 中可设置内容纵向对齐,而普通元素不适用。

知识点 ​

字词间距:letter-spacing 与 word-spacing ​

为什么需要:排版时,字与字、词与词之间默认挨得较近;有时需要拉开或收紧距离。怎么想:先分清“字”和“词”。letter-spacing 管字与字,word-spacing 管词与词。怎么做:给段落加类名后写长度值。示例:

css
.book01 { letter-spacing: 10px; }
.book02 { word-spacing: 30px; }

调试时把 letter-spacing 从 10px 改成 0、负值,能看到字距收紧甚至叠在一起;0 可省略单位。word-spacing 对英文按空格判断词,所以中文通常无效果。易错点:letter-spacing 可用像素、em 等长度,百分比规则不必死记,实际用时试;word-spacing 不要误以为能处理中文分词。

文本修饰线:text-decoration ​

为什么需要:下划线、上划线、删除线是常见文本语义提示。怎么想:把线加在文字上,而不是给元素加边框。怎么做:

css
.item01 { text-decoration: underline; }
.item02 { text-decoration: overline; }
.item03 { text-decoration: line-through; }
a, ins, del { text-decoration: none; }

转写稿中通过 span 对比看到下划线、上划线、删除线;线的颜色默认跟文字 color 一致。超链接、ins、del 自带修饰线,可用 text-decoration: none 去掉。易错点:删除线值是 line-through,不是 underline 或 overline;none 对多数元素是默认值,但对自带线的元素很有用。

首行缩进:text-indent ​

为什么需要:中文段落常需要首行空两格。怎么想:只影响首行,不影响其他行。怎么做:给段落设宽度便于换行,再设 text-indent:

css
p { width: 600px; }
.book01 { text-indent: 2em; }

转写稿先设 20px 看到首行右移,又试 -20px 和 50%。百分比参照元素或一行宽度,但不必背规则。易错点:text-indent 只管首行;中文段落最自然的单位常是 em,2em 接近两个字宽。

文本水平对齐:text-align ​

为什么需要:控制段落内文字靠左、靠右或居中。怎么想:它设置的是元素里的文字内容,不是元素本身。怎么做:

css
p {
  width: 600px;
  height: 200px;
  background: #ccc;
  text-align: center;
}

值有 left、right、center。调试时给 p 设宽高和背景,能明显看到文字位置变化。易错点:给 p 设 text-align 不会把 p 盒子本身移动;多行文字要有左右活动空间,否则靠右或居中不明显。

vertical-align:不是文本纵向居中 ​

为什么需要:图片、行内块与同行文字常出现高低不齐,需要控制纵向对齐。怎么想:vertical-align 不是给块元素做文字纵向居中;它主要设置行内元素或行内块元素与同行文本如何对齐。怎么做:默认值是 baseline,图片底部默认与文字基线对齐。可改为 top、middle、bottom,也可写长度:

css
img { vertical-align: middle; }

转写稿强调:要给图片本身设,不能给父元素设后指望继承。长度表示元素底部与基线的距离,可为负值;百分比参照文字大小,类似 em,用时试即可。它还能配合 font-size 做上下标:

css
span.sub { font-size: 12px; vertical-align: sub; }
span.sup { font-size: 12px; vertical-align: super; }

另外,表格单元格 td、th 可用 vertical-align: top/middle/bottom 做内容纵向对齐,其他元素不能这样用。易错点:vertical-align: middle 不会让块内文字纵向居中;sub、super 不要写反;Chrome 等浏览器有最小字号限制,文字小于 12px 常仍按 12px 显示。

作业范围与使用方式 ​

本节笔记只有两项:课堂案例、google 字体设置。转写稿实际讲的是“文本样式”课堂案例:字间距、词间距、文本修饰线、首行缩进、水平对齐、vertical-align。其中“google 字体设置”在转写稿里没有对应讲解,不能凭空补步骤;作业时先保留该任务项,等课堂材料补充。本节笔记未附图片,转写稿提到的示意图不在文本中,因此不虚构图片。下面按转写稿可验证内容整理,代码保留关键写法。

字间距与词间距 ​

为什么需要:排版时有时要让字母更松或更紧,也要控制英文单词之间的距离。
怎么想:字间距管“字和字”,词间距管“词和词”;英文靠空格分词,中文分词复杂,所以 word-spacing 对中文通常无效果。
怎么做:

css
.book01 { letter-spacing: 10px; }
.book02 { word-spacing: 30px; }

letter-spacing 可写 px、em,也可为负值;0 可不写单位。word-spacing 也写长度,转写稿演示 30px 后英文单词间距变大,中文无明显变化。
易错点:letter-spacing 负值过大会叠字;转写稿明确说字间距写百分比无效。词间距不要误以为能解决中文分词。

文本修饰线 ​

为什么需要:下划线、上划线、删除线是常见文本强调方式,也要能去掉链接、ins、del 的默认线。
怎么想:统一用 text-decoration,值有 underline、overline、line-through、none。线色默认跟随文字 color。
怎么做:

css
.item01 { text-decoration: underline; }
.item02 { text-decoration: overline; }
.item03 { text-decoration: line-through; }
a, ins, del { text-decoration: none; }

转写稿调试时先写三个 span,分别加上下划线、上划线、删除线;再用选择器选中 a、ins、del 去掉默认线。
易错点:删除线值是 line-through,不是 underline 或 overline;none 对大多数元素是默认值,但超链接、ins、del 常自带线,需要显式去掉。

首行缩进 ​

为什么需要:中文段落常需要“首行空两字”,比手动敲空格更稳定。
怎么想:只缩进第一行,用 text-indent;最自然单位是 em,2em 约等于两个汉字宽度。
怎么做:

css
p { width: 600px; }
.book01 { text-indent: 2em; }

转写稿先给段落设 600px 宽,让文字换行,再给第二段加 text-indent: 2em,观察只有首行右移。
易错点:它只管首行,不是整段缩进;负值虽能生效但不推荐;百分比可生效但参照规则不必死记,转写稿建议用到时现场试。

文本水平对齐 ​

为什么需要:控制段落内容靠左、靠右或居中。
怎么想:用 text-align,默认 left,还有 right、center。它影响的是元素里的文字内容,不是元素盒子本身。
怎么做:

css
p {
  width: 600px;
  height: 200px;
  background: #ccc;
  text-align: center;
}

转写稿给 p 设宽高和背景,方便观察区域;改成 right 靠右,改成 center 居中。
易错点:不要以为 text-align 能把 p 盒子移动;多行文字时,前面行可能因占满宽度看不出效果,最后一行更容易观察。手册里还有新标准值,本阶段先掌握这三个。

vertical-align 的三类用途 ​

为什么需要:图片、行内块和同行文字常出现“对不齐”;上下标也需要微调。
怎么想:vertical-align 不是给普通块元素设置“文字纵向居中”的。它主要管行内元素/行内块与同行文本的纵向对齐;对 td、th 是特例,可设单元格内容纵向对齐。
怎么做:

css
img { vertical-align: middle; }
td { vertical-align: bottom; }
.sub { font-size: 12px; vertical-align: sub; }
.sup { font-size: 12px; vertical-align: super; }

常见关键字:baseline 基线对齐(默认)、top 顶线、middle 中线、bottom 底线;也可写长度,表示元素底部与基线的距离,负值向下。转写稿用图片演示:默认图片底部贴文字基线,改 middle 后图片中线对齐文本中线,改 bottom 后图片底部对齐文本底线。上下标可用 sub、super 配合较小字号实现,不必只用 sub/sup 标签。
易错点:给 div、p 设 vertical-align: middle 不能让内部文字纵向居中;长度和百分比规则不要死记,转写稿建议现场试。Chrome 等浏览器有最小字号限制,转写稿演示小于 12px 仍按约 12px 显示,所以不要设无意义的超小字号。

课堂画面 ​

课堂画面 1

课堂画面 2

课堂画面 3

课堂画面 4

课堂画面 5

代码示例 ​

代码一:字词间距 / 首行缩进 / 文本修饰线 / 水平对齐 ​

html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>文本样式:字词间距、缩进、修饰线、水平对齐</title>
<style>
  body { font-size: 16px; }

  /* 参照段落:不设样式 */
  p { width: 600px; background: #ccc; margin: 10px 0; }

  /* 1. 字间距:字与字(字母与字母)之间的距离,值是一个长度 */
  .book01  { letter-spacing: 10px; }
  .book01b { letter-spacing: -2px; }   /* 负值会挤在一起 */

  /* 2. 词间距:浏览器靠空格判断“词”,所以只对英文有效 */
  .book02 { word-spacing: 30px; }

  /* 3. 首行缩进:只缩第一行,2em 正好两个汉字宽,最像中文段落 */
  .indent01 { text-indent: 2em; }

  /* 4. 文本修饰线 */
  .u  { text-decoration: underline; }     /* 下划线 */
  .o  { text-decoration: overline; }      /* 上划线 */
  .lt { text-decoration: line-through; }  /* 删除线 */

  /* a、ins、del 自带修饰线,用 none 去掉 */
  a, ins, del { text-decoration: none; }

  /* 5. 水平对齐:只影响元素内部的文字,不改变元素自身位置 */
  .box       { width: 600px; height: 200px; background: #ccc; }
  .al-left   { text-align: left; }    /* 默认值 */
  .al-right  { text-align: right; }
  .al-center { text-align: center; }
</style>
</head>
<body>
  <p>Hello world 这是参照段落,Hello world 这是参照段落,Hello world 这是参照段落。</p>

  <p class="book01">Hello world 字间距 10px,Hello world 字间距 10px,Hello world。</p>
  <p class="book01b">Hello world 字间距 -2px,负值会叠到一起。</p>
  <p class="book02">Hello world 词间距 30px,中文之间没有效果,中文之间没有效果。</p>
  <p class="indent01">首行缩进 2em,正好是两个汉字的宽度,最接近中文段落排版。注意只有第一行缩进,第二行、第三行都不会缩进,这是 text-indent 和 padding 最大的区别。</p>

  <p>
    <span class="u">下划线 underline</span>
    <span class="o">上划线 overline</span>
    <span class="lt">删除线 line-through</span>
  </p>

  <p>
    <a href="#">超链接(自带下划线已被去掉)</a>
    <ins>ins 增加的内容</ins>
    <del>del 删除的内容</del>
  </p>

  <p class="box al-left">left 左对齐(默认)</p>
  <p class="box al-right">right 右对齐</p>
  <p class="box al-center">center 居中对齐</p>
</body>
</html>

要点解释 / 易错点

  • letter-spacing(字间距)和 word-spacing(词间距)的值都是长度:px、em 都可以。letter-spacing 写 0 时可以不写单位,写负值字会重叠。
  • letter-spacing 写百分比无效(没有参照物);word-spacing 写百分比同样不用死记规则,用时现场试。
  • word-spacing 对中文无效:浏览器只是机械地按“空格”判断英文单词,中文没法分词,所以这个属性基本只对英文页面有意义。
  • text-indent 只作用于块级元素的第一行,值可以是长度、负数、百分比(百分比参照元素宽度)。日常排版首选 2em,正好两个汉字。
  • text-decoration 的删除线是 line-through,不是 middle-line;去掉修饰线是 none,不是 no。
  • a、ins、del 自带修饰线,用选择器选中它们设置 text-decoration: none; 即可去掉;多个选择器可以用逗号合并写。
  • text-align 只让元素里的文字靠左/右/居中,元素本身的位置不会变;另外多行文字里最后一行的居中效果才明显,左右被挤满的行看不出区别。

代码二:vertical-align 让行内块与同行文字纵向对齐 ​

html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>vertical-align:行内块与同行文本的纵向对齐</title>
<style>
  .box { font-size: 20px; background: #eee; padding: 10px; margin: 10px 0; }

  /* 行内块元素:真实项目里通常就是 img,img 本身就是行内块 */
  .pic {
    display: inline-block;
    width: 100px;
    height: 80px;
    background: #4a90d9;
  }

  /* vertical-align 必须写在“行内元素 / 行内块元素”自己身上 */
  .v-baseline { vertical-align: baseline; } /* 默认值:基线对齐 */
  .v-bottom   { vertical-align: bottom; }   /* 底线对齐 */
  .v-middle   { vertical-align: middle; }   /* 中线对齐 */
  .v-top      { vertical-align: top; }      /* 顶线对齐 */
  .v-length   { vertical-align: 10px; }     /* 元素底部离基线 10px,往上走 */
  .v-negative { vertical-align: -10px; }    /* 负值往下走 */

  /* 行内元素没有宽高,看不出对齐效果,这里只做对比 */
  .tag { background: #900; color: #fff; }
</style>
</head>
<body>
  <div class="box">这是一行文字 <span class="tag">我是 span</span> 文字后边还有字</div>

  <div class="box">文字 <span class="pic v-baseline"></span> baseline 基线对齐(默认,方块底部贴文字基线)</div>
  <div class="box">文字 <span class="pic v-bottom"></span> bottom 底线对齐</div>
  <div class="box">文字 <span class="pic v-middle"></span> middle 中线对齐(最常用,图文混排最自然)</div>
  <div class="box">文字 <span class="pic v-top"></span> top 顶线对齐</div>
  <div class="box">文字 <span class="pic v-length"></span> 长度值 10px,相对基线往上抬</div>
  <div class="box">文字 <span class="pic v-negative"></span> 负值 -10px,相对基线往下沉</div>
</body>
</html>

要点解释 / 易错点

  • 四条参考线:基线 baseline(大写字母和 n、l 的底部)、底线 bottom(g、p、q 的尾巴)、顶线 top、中线 middle。vertical-align 就是让行内块选择自己哪条线去对文字的那条线。
  • vertical-align 不是 text-align 的纵向版本!给 p、div 设置它完全不会让里面的文字垂直居中——那是 line-height、flex 或表格才能干的事。
  • 必须用选择器直接选中那个行内块元素(如 img 或本例的 .pic)来设置;写在父元素上不会继承下去,这是最常见的踩坑点。
  • 行内元素(span、a 等)不能设宽高,本身被内容撑开,所以给它们设 vertical-align 基本看不出效果;真正受益的是行内块元素(img、input、display:inline-block 的盒子)。
  • 除了关键字,还可以写长度:正值往上、负值往下,参照的是元素底部与基线的距离;写 em 和写百分比参照的都是文字大小。

代码三:vertical-align 做上标下标 + 表格单元格纵向对齐 ​

html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>vertical-align:上标下标 与 表格单元格纵向对齐</title>
<style>
  body { font-size: 20px; }

  /* 上标 / 下标:小字号 + vertical-align 关键字,任意元素都能做 */
  .sub { font-size: 12px; vertical-align: sub; }   /* 下标,注意不带 e */
  .sup { font-size: 12px; vertical-align: super; } /* 上标 */

  /* 表格:给 table 加 border 只有外框,要给 td 加才有格子线 */
  table { width: 600px; height: 400px; border-collapse: collapse; }
  td {
    border: 1px solid #333;
    text-align: center;   /* 横向对齐,任何元素都能用 */
  }

  /* 纵向对齐:只有表格单元格 td / th 才吃得下 */
  .c-top    { vertical-align: top; }
  .c-middle { vertical-align: middle; }
  .c-bottom { vertical-align: bottom; }
</style>
</head>
<body>
  <div>H<span class="sub">2</span>O —— 用 span 也能做出下标效果</div>
  <div>2<span class="sup">10</span> = 1024 —— 用 span 也能做出上标效果</div>

  <table>
    <tbody>
      <tr>
        <td class="c-top">top<br>顶部对齐</td>
        <td class="c-middle">middle<br>垂直居中</td>
        <td class="c-bottom">bottom<br>底部对齐</td>
        <td>默认 baseline</td>
        <td>高考</td>
      </tr>
    </tbody>
  </table>
</body>
</html>

要点解释 / 易错点

  • sub / super 这两个关键字只有 super 带 e,写错就不生效;再配合 font-size 调小字号,就能用 span 做出 sup、sub 元素的效果——CSS 的规则就是任何元素都能改成任何样式。
  • Chrome 及现在主流浏览器限制字号最小 12px,把 font-size 写成 1px、5px 刷新后没变化是正常的,浏览器会按 12px 渲染,所以别指望靠极小字号做效果。
  • 表格里 vertical-align 只认 top、middle、bottom、baseline 这几个值,sub、super 在这里不生效。
  • 这个“纵向对齐”的能力仅限 td、th,给普通 p、div 设置想让它里面文字垂直居中,是没有任何效果的。
  • 用 CSS 给 table 加 border 只会出现一个外框,想让每个单元格都有线,必须把边框加到 td 上(本例配合 border-collapse: collapse 合并双线)。

常见错误 ​

  1. 给中文段落设 word-spacing 毫无变化 现象:加了 30px,中文文字纹丝不动,英文才有反应。 原因:word-spacing 靠"空格"识别词边界,中文没有空格,浏览器不做分词。 修法:调字符间距一律用 letter-spacing;word-spacing 只用于英文排版。

  2. letter-spacing: 10% 写了没效果 现象:换百分比值刷新后间距不变。 原因:该属性需要长度,百分比无参照物,浏览器直接丢弃该声明。 修法:用 px / em,需要负值收紧也用长度;百分比规则各属性不同,用时现测,不要套记。

  3. 给外层 div 写 vertical-align 想让里面的图片对齐 现象:图片位置一点没变。 原因:vertical-align 不继承,且只对行内元素、行内块元素、表格单元格生效。 修法:选择器直接命中 img / span / td 本身;父容器写了等于白写。

  4. 想用 text-align: center 让盒子本身居中 现象:文字居中了,但整个 div 还是贴在左边。 原因:text-align 只影响元素内部的行内内容,动不了元素自己的盒子。 修法:块级盒子水平居中用 margin: 0 auto(需有宽度);文字居中才用 text-align。

  5. 给 p 设 vertical-align: middle 想让文字在 200px 高的盒子里垂直居中 现象:完全无效,文字仍贴着基线。 原因:该属性不是"元素内文本的纵向对齐",与 text-align 不是一对。 修法:单行文本用 line-height 等于高度;多行或复杂布局用 flex/grid。

  6. text-indent 设了 20px,结果只有第一行缩进,以为写错了 现象:段落其余行顶格。 原因:属性语义就是"首行"缩进,不是整段缩进。 修法:整段留白用 padding-left;首行缩进用 text-indent: 2em(两个汉字宽度)。

  7. 去掉链接下划线时把 text-decoration: none 写在父容器上 现象:a 的下划线还在。 原因:text-decoration 不属于可继承的常规文本属性,且 a、ins、del 自带默认线。 修法:选择器直接命中 a(或 a, ins, del 并集选择器)再设 none。

  8. 字号设成 8px 想模拟下标,结果没变小 现象:改到 12px 以下数值无效。 原因:浏览器有最小字号限制(Chrome 及现代浏览器为 12px)。 修法:需要更小视觉尺寸时用 transform: scale(),不要指望 font-size。

练习 ​

  1. 中英混排间距对照:写三个段落,内容中英混排。第一段作参照;第二段加 letter-spacing(分别试 10px、0、-2px、10%);第三段加 word-spacing: 30px。记录每种设置的实际表现,并解释哪个值被浏览器忽略了、为什么。

  2. 装饰线组合实验:用 3 个 span 分别做下划线、上划线、删除线;再加一个链接和一段 ins/del 文本,用一条并集选择器一次性去掉它们的默认线。最后尝试在一个元素上同时叠加两条线,看是否成立。

  3. 首行缩进三连:给同一段文字分别设置 text-indent: 20px、-20px、50%,观察差异;再把 20px 换成 2em,说明为什么 em 才是段落缩进最合适的单位。

  4. 对齐边界测试:一个 600×200、带背景色的 p,文字分别设 left / right / center;然后把文字量加到需要换行,观察多行时"靠右/居中"的视觉感受为何被削弱。再回答:如果想让这个 p 盒子本身在页面居中,该写什么?

  5. vertical-align 综合题:一段文字中插入一张图片,用关键字分别让图片与文字基线、中线、顶线、底线对齐;再用数值(0、10px、-10px、1em)微调并观察方向。最后用 span + font-size + vertical-align: sub/super 手写出 H₂O 和 2¹⁰,并在表格 td 里试 top/middle/bottom,说明哪些元素上这个属性才真正管用。

原视频对照 ​

#视频时长
1字词间距05:24
2文本修饰线04:55
3首行缩进02:38
4文本水平对齐方式03:24
5vertical-align25:53

小结 ​

  1. 这一组属性的共同陷阱是"属性作用对象错位":text-align 管内部行内内容,vertical-align 管行内/行内块在行中的位置,都不是管盒子自己。
  2. vertical-align 是本次最复杂的属性,三条主线要分清:行内块与同行文本对齐、上下标、表格单元格内容纵向对齐;不继承是排查时的第一检查点。
  3. 凡是关键字值,按规范语义理解而非字面直觉——top 是顶线不是"顶部",baseline 是基线不是"底部"。
  4. 涉及百分比的长度属性,参照物各不相同,不要统一记忆;写出小案例实测一次比背规则更可靠。
  5. 浏览器默认样式(a/ins/del 的线、td 的垂直居中)会掩盖你的设置效果,调试时先确认"到底是我的样式没生效,还是默认样式本来就这样"。
  6. 平台限制要记牢:最小字号 12px 是硬性下限,小于它的值等于没写。
  7. 排查"设了没反应"的固定顺序:该属性对当前 display 类型是否生效 → 是否可继承 → 值单位/关键字是否合法 → 是否被默认样式或优先级覆盖。
  8. 这些属性单看零碎,但在图文混排、表格、导航去下划线等场景里是高频刚需;vertical-align 尤其值得吃透,后面对齐类布局疑难多半靠它兜底。