源本科技 | 码上会

CSS 文本空白

2026/03/04
26
0

学习目标

  1. 理解 white-space 属性如何控制元素内的空白字符和文本换行行为

  2. 掌握 normalnowrapprepre-linepre-wrapbreak-spaces 等关键值的区别与应用场景

  3. 学会处理代码展示、诗歌排版、长单词不换行等特定布局需求

  4. 理解 initialinherit 在属性重置与继承中的作用

  5. 能够根据设计需求选择最合适的空白处理策略


white-space

CSS 中的 white-space 属性用于控制元素内部空白字符(空格、制表符、换行符)的处理方式以及文本的自动换行行为。它直接影响内容的布局和可读性,是处理特殊文本格式(如代码块、地址、诗歌)的关键工具。

基本语法:

white-space: normal | nowrap | pre | pre-line | pre-wrap | break-spaces | initial | inherit;

该属性通过不同的取值,决定了浏览器是合并多余的空格、保留源代码中的换行,还是强制文本在一行显示。

属性值

下表总结了 white-space 各个属性值的核心行为:

属性值

空白合并

保留换行符

自动换行

行为描述

normal

默认值。合并连续空白,必要时自动换行

nowrap

合并连续空白,强制文本在一行显示(除非遇到 <br>

pre

保留所有空白和换行,类似 HTML <pre> 标签,不自动换行

pre-line

合并连续空白,保留换行符,必要时自动换行

pre-wrap

保留所有空白和换行,必要时自动换行

break-spaces

类似 pre-wrap,但允许在空格处换行并保留空格宽度

initial

-

-

-

重置为默认值 (normal)

inherit

-

-

-

从父元素继承该属性值

常用属性

1. 默认模式

normal 是浏览器的默认行为。它会将源代码中连续的多个空格、制表符合并为一个空格,并在容器宽度不足时自动换行。

应用场景: 常规段落文本。

示例代码:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>white-space: normal</title>
    <style>
        .box {
            width: 300px;
            height: 150px;
            white-space: normal; /* 默认值,可省略 */
            background-color: #32cd32; /* 石灰绿 */
            color: white;
            font-size: 24px;
            padding: 10px;
        }
    </style>
</head>
<body>
    <div class="box">
        技术社区:
        一个专为开发者打造的计算机科学门户。
        这里有很多   多余的空格   会被合并。
    </div>
</body>
</html>

效果说明:
无论源代码中有多少个空格,渲染后只显示一个。文本在到达容器右边缘时会自动折行。

2. 强制单行

nowrap 会合并连续空白,但禁止文本自动换行。文本会一直向右延伸,直到遇到显式的换行标签(如 <br>)或容器被强制截断(产生滚动条或溢出)。

应用场景: 导航菜单项、不允许折行的按钮文字、表格表头。

示例代码:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>white-space: nowrap</title>
    <style>
        .box {
            width: 200px;
            height: 100px;
            white-space: nowrap;
            background-color: #90ee90; /* 浅绿 */
            color: black;
            font-size: 20px;
            border: 1px solid #333;
            overflow: hidden; /* 演示溢出隐藏效果 */
        }
    </style>
</head>
<body>
    <div class="box">
        技术社区:一个专为开发者打造的计算机科学门户,即使内容很长也不会换行。
    </div>
</body>
</html>

效果说明:
文本强行在一行显示,超出容器宽度的部分会被隐藏(如果设置了 overflow: hidden)或产生横向滚动条。

3. 保留格式模式

pre 的行为完全等同于 HTML 的 <pre> 标签。它会原样保留源代码中的所有空格、制表符和换行符,且不会自动换行。

应用场景: 展示代码片段、ASCII 艺术图、需要严格对齐的数据。

示例代码:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>white-space: pre</title>
    <style>
        .box {
            width: 250px;
            height: 150px;
            white-space: pre;
            background-color: #90ee90;
            color: black;
            font-family: monospace; /* 等宽字体更适合代码 */
            font-size: 16px;
            border: 1px solid #333;
            overflow: auto; /* 允许滚动查看长行 */
        }
    </style>
</head>
<body>
    <div class="box">
        技术社区:
            缩进   被   保留
        换行也被保留
        这一行非常长以至于超出了容器宽度也不会自动折行...
    </div>
</body>
</html>

效果说明:
源代码中的缩进和换行被完美保留。长行文本会冲出容器边界(需配合 overflow 使用)。

4. 智能换行模式

pre-linenormalpre 的混合体。它会合并连续的空格,但保留源代码中的换行符,并在必要时自动换行。

应用场景: 诗歌、歌词、地址列表(希望保留作者的手动换行,但允许长句自动折行)。

示例代码:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>white-space: pre-line</title>
    <style>
        .box {
            width: 200px;
            height: 150px;
            white-space: pre-line;
            background-color: #90ee90;
            color: black;
            font-size: 18px;
            border: 1px solid #333;
        }
    </style>
</head>
<body>
    <div class="box">
        床前明月光,
        疑是地上霜。
        举头望明月,   多余空格被合并
        低头思故乡。
        这是一句很长的话,虽然源代码里没换行,但太长了会自动折行。
    </div>
</body>
</html>

效果说明:
源代码中的回车换行生效,多个空格变成一个,长句子在容器边缘自动折行。

5. 完美保留模式

pre-wrap 保留了所有空白和换行符,同时允许文本在容器边缘自动换行。这是展示代码或格式化文本最常用的值,因为它既保持了格式,又避免了横向滚动条。

应用场景: 代码块展示、聊天记录、需要保留格式的长文本。

示例代码:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>white-space: pre-wrap</title>
    <style>
        .box {
            width: 250px;
            height: 150px;
            white-space: pre-wrap;
            background-color: #90ee90;
            color: black;
            font-size: 18px;
            border: 1px solid #333;
        }
    </style>
</head>
<body>
    <div class="box">
        技术社区:    保留多个空格
        保留换行
        这一行非常长,会在容器边缘自动折行,而不会溢出。
    </div>
</body>
</html>

效果说明:
空格、换行均被保留,且长文本会自动折行以适应容器宽度,不会产生横向溢出。

6. 高级空格换行

break-spaces 的行为与 pre-wrap 非常相似,保留空白和换行并自动折行。不同之处在于,它允许在空格字符处进行换行,并且换行后的空格会被渲染出来(占据空间),而 pre-wrap 在行尾的空格通常会被忽略或不作为换行点。

应用场景: 需要精确控制空格视觉效果的复杂排版。

示例代码:

.box {
    white-space: break-spaces;
    /* 其他样式... */
}

效果说明:
如果一行末尾有多个空格,break-spaces 可能会在这些空格处断开,并将剩余的空格显示在下一行的开头,这在某些多语言排版或数据对齐中非常有用。

7. initial 与 inherit

  • initial:将属性重置为 CSS 规范定义的初始值(即 normal)。常用于覆盖继承来的样式。

  • inherit:强制子元素继承父元素的 white-space 值。常用于确保组件内部行为一致。

示例代码:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>initial 与 inherit</title>
    <style>
        .parent {
            white-space: pre-wrap;
            border: 2px solid black;
            padding: 10px;
            margin-bottom: 20px;
        }
        .child-inherit {
            white-space: inherit; /* 继承父级的 pre-wrap */
            border: 1px solid red;
            padding: 5px;
            margin-top: 5px;
        }
        .reset-normal {
            white-space: initial; /* 重置为 normal */
            border: 1px solid blue;
            padding: 5px;
            margin-top: 5px;
        }
    </style>
</head>
<body>
    <div class="parent">
        父容器:保留格式 (pre-wrap)
        <div class="child-inherit">
            子容器 (inherit):    我也保留了空格和换行。
        </div>
        <div class="reset-normal">
            重置容器 (initial):    多余空格被合并,恢复默认行为。
        </div>
    </div>
</body>
</html>

总结

white-space 属性是控制文本微观布局的强大工具。选择合适的值取决于你是否需要保留源代码中的格式(空格 / 换行)以及是否允许自动换行。

需求场景

推荐属性值

普通文章段落

normal (默认)

导航栏、单行标题

nowrap

代码块、ASCII 艺术 (需横向滚动)

pre

诗歌、地址 (保留手动换行,允许自动折行)

pre-line

代码块、格式化文本 (最佳实践)

pre-wrap

特殊空格排版需求

break-spaces


思考题

  1. 如果你想在网页上展示一段 Python 代码,要求保留代码的缩进和换行,同时在屏幕较窄时自动换行以避免出现横向滚动条,应该使用哪个 white-space 属性值?

  2. white-space: prewhite-space: pre-wrap 的主要区别是什么?在什么情况下你会选择 pre 而不是 pre-wrap

  3. 假设父容器设置了 white-space: nowrap,如何让其中的某个子段落恢复为正常的自动换行行为?请写出对应的 CSS 代码。