【问题标题】:How to close <img> tag properly?如何正确关闭 <img> 标签?
【发布时间】:2013-02-13 18:30:41
【问题描述】:
<img src='stackoverflow.png'>
<img src='stackoverflow.png'></img>
<img src='stackoverflow.png' />

哪一个是正确的?

【问题讨论】:

  • 问题是“如何正确关闭 标签?”这是一个真正的问题,答案很有用。这个问题不应该被关闭。
  • 这个问题目前很好。它不是模棱两可、模糊、不完整、过于宽泛或修辞。下面也有一个很好的答案。
  • 我不知道以下哪个答案是正确的,但有趣的是,如果你不把它放在那里,Firefox 的代码检查器会在标签末尾添加 。而IE没有。这在我的世界中很重要。
  • P.S. Dreamweaver 插入 /> XHTML 标记。

标签: html


【解决方案1】:

这个是valid HTML5,不关闭它绝对没问题。就是所谓的void元素:

<img src='stackoverflow.png'>

以下是有效的 XHTML 标记。他们必须关闭。后者在 HTML 5 中也很好:

<img src='stackoverflow.png'></img>
<img src='stackoverflow.png' />

【讨论】:

  • 它不仅在 HTML5 中有效,而且在 HTML4 中也有效。正如您所说,HTML 不需要自动关闭的“void”元素。 +1 以获得连贯的答案。
  • 如果目标是 4.01 过渡和更高版本,HTML5 或 XHTML 将无法通过 W3C 的 HTML 检查器进行验证。另见W3C Markup Validation Service。您需要使用&lt;img src='stackoverflow.png'&gt;(如果对您很重要)。
  • 多年后发表评论...在 Firefox 76 的 about:logo 页面中看到 &lt;img src="about:logo" alt="about:logo"&gt; 标记感到困惑!虽然document.body.innerHTML 显示&lt;img src=\"about:logo\" alt=\"about:logo\"&gt;...很好的答案...
【解决方案2】:
<img src='stackoverflow.png' />

工作正常并正确关闭标签。最好为视障人士添加alt 属性。

【讨论】:

  • &lt;img /&gt; 在 [X]HTML/XML 中有效是正确的,尽管如今 XHTML 的使用非常罕见,如果您的服务器将页面作为 text/html 提供服务,那么您只需担心的是编写有效的 HTML。必须将 HTML 应用程序迁移到 XHTML 的可能性几乎为零。
  • 如果目标是 4.01 过渡和更高版本,上面的答案将无法使用 W3C 的 HTML 检查器进行验证。另见W3C Markup Validation Service。我相信上面的答案需要 HTML5 或 XHTML。为避免验证失败,您需要使用&lt;img src='stackoverflow.png'&gt;(如果对您很重要)。
  • @FabrícioMatté 你严重低估了实际使用中的 xhtml。公司越大,他们就越有可能使用 xhtml 而不是 html,或者像 xhtml 那样格式化的 html5(以便于/更快地解析),或者你使用其他东西,比如微数据,或者像 ixbrl 这样的增强标记。
  • “工作正常”和“指定”之间有很大的区别,您永远不会发现任何 HTML 规范要求在该标记上使用右斜杠。正如其他人所提到的,允许不破坏最初编写为使用 XHTML/XML 的网站,但是您在任何地方都找不到任何说明其使用的措辞或示例。事实上,您会发现说明它没有任何意义的措辞,并指示浏览器忽略它!
  • Rob - 6 年前有一个问题。这确实解决了它。猜猜现在浏览器更好
【解决方案3】:

其实HTML5中只有第一个是valid

<img src='stackoverflow.png'>  

只有最后两个在 XHTML 中有效

<img src='stackoverflow.png'></img>  
<img src='stackoverflow.png' />

(虽然不是严格要求,alt 属性_通常_也应该包括在内)。

也就是说,您的 HTML5 页面可能会按预期显示,因为浏览器会将您的 html 重写或解释为它认为您的意思。这可能意味着它将一个标签,例如,从
&lt;div /&gt; 变成&lt;div&gt;&lt;/div&gt;。或者它可能只是忽略了&lt;img ... /&gt; 上的最后一个斜线。
see 2016: Serve HTML5 as XHTML 5.0 for legacy validation.
see: 2011 discussion and additional links here, though over time some bits may have changed

部分原因是浏览器非常努力地进行错误纠正。另外,因为自闭标签和无效标签有很多混淆。最后,规范已经改变,或者并不总是很清楚,并且浏览器试图向后兼容。

因此,虽然您可以选择这三个选项中的任何一个,但
只有第一个符合 HTML5 标准,并保证通过 HTML5 验证器。

一个合理的策略可能是:

  • 编写不带右斜杠的新代码。
  • 重构代码时,更新附近的图像标签,因为你遇到它们。
  • 除非有特殊需要,否则不要过分担心旧文件中的标签,除非有特殊需要。

这里是tags that should not be closed in HTML5的列表:

 <br>    <hr>    <input>       
 <img>  <link>   <source>  
 <col>  <area>   <base>
 <meta> <embed>  <param>  
<track>  <wbr>   <keygen> (HTML 5.2 Draft removed)

【讨论】:

  • 这在技术上是不正确的。自闭合 void 元素在 html 5 中完全有效。请参阅html.spec.whatwg.org/#start-tags,这将使&lt;img src='stackoverflow.png' /&gt; 在任何版本的 XHTML 和 HTML 5 中都有效。
  • @RobertMcKee 不,它在技术上是正确的。虽然允许使用右斜线,并且不会被标记为错误,但在任何 HTML 规范中都不会看到它被指定为使用。允许不破坏基于 XHTML/XML 的旧网站,但您将永远找不到任何 HTML 规范通过文字或示例显示在 W3C 指定的那些标签上使用右斜杠或 WHATWG。
  • @Rob 根据我在上面第 12.1.2.1.6 节中链接的 WHATWG 文档 - Then, if the element is one of the void elements, or if the element is a foreign element, then there may be a single U+002F SOLIDUS character (/). This character has no effect on void elements, but on foreign elements it marks the start tag as self-closing. img 在第 12.1.2 节中是一个空元素
  • @RobertMcKee 是的。那是(部分)规范,概述了为什么允许使用斜杠(出于我在之前的评论中给出的原因)。但是,您应该查看该元素的实际规范(在这种情况下为 img),它通过文字和示例清楚地表明,不需要或指定结束斜线。事实上,如果不查找它,在该部分的进一步阅读将说明结束斜杠没有任何意义,什么都不做,浏览器需要忽略它。所以它是无用和毫无意义的,让我们回到我原来的评论:没有使用结束斜线。
  • @Rob 是的,它是可选的,但这样做完全有效。这使得声明 Actually, only the first one is valid in HTML5 在技术上不正确。第二个在 HTML5 中也有效。不是必需的,但有效。没有人认为它是必需的。只有按照规范,使用标签的自闭合形式在所有当前形式的 XHTML 和 HTML 中都是有效的。
【解决方案4】:

两个都是正确的答案。 HTML5 遵循严格的规则,在 HTML5 中我们可以关闭所有标签。因此,这取决于您使用 HTML5 还是 HTML 并遵循适当的答案。

<img src='stackoverflow.png'>
<img src='stackoverflow.png' />

第二个属性更合适。

【讨论】:

  • 不正确。第一个是 any HTML 规范中唯一指定的。仅出于历史原因允许使用第二个,但同样,在任何地方都没有按要求指定。
【解决方案5】:

您应该使用的标签的最佳用途:

<img src="" alt=""/>

也可以在 HTML5 中使用:

<img src="" alt="">

这两个在 HTML5 中完全有效 选择其中一个并坚持下去。

【讨论】:

  • 第一个是 not 最好的,因为它没有在 any HTML 标准中指定,而第二个是。仅出于历史原因允许第一个! (与旧网站中的 XHTML/XML 使用的兼容性,如果浏览器不允许,则会中断。)
  • 不确定 Rob 在这里想说什么,但 html 规范确实指定第一个是有效的。
【解决方案6】:

如果您尝试使用 XHTML 解析器来阅读结束标签,那么它会很有帮助。可能是一个边缘案例,但我一直这样做。拥有它并没有什么坏处,这意味着我知道我们可以使用一组 XML 阅读器,它们在遇到未闭合的标签时不会倒下。

如果您永远不会尝试解析内容,则忽略关闭。

【讨论】:

    【解决方案7】:

    -标签是空的,它只包含属性。 -标签没有“关闭”标签。

    所以,

    <img src='stackoverflow.png'>
    <img src='stackoverflow.png' />
    

    两者在 HTML5 中也是正确的。

    【讨论】:

    • 第一是正确的!第二种只允许出于历史原因。 (与旧网站中的 XHTML/XML 使用的兼容性,如果浏览器不允许,则会中断。)
    【解决方案8】:

    不幸的是,上述解决方案在我的情况下不起作用 - 可能是因为将按钮放在表单标签内。这段代码...

    <input class="button" type="submit" value=" ">
        <img src="../assets/logo.png" alt="test" />
    </input>
    

    ... 总是会导致错误(有或没有 img 标签的右斜杠):

    error  Parsing error: x-invalid-end-tag  vue/no-parsing-error
    
    ✖ 1 problem (1 error, 0 warnings)
    

    一种可行的解决方法是通过以下方式将图像定义为背景图像

    html sn-p 仅描述按钮。 value 属性包含一个空格,以抑制某些浏览器显示不需要的默认文本。

    <input class="button" type="submit" value=" " />
    

    CSS 定义了按钮的背景图片:

    .button {
      display: block;
      width: 6em;
      height: 6em;
      color: white;
      background-color: #639f59;
      padding: 0.4em 1.2em;
      box-shadow: inset 0 -0.6em 1em -0.35em rgba(5, 122, 11, 0.30),
        inset 0 0.6em 2em -0.3em rgba(255, 255, 255, 0.30),
        inset 0 0 0em 0.05em rgba(255, 255, 255, 0.30);
      cursor: pointer;
      background: url("../assets/logo.png") ;
      background-repeat: no-repeat;
      background-size: 6em;
      background-position: center;
      border: 0;
      border-radius: 3em;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 2019-05-09
      • 1970-01-01
      • 2013-06-28
      • 2018-02-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多