打开任何一个网页的格代源代码,你都会看到大量连续的格代空格在浏览器里被压缩成了一个。这不是格代bug,是格代HTML的规矩。你敲十个空格,格代它只认一个。格代那如果想在页面上真的格代显示出多个空格怎么办?用 。
这六个字符——&、格代n、格代b、格代s、格代p、格代;——就是格代HTML里最常用的空格实体。它的格代全称是non-breaking space,中文一般叫“不换行空格”。格代名字已经说明了它的两个功能:一是占一个空格的位置,二是阻止浏览器在这个位置换行。
为什么需要它?直接敲空格不行吗?不行。HTML的解析规则里,连续空白字符(空格、制表符、换行)会被合并成一个。你在代码里写:
<p>姓名: 张三</p> 浏览器渲染出来,“姓名:”和“张三”之间就有三个空格的宽度。如果直接敲三个空格,页面只会显示一个。
我刚开始写网页那会儿,为了对齐表单里的文字,满屏都是 。一个两个还好,多了之后代码像被蜜蜂爬过。后来才知道,这玩意儿用多了有副作用。
它不换行。假设你写了一段很长的文字,中间全用 连接,浏览器找不到断点,这段内容就会撑破容器,出现横向滚动条。手机上尤其明显。所以它适合短距离的间距控制,比如图标和文字之间、按钮内边距的微调,而不是拿来排版大段文本。
另一个问题是可访问性。屏幕阅读器读到 时,有些会念出“空格”两个字,有些直接跳过。如果用它来制造视觉上的缩进,盲人用户听到的内容就会很奇怪。真正需要缩进,应该用CSS的text-indent或padding。
除了 ,HTML还定义了其他几种空格实体。 是半角空格,宽度大约等于半个中文字符; 是全角空格,宽度等于一个中文字符。这两个在中文排版里偶尔会用到,比如段落首行缩进两个字符,可以写两个 。但同样,CSS的text-indent: 2em;是更干净的做法。
还有个冷门的 ,窄空格,宽度比普通空格还小。在一些数学公式或特殊排版里能见到,日常写页面基本用不上。
说到具体案例。我之前维护过一个老项目,导航栏的菜单项之间用了一串 做间隔。后来设计要求改成响应式,屏幕窄的时候菜单要换行。结果那些 把菜单项焊死在了一行,怎么调CSS都不换行。最后只能把源码里的 全删了,换成margin。改完之后代码清爽了一半。
那什么时候该用 ?我的判断标准很简单:如果这个空格是为了“内容”本身,比如英文里的“10 kg”,数字和单位之间不应该断行,那就用。如果是为了“样式”,比如间距、对齐、缩进,那就交给CSS。
顺便提一句,在HTML里直接敲空格键,只要不是连续多个,浏览器都会正常显示。比如<p>hello world</p>,中间那个空格没问题。只有连续空格才会被压缩。所以日常写文字,正常敲空格就行,不需要每个空格都写成实体。
还有个小细节: 在不同字体下的宽度不一样。Arial里的 和宋体里的 宽度有差异。如果你的布局依赖它来精确对齐,换字体就可能错位。这也是它不适合做布局工具的原因之一。
总结一下实际用法:短距离、不换行的空格用 ;中文缩进用 或CSS;大段间距、对齐、响应式布局,一律用CSS的margin、padding、gap。HTML负责内容结构,空格的事,大部分时候不该它管。