【发布时间】:2015-02-06 18:15:45
【问题描述】:
我想开始使用一些 HTML5 标签,但担心它会如何在不支持 HTML5 的浏览器上呈现。似乎 html5shiv 是我可以用于 IE 浏览器的解决方案
但是,如果浏览器不支持 HTML5 且不是 IE 怎么办?然后怎样呢?为什么 html5shiv 是 IE 的东西?
【问题讨论】:
标签: css html internet-explorer
我想开始使用一些 HTML5 标签,但担心它会如何在不支持 HTML5 的浏览器上呈现。似乎 html5shiv 是我可以用于 IE 浏览器的解决方案
但是,如果浏览器不支持 HTML5 且不是 IE 怎么办?然后怎样呢?为什么 html5shiv 是 IE 的东西?
【问题讨论】:
标签: css html internet-explorer
首先,需要明确的是,html5shiv 只是为了让您可以正确设置某些 HTML5 标记(section、article 等)的样式。它没有为浏览器提供任何更一般意义上的“HTML5 支持”。
考虑到这一点,请注意,IE
其他浏览器(甚至像 Netscape Communicator 4 这样的非常老的浏览器)仍会正确解析无法识别的标签,并允许 CSS 像您期望的那样应用于它们。
正如 zzzzBov 在他的回答中指出的那样,它们可能没有正确的默认样式(在大多数(所有?)情况下要么是 display: block 要么什么都没有),所以即使是非 oldIE 浏览器也需要添加这些样式.但这样做在非 oldIE 浏览器中效果很好,而在 oldIE 中,添加这些默认样式(或任何样式)仅在您使用 html5shiv 时才有效。
【讨论】:
display 值是inline。
元素的display 属性的初始值为inline (ref)。内置的用户代理样式表将属性更改为已知元素的合理值;例如,标题和段落被更改为块。
HTML5 引入了新元素,例如页眉、页脚、文章和部分(HTML5 分节元素)。由于较旧的浏览器不知道它们,因此它们将这些元素视为内联元素。因此,您必须手动为这些元素添加 CSS 规则:
header, footer, article, section { display: block; }
但正如the Story of the HTML5 Shiv中提到的:
...Internet Explorer 6-8 存在问题,因为它们无法识别 未知元素;新元素不能容纳孩子并且是 不受 CSS 影响
该文章中还提到了 IE 6-8 的解决方法:
顺便说一句,如果你想让 CSS 规则应用于 IE 中的未知元素,你 只需要做document.createElement(elementName)。这以某种方式让 CSS 引擎知道具有该名称的元素存在
现在,关于您的问题:html5shiv 使用一些 JavaScript 技巧使 IE 6-8 中的未知元素 styleable。至于 other 不支持 HTML5 的浏览器,如果需要,html5shiv 会添加正确呈现 HTML5 元素所需的默认样式,这样您就不必自己定义 CSS 规则(如前所述以上)。
请注意,html5shiv 不会使浏览器支持 HTML5。例如,它不能让 IE7 播放通过 HTML5 <video> 标签嵌入的视频。
【讨论】:
其他浏览器只需设置css display 属性即可支持非标准元素:
header,
footer,
article,
section,
...etc... {
display: block;
}
对于旧版本的 Firefox 和基于 webkit 的浏览器(HTML5 之前),这就是所有必要的。
【讨论】:
display 属性 - 您需要将它们显式设置为 block 的真正原因是因为初始值为 inline对于没有浏览器默认值的任何元素(如您所说的非标准元素)。
htmlshiv 是一个“IE”的东西,因为某些版本的 IE [仍然] 缺乏许多 HTML5 功能。在 chrome 或其他 webkit 浏览器中有效的东西可能在 IE 中无效,因此 htmlshiv 尝试对缺少的功能进行 javascript 改编。准确地说,它也是一个 polyfill。
【讨论】: