在 <body> 中使用 <style> 标签和其他 HTML

新手上路,请多包涵
<html>
  <body>
    <style type="text/css">
      p.first {color:blue}
      p.second {color:green}
    </style>

    <p class="first">Hello World</p>
    <p class="second">Hello World</p>

    <style type="text/css">
      p.first {color:green}
      p.second {color:blue}
    </style>

    <p class="first">Hello World</p>
    <p class="second">Hello World</p>
  </body>
</html>

浏览器应该如何呈现不连续的 css?是否应该使用页面上的所有 css 样式生成一些数据结构并将其用于渲染?

或者它是否按照它看到的顺序使用样式信息进行渲染?

原文由 Gagan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
1 个回答

警告:此答案引用了 scoped style 不应再使用的标签!

正如其他人已经提到的,HTML 4 需要将 <style> 标记放置在 <head> 部分(即使大多数浏览器允许 <style> 标记中的 body )。

但是,HTML 5 包括 scoped 属性(请参阅下面的更新),它允许您创建范围在 <style> 标记的父元素内的样式表。这也使您能够将 <style> 标签放置在 <body> 元素中:

 <!DOCTYPE html>
<html>
<head></head>
<body>

<div id="scoped-content">
    <style type="text/css" scoped>
        h1 { color: red; }
    </style>

    <h1>Hello</h1>
</div>

    <h1>
      World
    </h1>

</body>
</html>

如果您在支持 scoped 的启用 HTML-5 的浏览器中呈现上述代码,您将看到样式表的有限范围。

只有一个 重要 的警告……

在我写这个答案的时候(2013 年 5 月),目前几乎没有主流浏览器支持 scoped 属性。 (尽管 Chromium 的开发者版本 显然支持它。)

但是,与此问题相关的 scoped 属性有一个有趣的含义。这意味着未来的浏览器通过标准被强制允许 <style> 中的元素(只要 <body> <style> 元素在范围内。)

所以,鉴于:

  • 目前几乎所有现有浏览器都会忽略 scoped 属性
  • 目前几乎所有现有浏览器都允许 <style> 标签在 <body>
  • 未来的实施将需要允许(范围内的) <style> 标签在 <body>

…那么在身体内放置 <style> 标签实际上 _没有任何危害_,只要您将来使用 scoped 属性来证明它们。唯一的问题是当前的浏览器实际上不会 _限制样式表的范围_——它们会将它应用到整个文档。但关键是,出于所有实际目的,您 可以<body> 中包含 <style> 标签,前提是您:

  • 通过包含 scoped 属性让您的 HTML 面向未来
  • 了解截至目前, <body> 中的样式表实际上不会被限定范围(因为还没有主流浏览器支持)

\* 当然,除了激怒 HTML 验证器…


最后,关于在 HTML 中嵌入 CSS 是不良做法的常见(但主观)说法,应该注意 scoped 属性的 全部要点 是适应允许开发人员导入块的典型现代开发框架HTML 作为模块或联合内容。嵌入 适用于特定 HTML 块的 CSS 非常方便,以便开发具有特定样式的封装模块化组件。


根据 Mozilla 文档,自 2019 年 2 月起更新,不推荐使用 scoped 属性。 Chrome 在版本 36 (2014) 和 Firefox 在版本 62 (2018) 中停止支持它。在这两种情况下,该功能都必须由用户在浏览器设置中明确启用。没有其他主流浏览器支持它。

Can I Use 网站报告称 “该属性已从当前规范中删除”。 自 2016 年以来。

原文由 Charles Salvia 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题