【问题标题】:Why is <br> an HTML element rather than an HTML entity?为什么 <br> 是 HTML 元素而不是 HTML 实体?
【发布时间】:2011-03-30 03:03:38
【问题描述】:

为什么?像&amp;br; 这样的东西不是更合适吗?

【问题讨论】:

  • 我不得不说,除了非常罕见的情况(想到诗)之外,永远不要使用br 标签。
  • 普利茅斯的 posi-trac 后端到底是如何工作的!?就是这样。
  • 可能是因为 HTML 忽略了换行符。 (pre 除外)
  • @Yi Jiang,我不得不说,良好的英语,以及对许多其他语言的良好使用,将换行符与结束一段文本(段落,标题等)区分开来,所以它最肯定应该在适当的时候使用。
  • 你想要一个比单词之间的空格更强的休息,但又不想开始一个新的段落。

标签: html


【解决方案1】:

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

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

当 HTML 处理器看到时,例如 &amp;mdash;,它会根据 DTD 中的以下部分将其替换为具有相应实体的实体引用的内容:

<!ENTITY mdash   CDATA "&#8212;" -- em dash, U+2014 ISOpub -->

因此它将实体引用替换为实体&amp;#8212;,而实体引用又被替换为字符 (U+2014)。实际上,除非您使用不直接理解 HTML 的通用 XML 或 SGML 处理器来执行此操作,否则这将真正一步完成。

现在,我们将用什么替换您假设的 &br;与导致换行发生?我们不能使用换行符,甚至是鲜为人知的 U+2028 LINE SEPARATOR(在纯文本中的语义与 HTML 中的 &lt;br/&gt; 含义相同),因为它们是空白字符,在大多数情况下并不重要HTML 代码,您应该感谢这一点,因为如果我们无法在源代码中格式化以提高可读性,那么编写 HTML 将会更加困难。

我们需要的不是实体,而是一种在语义上表示渲染内容此时包含换行符的方法。我们也不需要指示其他任何内容(我们已经可以通过开始或结束块元素来指示换行符,但这不是我们想要的)。这样做的唯一合理方法是有一个元素正是这个意思,所以我们有 &lt;br/&gt; 元素,其相关标签被放入源代码中。

【讨论】:

  • HTML 实体可以是多字符实体;默认情况下,该标准没有定义任何内容。但是你说&lt;br&gt; 是一个语义 换行符的指示是对的。 (现在,如果你能对那些认为&lt;br&gt;&lt;br&gt;&lt;p&gt; 的替代品的白痴们稍加指责,我的日子就结束了……;-))
  • @Donal 当我说它们在技术上有所不同时,这正是我的意思,但由于没有定义 multi-s,所以区别没有影响。至于认为双换行符与段落相同的人,有太多不同的方式表明这种想法是错误的,以至于无法将其抱怨到允许的评论空间中。
【解决方案2】:

标签和字符实体引用的存在出于不同的原因 - 字符实体是某些字符的替身(有时需要作为转义序列 - 例如 &amp;amp; 用于 & 和 &amp;),标签用于结构。

&lt;br&gt; 标签存在的原因是 HTML 会折叠空格。需要有一种方法来指定硬换行符 - 必须 有一个换行符的地方。这就是&lt;br&gt;标签的作用。

没有单个字符具有此含义,尽管U+2028 LINE SEPARATOR 具有相似含义,即使使用它也无济于事,因为它被认为是空格,HTML 会折叠它。

有关这方面的更多详细信息,请参阅@John Kugelman@John Hanna 的答案。


不完全相关,&amp;br; 字符实体引用不存在还有另一个原因:换行符的定义方式可以包含多个字符,请参阅HTML 4 spec

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

字符实体是单个字符转义,因此不能表示这一点,再次在HTML 4 spec

字符实体引用是引用文档字符集字符的 SGML 构造。

您将看到所有已定义的字符实体都映射到一个单个字符。换行/换行不能以这种方式干净地映射,因此需要一个实体而不是字符实体引用。

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

无论如何,它不需要,因为只需使用 Enter 键插入换行符。

【讨论】:

  • 但是&amp;br; 是一个实体引用,而不仅仅是一个字符引用。它肯定可以代表不止一个字符。
  • -1 我根本不明白这有什么关系。需要硬换行指示符的原因是因为 HTML 中的空格被折叠并且换行符被忽略。它与使用\r\n 作为行尾的Windows 没有任何关系。
  • 这真的与它无关。不同的行尾编码标准是一个完全的红鲱鱼。问题不在于无法表示以一个字符结尾的行,而在于 HTML 不区分空格、制表符和换行符:它们都是空格,而换行符不”没有得到特殊待遇。
  • 确实,在空格很重要的情况下(在&lt;pre&gt; 元素中),不同的行尾都被规范化,根本不是问题。这个答案完全具有误导性。
  • 我不明白为什么这个答案仍然获得投票。从您最初的错误答案开始,您似乎只是复制了其他答案的一部分以保持浮动。但是,除了不准确之外,您的答案仍然没有回答为什么它不是用于标记 HTML 换行符的实体引用的问题。
【解决方案3】:

实体是其他字符或文本位的替代品。在 HTML 中,它们用于表示难以键入的字符(例如,&amp;mdash; 表示“—”)或需要转义的字符(&amp;amp; 表示“&”)。假设的 &amp;br; 实体代表什么?

不能是\r\n\r\n,因为这些已经很容易输入了(只需按Enter)。您试图解决的问题是 HTML 在大多数情况下会折叠空格 并将换行符视为空格。也就是说,\n 不是换行符,它只是制表符和空格之类的空格。

实体&amp;br; 必须替换为其他文本。你用什么字符来表示“硬换行”的概念?标准换行符\n 是完全正确的字符,但不幸的是它不合适,因为它被扔进了通用的“空白”桶中。您必须重载其他一些控制字符来表示“硬换行符”,或者使用一些扩展的 Unicode 字符。在设计 HTML 时,Unicode 只是一个新生的、仍在发展的标准,所以这不是一个选择。

&lt;br&gt; 元素是将“硬换行”概念添加到文档中的简单直接的方法,因为没有字符可以代表该概念。

【讨论】:

  •  之所以发明,是因为空格被忽略了,但人们仍然需要在 html 中的文本中强制使用空格(不使用 pre)。所以我认为这不仅仅是一个有效的问题,为什么换行没有发生同样的事情。现在   有一个特殊的 0u00A0 unicode 字符。 ,而且我认为为换行设置类似的换行符并不是一个坏主意,例如 &br;可以实施。出于完全相同的原因,我们有  
  • @manixrock,你有   的详细信息完全倒退。  是一个实体引用,因此需要在其他地方定义的东西并将其插入到源中,然后再在更高级别进行处理。如果不间断的空格字符不存在,那么这将永远不可能。  之所以有用,是因为许多人的键盘上没有快速绑定以获取不间断的空间,并且因为它在源上与空间无法区分。我们没有&br;的原因是应该用什么替换该实体的问题。
  • @manixrock ...事实上,它从未在任何标准中定义过  不能折叠成一个空格(这将是一个有效的渲染行为),只是在决定在哪里换行时不能将其视为分词。那个  强制额外空间是有效的,并且所有浏览器都做出了选择,但不是必需的。当一个标准甚至没有承诺 X 会发生时,你就不能说它做了允许 X 的事情。
  • @John 为什么没有选择 ASCII 控制字符作为 &br; 的参考? ?
【解决方案4】:

在 HTML 中,所有 line breaks 都被视为空格:

换行符定义为回车符 (&amp;#x000D;)、换行符 (&amp;#x000A;) 或回车符/换行符对。所有换行符构成空白。

white space 只分隔单词,并且空格序列被折叠:

对于除PRE 之外的所有HTML 元素,空格序列分隔“单词”(我们在这里使用术语“单词”来表示“非空格字符的序列”)。 […]

[…]

请注意,源文档中单词之间的一系列空格可能会导致呈现完全不同的单词间距(PRE 元素的情况除外)。特别是,用户代理在产生输出字间距时应该折叠输入的空白​​序列。 […]

这意味着换行符不能用纯字符表示。尽管 Unicode 中有某些特殊字符可以明确分隔行和段落,但它们在 HTML 中也没有指定这样做:

请注意,尽管在 [ISO10646] 中定义 &amp;#x2028;&amp;#x2029; 分别明确分隔行和段落,但它们并不构成 HTML 中的换行符 […]

这意味着没有纯字符或纯字符序列来标记 HTML 中的换行符。这就是为什么会有BR element

现在如果你想使用&amp;br;而不是&lt;br&gt;,你只需要声明实体br来表示值&lt;br&gt;

<!ENTITY br "<br>">

声明了这个名为 br 的附加实体后,通用 XML 或 SGML 处理器将用它所代表的值 (&lt;br&gt;) 替换实体引用 &amp;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>

【讨论】:

  • 他们想完全停止使用&lt;br&gt;,所以他们必须将其定义为&lt;pre&gt;&amp;#a;&lt;/pre&gt;
【解决方案5】:

实体是内容,标签是结构或布局(非常粗略地说)。似乎将&lt;br&gt; 标记为标签的人认为,换行更多地与结构和布局有关,而不是与内容有关。无法真正“看到”&lt;br&gt; 我倾向于同意。哦,我正在编造这个,所以随意不同意;)

【讨论】:

    【解决方案6】:

    HTML 是一种标记 语言——它代表了文档的结构,而不是该文档的视觉外观。以&lt;EM&gt; 标签为例——它告诉用户代理他们应该强调放在&lt;EM&gt; 开始和结束标签之间的任何文本。然而,它没有说明应该如何表示重点。是的,大多数可视网络浏览器会将文本以斜体显示,但这只是惯例。其他浏览器,例如单色纯文本浏览器,可能会反向显示文本。屏幕阅读器可能会以更大的声音阅读文本,或更改发音。搜索引擎蜘蛛可能会认为文本比其他元素更重要。

    &lt;BR&gt; 标签也是如此——它不仅仅是另一个字符实体,它实际上代表了文档结构中的一个中断。 &lt;BR> 不仅是换行符的替代品,而且是文档的“语义”部分及其结构。这与&lt;H1&gt; 的方式类似,它不仅可以使文本更大更粗,而且是文档结构方式的一个组成部分。

    【讨论】:

    • 那么
      标签打算表示什么样的中断?
    【解决方案7】:

    br 元素可以设置样式。您将如何设置 HTML 实体的样式?因为它们是元素,所以它们更加灵活。

    【讨论】:

    • 我不同意;为&lt;br /&gt; 元素设置样式是一种技巧;系统不是为了适应黑客而构建的,黑客是为了绕过系统而构建的。
    • ... 我什至会说这是支持它成为一个实体而不是一个元素的原因。谁在那次会议上说“但是如果他们需要在新线路周围设置红色边框怎么办?” :P
    • @Richard 实际上,br 中样式的主要(并且几乎唯一)使用是
      。这不是真正的黑客攻击。
    • @Gregory Baker:在我看来,BR 标签可以采用像“clear:both”这样的样式这一事实是使用标签而不是实体来表示硬换行符的最令人信服的原因。指定它必须映射到某个字符,实现应该在 空格被消除之后将其呈现为换行符也可以,尽管需要特殊处理来处理新行上的前导空格(如果我有我的德鲁特人,唯一吞下空白的是换行符,换行符之前或之后是空格(其他人会变成空白))
    • @HoLyVieR - 我从未见过&lt;br style="clear: both" /&gt;,这是用更好的 CSS 和更有效的 HTML 元素标识符无法实现的。就个人而言,我认为这是一种黑客行为。
    【解决方案8】:

    是的。 HTML 实体会更合适,因为中断标记不能包含文本并且行为很像换行符。

    不过,事情并非如此。太晚了。由于未关闭的中断标签,我无法告诉你我不得不处理的不兼容 XML 的 HTML 文档的数量......

    【讨论】:

    • 至少这是一个容易处理的问题;不像未封闭的嵌套列表和表格。
    • 中断标签的行为不像换行符,因为它不会在渲染中被忽略。中断标记表示呈现的文档中的换行,这不可能用实体来指示。
    • 会很好。我们可以使用   添加额外的空格,为什么不添加以类似方式尊重的分页符或换行符。它肯定会更加一致。
    猜你喜欢
    • 1970-01-01
    • 2010-12-12
    • 2012-12-21
    • 1970-01-01
    • 2010-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多