为什么<br>是HTML元素而不是HTML实体?

57

为什么呢?类似 &br; 这样的东西不更加合适吗?


8
我必须说,除了极少数例外情况(如诗歌),br标签不应该被使用。 - Yi Jiang
4
普利茅斯的 posi-trac 后桥是如何工作的?它就是这样。 - Robert
4
可能是因为HTML忽略了换行符(除了在“pre”标签内)。 - tcooc
9
@Yi Jiang,我不得不说,良好的英语和对其他许多语言的熟练掌握使得换行与段落、标题等文本块的结束有了区别,因此适当时应该使用它。 - Jon Hanna
3
当你想要一个比单词之间的空隙更强的断开,但又不想开始一个新段落时,可以使用特殊符号来表示。 - Jon Hanna
显示剩余5条评论
8个回答

33

HTML实体引用(entity reference)根据HTML版本的不同,可以是SGML实体或XML实体(HTML从底层技术继承了实体)。实体是一种将在文档其他地方定义好的内容块插入文档中的方式。

所有HTML实体都是单个字符实体,因此基本上与字符引用相同(从技术上讲,它们与字符引用不同,但由于没有定义多字符实体,因此这种区别对HTML没有影响)。

例如,当HTML处理器看到&mdash;时,它会使用DTD中的相关部分,将其替换为该实体引用的内容和适当的实体。

<!ENTITY mdash   CDATA "&#8212;" -- em dash, U+2014 ISOpub -->
所以它用实体引用替换了实体&#8212;,而这个实体引用又被字符(U+2014)替换。实际上,除非你正在使用不直接理解HTML的通用XML或SGML处理器,否则这将在一步完成。
现在,要让你假设的&br;产生换行符,我们不能使用换行符,甚至不是较少人知道的U+2028 LINE SEPARATOR(在纯文本中语义上与HTML中的<br/>相同),因为它们是空格字符,在大多数HTML代码中并不重要。这对于编写HTML来说是件好事情,因为如果我们不能在源代码中格式化可读性,那么编写HTML将会更加困难。
我们需要的不是一个实体,而是一种明确表示渲染内容在此处包含换行符的语义方法。我们还需要不指示任何其他内容(我们可以通过开始或结束块元素来指示换行符,但这不是我们想要的)。唯一合理的方法是拥有一个意味着正是这样的元素,因此我们有了<br/>元素,并将其相关标记放入源代码中。

1
HTML实体可以是多字符实体;标准默认不定义任何实体。但你说得对,<br>是语义换行的指示。(现在,如果你能抨击一下那些认为<br><br>可以替代<p>的白痴人士,我的一天就完美了... ;-)) - Donal Fellows
3
@Donal 当我说它们在技术上不同的时候,我的确是这个意思,但由于没有定义多行(multi-s),所以这种区别没有任何影响。至于人们认为双行间隔符与段落相同,这种想法错误的方面太多了,无法将抱怨这一点纳入允许的评论空间中。 - Jon Hanna

22
存在着不同的原因来使用标签和字符实体引用 - 字符实体是某些字符的替身(有时需要转义序列 - 例如 &amp; 用于代表和号 &),标签则是用于结构。 <br> 标签存在的原因是 HTML 折叠空格。需要一种方法来指定一个硬换行 - 必须换行的位置。这就是 <br> 标签的作用。
没有单个字符具有此含义,尽管 U+2028 LINE SEPARATOR 具有类似的含义,即使将其用于换行也没有帮助,因为它被认为是空格,HTML 会折叠它。
有关此方面的更多详细信息,请参见 @John Kugelman@John Hanna 的回答。
与此并不完全相关,还有另一个原因为什么不存在 &br; 字符实体引用:换行的定义方式可能包含多个字符,请参见 HTML 4 规范
引用块:

换行定义为回车符(&#x000D;)、换行符(&#x000A;)或回车符/换行符对。

字符实体是单字符转义,因此无法表示此内容,在 HTML 4 规范 中也有说明:

字符实体引用是一个 SGML 构造,它引用了文档字符集中的一个字符。

你会发现所有已定义的字符实体都映射到了单个字符。换行符/新行无法通过这种方式进行清晰的映射,因此需要使用实体而不是字符实体引用。

这就是为什么换行符不能由字符实体引用表示的原因。

不过,这并不重要,因为只需使用 Enter 键即可插入换行符。


8
&br;是一个实体引用,而不仅仅是一个字符引用。它确实可以表示不止一个字符。 - Gumbo
3
我不认为这与问题有任何关系。需要硬换行符的原因是因为 HTML 中的空白会被折叠并忽略换行符,而与 Windows 使用\r\n作为行尾无关。 - John Kugelman
5
那与此毫无关系。不同的行尾编码标准完全是一个误导。问题不在于没有办法用一个字符来表示行尾,而是因为HTML不能区分空格、制表符和换行符:它们都是空白字符,而换行符并没有得到特殊对待。 - John Kugelman
6
确实,在空格很重要的情况下(如在<pre>元素中),不同的行尾符号都会被规范化,因此不会造成任何问题。这个回答完全是误导性的。 - Jon Hanna
4
我不明白为什么这个答案仍然能够得到赞成票。从你最初的错误回答开始,你似乎只是复制其他答案的部分来保持在顶部。但是,除了不准确之外,你的回答仍然没有回答问题,即为什么不使用实体引用来标记HTML换行符。 - Gumbo
显示剩余11条评论

9
实体是其他字符或文本的替身。在HTML中,它们用于表示难以输入的字符(例如,&mdash;代表“—”)或需要转义的字符(&amp;代表“&”)。一个假设的&br;实体代表什么?
它不能是\r\n\r\n,因为这些已经很容易输入了(只需按回车键即可)。你要解决的问题是,HTML在大多数情况下会折叠空白,并将换行符视为空格。也就是说,\n不是换行符,它只是像制表符和空格一样的空白字符。
实体&br;必须被替换为其他文本。你要使用哪个字符来代表“硬换行”的概念?标准的换行符\n恰好是正确的字符,但不幸的是它不适合,因为它被放入通用的“空白字符”桶中。你要么重载其他控制字符来表示“硬换行”,要么使用一些扩展的Unicode字符。当HTML设计时,Unicode还只是一个新兴的、正在发展的标准,所以那不是一个选择。 <br>元素是向文档添加“硬换行”概念的简单、直接的方法,因为没有任何字符可以代表该概念。

6
在HTML中,由于空格被忽略但人们仍然需要将空格强制添加到文本中(不使用“pre”),因此发明了" "。因此,我认为为什么没有类似的东西用于换行符是一个非常合理的问题。现在有一个特殊的0u00A0 Unicode字符来表示 ,因此我认为创建一个类似的Unicode字符用于换行符(例如&br;)并不是个坏主意。这与我们有 的原因完全相同。 - manixrock
3
@manixrock,你完全搞错了关于 的细节。 是一个实体引用,因此需要从别处定义一些内容并在处理更高级别的源代码之前将其插入到源代码中。如果非间断空格字符不存在,那么这是不可能实现的。 很有用,因为许多人在键盘上没有快速绑定非间断空格的方式,并且因为它在源代码中与空格无法区分。我们没有 &br; 的原因是对于该实体应替换为什么存在疑问。 - Jon Hanna
2
@manixrock...事实上,从来没有任何标准定义过   不能被折叠成一个空格(这将是一种有效的呈现行为),只是不能在决定文本换行位置时将其视为断词符。  强制额外添加空格是有效的,并且是所有浏览器所做出的选择,但不是必需的。当一个标准甚至不能承诺会发生 X 时,你无法说该标准做了允许 X 的事情。 - Jon Hanna
@John 为什么没有选择ASCII控制字符作为&br;的参考? - Pacerier

6
在HTML中,所有 换行 都被视为空格:
引用块: 换行被定义为回车符(&#x000D;)、换行符(&#x000A;)或回车符/换行符对。所有换行符都构成空格。
空格 只是分隔单词,空格序列被折叠:
引用块: 对于除 PRE 元素之外的所有HTML元素,空格序列将单词(这里我们使用术语“单词”表示“非空格字符序列”)。[...] [...] 请注意,在源文档中单词之间的一系列空格可能会导致完全不同的渲染间隔(除了PRE元素的情况)。特别是,用户代理应在生成输出间隔字时折叠输入空格序列。[...]
这意味着换行不能用普通字符表示。虽然Unicode中有一些特殊字符可以明确地分隔行和段落,但它们在HTML中没有被指定用于此目的:

请注意,尽管&#x2028;&#x2029;在[ISO10646]中被定义为分别明确地分隔行和段落,但它们在HTML中不构成换行符号[...]。

这意味着在HTML中没有普通字符或普通字符序列来标记换行。这就是为什么有BR元素的原因。
现在,如果您想使用&br;而不是<br>,您只需要声明实体br来表示值<br>:
<!ENTITY br "<br>">

声明了这个名为br的实体后,通用的XML或SGML处理器将会用它所代表的值(<br>)替换每一个出现的实体引用&br;。例如一个文档:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
   "http://www.w3.org/TR/html4/strict.dtd" [
   <!ENTITY br "<br>">
]>
<HTML>
   <HEAD>
      <TITLE>My first HTML document</TITLE>
   </HEAD>
   <BODY>
      <P>Hello &br;world!
   </BODY>
</HTML>

2
他们想要完全停止使用<br>,因此他们必须将其定义为<pre>&#a;</pre> - Jon Hanna

3

实体是内容,标签则是结构或布局(非常粗略地说)。似乎制作 <br> 标签的人认为换行更多地与结构和布局有关,而不是与内容有关。由于无法实际“看到”<br>,我倾向于同意这种观点。哦,我是边写边想的,所以请随意反驳;)


3
HTML是一种标记语言——它代表文档的结构,而不是文档在视觉上的呈现方式。以<EM>标签为例,它告诉用户代理应该强调放置在开放和关闭<EM>标签之间的任何文本,但它并没有规定这种强调应该如何呈现。是的,大多数视觉Web浏览器会把文本显示为斜体,但这只是一种约定。其他浏览器,例如单色纯文本浏览器,可能会将文本显示为相反的颜色。屏幕阅读器可能会用更响亮的声音读出文本,或改变发音。搜索引擎蜘蛛可能会认为该文本比其他元素更重要。
同样适用于<BR>标签——它不仅仅是另一个字符实体,它实际上代表了文档结构中的换行。一个<BR>不仅仅是换行符的替代品,而是文档及其结构的“语义”部分。这类似于<H1>不仅仅是使文本变大、变粗的一种方式,而是文档结构的一个重要组成部分。

那么 <br> 标签意图表示什么样的换行呢? - Pacerier

2

br元素可以进行样式设置。那么你该如何对一个HTML实体进行样式设置呢?由于它们是元素,因此更加灵活。


7
我不同意;对<br />元素进行样式设置是一种hack方法;系统并没有为容纳hack而构建,hack是为了绕过系统而构建的。 - Richard JP Le Guen
我甚至会说这是支持它成为实体而不是元素的原因。在那次会议上,谁说过:“但是如果他们需要在新行周围加上红色边框呢?” :P - Richard JP Le Guen
3
实际上,在<br style="clear: both" />中,样式的主要(几乎唯一)用途是清除浮动。这并不算是一种“hack”手段。 - HoLyVieR
@Gregory Baker:在我看来,BR标签可以采用“clear:both”等样式的事实是使用标签而不是实体表示硬换行的最有说服力的原因。指定它必须映射到某个字符,实现应该将其呈现为新行<i>之后</i>消除空格也可以工作,但需要特殊处理以处理新行上的前导空格(如果我有选择权,则唯一吞咽空格的是由空格(其他人将变为空格))。 - supercat
@HoLyVieR - 我从未见过一个<br style="clear: both" />不能够用更好的CSS和更有效的HTML元素标识符来实现的。就我个人而言,我认为这是一种hack(不正规的解决方法)。 - Richard JP Le Guen

0

是的。HTML实体更合适,因为换行标签不能包含文本,并且表现得很像换行符。

但事实并非如此。太晚了。由于未关闭的换行标签,我不知道有多少不兼容XML的HTML文档需要处理...


至少这个容易处理;不像未关闭的嵌套列表和表格。 - Rex M
6
换行标签不像换行符一样,因为它在渲染中不会被忽略。换行标签表示已呈现文档中的换行,这是使用实体无法表示的。 - Jon Hanna
如果我们可以使用   添加额外的空格,那么为什么不以类似的方式添加分页符或换行符呢?这样肯定会更加一致。 - Shanimal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接