如何处理html5新标签的浏览器兼容问题

作者&投稿:咎种 (若有异议请与网页底部的电邮联系)
如何处理html5新标签的浏览器兼容问题~

目前HTML5已向开发人员提供了很多新的标签,如section,nav,article,header和footer等。这些标签语义化程度高,会被经常使用,但在IE6,IE7,IE8和Firefox 2等老式浏览器中却不能识别和正常使用。





一、HTML5标签在浏览器展示存在的问题


对于现阶段来说,使用HTML5标签可能遇到的最大问题就是如何在不支持新标签的浏览器中做恰当的处理。当我们在页面中使用HTML5元素时,可能会得到三种不同的结果。


结果1:标签被当作错误处理并被忽略。那么DOM构建的时候,就会当作这个标签不存在。


结果2:标签会被当作错误处理,并在DOM构建的时候依然会按照预期的代码进行创建,并且HTML标签会被构造成行内元素(也就是说虽然不能识别,但是代码里section标签依然会在dom中创建一个对应section节点,但是属于行内元素)。


结果3:标签被识别为HTML5标签,然后用DOM节点对其进行替换。DOM在构建的时候和预想的一致,并且合适的样式会应用到标签上(大部分情况下是块级元素)。


有一个具体的例子,大家思考一下下面的代码:






  

  title

  text


  

  


很多浏览器(比如Firefox
3.6和Safari4)解析的时候都会将div作为最外层的元素,然后div里面是一个识别不了的元素(section),它会在DOM中创建,并被作为一个行内元素存在。h1和p元素都是作为section元素的子节点。因为section在DOM中真实存在,所以也可以修改其样式。这种情况对应结果2。


IE9之前的版本会认为section标签是一个错误,并直接将其忽略,那么h1和p标签会被解析,然后成为div标签的子节点。也会被认为是一个错误并直接跳过。在这些浏览器中实际有效的代码是这样的:






  title

  
text

  


那么,旧版本的IE浏览器除了生成的DOM结构和其他浏览器不一样,其对不可识别标签的容错能力还是很棒的。因为section节点没有在DOM树中构建,所以也就不能给其增加样式。这种情况对应结果1。


当然,支持HTML5的浏览器比如IE9,Firefox4+,Safari5+会创建正确的DOM结构,然后这些标签会默认附带HTML5规范中定义的默认样式。


那么,我们所面临的最大问题就是同样的代码在不同的浏览器中形成了不同的DOM结构,并且含有不同的样式。


二、如何解决HTML5标签不兼容


或许会有很多人在质疑:为什么老式的浏览器不能识别这些标签?其实错不在浏览器,因为在那个时代根本不存在这种标签,所以不能正确识别出来,而这种不寻常的标签识别令DOM结构变得异常。对此,人们想出了很多在现阶段页面中使用HTML5元素的解决方案。每一个解决方案为了做到兼容都会遇到一些特定的问题。在此也在马海祥博客上跟大家分享一下:


1、实现标签被识别


马海祥曾做个一个测试(以IE8为例),是一个文章标题和蓝色字的文章内容,其中文章内容用了article标签。代码如下:






  

  

  

  测试

  

  article{color:#06F;}

  

  

  

  文章标题

  

  这是文章内容,应该是一段蓝色的文字。在老式浏览器中,如果不做hack将显示异常。

  

  

  


在IE8浏览器中,显示如下:





IE8不能识别article标签, 定义在标签上的CSS样式没有起作用。
在IE8中,被解释成命名为和</article
/>两个空的标签元素,与文章内容并列为兄弟节点,如下图所示:





既然因为不能识别标签而不能使用,那我们的解决办法就是让标签被识别出来。所幸,简单地通过document.createElement(tagName)即可以让浏览器识别标签和CSS引擎知道该标签的存在。假设我们上面的例子的区域加上如下代码。






  document.createElement('article');

  


IE8浏览器中的DOM解释就会变成下图所示:





自然,文字也显示成正常的蓝色。如下图所示:





2、JavaScript解决方案


JavaScript解决方案目的是解决在旧版本的IE中样式应用的问题。老版本的IE不会识别不明元素已经是一个耳熟能详的特性,而如果这些元素已经通过document.createElement()创建,那么浏览器就可以识别这些标签,并可以将其在DOM树中构建,然后允许开发者对其应用样式。


这个方法可以确保HTML5标签能在旧版本IE中对应创建DOM节点,然后可以对其应用样式。这个方法将HTML5块级元素设置成display:block,从而可以在各个浏览器中做到兼容。


今天测试以下把马海祥博客的网页改成了HTML5的,调试了一下,在FF和Opera中都显示正常了,到了IE6上却变得面目全非了。对此我还特意去找了一些使用JS代码支持HTML5标签元素的方法,在此也跟大家分享一下:


(1)、使用html5shiv


查看了一下,发现了html5shiv能解决这个问题,可以把HTML5的新元素转换成IE6认识的内容。只需要在你的head中调用这段代码就行:






  

  


当然你也可以直接把这个文件下载到自己的网站上。但这个文件必须在head标签中调用,因为IE必须在元素解析这前知道这些元素,才能启作用!但马海祥还要提醒你一下:还要在你的CSS文件中加上以下代码,不然有可能会出现些莫名其妙的问题。




header,nav,article,section,aside,footer{display:block;}


另外excanvas.js是Google为IE6支持canvas元素写的脚本,以后马海祥会跟大家再细说这样的例子,感兴趣的朋友可以去试试。


(2)、使用Kill IE6


除此之外你还可以使用KILL IE6一族,前提是你的浏览器允许执行JS文件。方法很简单,在你的网站的之前加上以下代码就可以了:






  

  


上面写的在正常的HTML中属于注释,不会被执行,但在IE中是一个判断语句,所以这些代码只有在IE中才会被识别并加载。


lte:就是Less than or equal to的简写,也就是小于或等于的意思。


lt :就是Less than的简写,也就是小于的意思。


gte:就是Greater than or equal to的简写,也就是大于或等于的意思。


gt :就是Greater than的简写,也就是大于的意思。


! : 就是不等于的意思,跟javascript里的不等于判断符相同


说实话,马海祥不喜欢这个利用JavaScript解决的方案,因为它破坏了我最主要的web应用开发原则:我们不应该使用JavaScript来控制布局。不仅仅是因为这个做法给那些禁用脚本的用户带来了糟糕的用户体验,更重要的是,如果我们希望我们的web应用代码是面向未来,并且维护性高的,那么必须将视图相关部分分离出来。这个方案对在跨浏览器中构建相同的DOM结构很有帮助,也可以确保你的JavaScript和CSS在各个地方运行结果相同,但是这个优势并不能改变我对这个方法的不认同。


3、Namespace hack


永远不要缺乏使用hack解决问题的能力,在IE中还有其他技术来让浏览器识别不明的标签。这个来自Elco Klingen日志的方法一开始引起了广泛的关注。该技术包含了一个XML形式的命名空间,并使用了含有namespace前缀的元素。例如:






  

  

  

  

  

  


前缀html5是纯粹是用于这个例子而且也不是官方支持的,你甚至可以用"foo"作为前缀,结果还是一样。有了前缀之后,IE会识别新的元素,从而可以应用样式。在其他浏览器中一样有效,那么最后,你就成功地在各个浏览器中构建了一样的元素和一样的样式。


这个方法的缺陷很明显:你必须在HTML文档中使用XML格式的命名空间,同样,你也需要在css中这么做:




html5\:section {

   display: block;

  }


马海祥点评:这并不是我期望Web开发者编写代码的方式。虽然这是一个非常杰出的解决方案,但是这让应用变得不自然。我不希望看到文件中充满了带命名空间的元素。


4、Bulletproof技术(防弹衣技术)


说实话,我是第一次接触到这个技术,建议在所有新的HTML5块级元素中增加一个内部的div元素,然后包含一个CSS class,用这个元素来替代HTML元素(类似在里面穿了一件防弹衣),例如:






  

  

  

  


在应用样式的时候,Tantek推荐直接给div增加样式,而不是给新元素增加样式


推荐使用:




.section {

  color: blue;

  }


而不是:




section {

   color: blue;

   }


这个方案的原理是用简单的方式将原来的样式应用方式转移到一个代表了HTML5标签的元素上。由于我一般情况下不会将样式通过标签名的方式应用到元素上,所以马海祥也并完全支持这个建议。


马海祥觉得这个方案的缺陷是不同的浏览器构建了不同的DOM结构,那么你必须在编写JavaScript和CSS的时候格外小心。获取子节点或者父节点的时候,不同的浏览器返回的结果可能会不一样。特别是在下面的代码中:






  

  

  

  

  


5、反向的bulletproof技术


还有一些方法,比如尝试使用和Tanteck方案相反的技术,也就是把HTML5元素放在div元素内部,例如:






  

  

  

  


这个方案唯一的不同是HTML5元素的位置,其他都一样。喜欢这个技术的支持者认为他的一致性很好(适用于所有的元素,包括)。但是DOM结构的不同让这个方案意义变得不大。他的主要优势是技术上的一致性。


6、关于X-UA-Compatible的使用


目前绝大多数网站都用以下代码来作为IE8的兼容方法。







虽然微软将IE向标准迈进了一大步,而事实上IE8还存在一系列渲染的奇怪现象是不争的事实。


在X-UA-Compatible中可用的方法有:






  

  

  


其中最后一行是永远以最新的IE版本模式来显示网页的。


另外加上






  


而使用,Emulate模式后则更重视。


所以目前来说还是以使用







为首选。


7、通过修改HTML部分来实现


我的主要目标是确保我只需要修改HTML部分。这就意味着不需要修改CSS和JavaScript。为什么会有这样的需求?需要修改的Web应用视图越多,你越有可能制造bug。将改变限制到一个视图也就限制了bug的出现,即使出现了bug,也可以减少你查找错误的范围。如果一个视图破相了,我可以知道这是因为我增加了一个section元素,而不是考虑是不是CSS文件修改来带的影响。


在研究了所有这些解决方案,并进行一些尝试和设计之后,我回到了Tantek的方案。这是唯一一个只需要修改HTML而不用动CSS和HTML的方案。现在,我在他的方案基础上做了一些改进,来达到我想要的结果。


首先,我不会给那些代表HTML5元素的class增加样式(所以我不会使用.section这样的选择器)。我保留了div元素,然后再增加一个带语义的class来应用样式,并作为进行JavaScript操作的钩子。例如,这样的代码:






  

  


经过改进后:






  

  

  

  


这样的修改完成后,我依然使用.content作为样式和脚本的入口。这也意味着我不需要修改CSS和JavaScript。


然后,为了避免hgroup标签这样的情况,我选择不使用这个标签。我在我已有的所有页面中没有找到任何一个使用了这个标签的。由于hgroup标签只能包含标题元素,如果你确实想要使用这个标签,那么使用hrgoup来包含本身是非常安全的(假设它没有包含其他的块级元素)。


我在马海祥博客上花了很多时间来测试比较bulletproof和反向的bulletproof哪个更好一些。我做选择时最主要的决定因素就是反向的bulletproof需要我去增加CSS代码。在那些为HTML5标签创建了DOM节点但是没有应用默认样式的元素来说,div元素里包含了一个HTML5块级元素在很多情况下都会搅乱我的布局,因为创建的DOM节点是行内元素。我不得不明确增加CSS规则来让这个节点变成块级元素从而可以正常布局,这也就违反了我不修改CSS文件的初衷。


马海祥博客点评:


在我的研究中,我使用了多个页面,然后在这些页面上使用修改过后的bulletproof技术。我分别在简单和复杂的布局中,含有和不含有JavaScript交互进行测试。在每一个例子中,我只需要修改HTML就可以让页面表现正确(不修改JavaScript和CSS)。那么,子节点和父节点的问题怎么办?有趣的事情是我在测试中并没有遇到这样的问题。


理由很简单,因为我对代码苛刻的态度。我认真地做了第二遍检查:


(1)、标签名和ID不会用于应用样式(只是用class)。


(2)、尽量选择常用的CSS选择器并且尽量减少选择器的使用。


(3)、JavaScript代码不依赖于特定的DOM结构。


(4)、标签名不用于操作DOM。


我注意到另一个有趣的事情是我使用了HTML5元素作为容器。而这些新的元素仅仅是作为功能性模块的边界。你应该花费你的大部分时间为内部的元素编写样式和脚本而不是处理各个模块间的样式和脚本。由于马海祥博客的JavaScript和CSS标签都应用在容器的内部,所以一切都显得很顺利。我想这才是一个真正的代码质量高的网站。

HTML5已形成了最终的标准,概括来讲,它主要是关于图像,位置,存储,多任务等功能的增加。
新增的元素有绘画 canvas ,用于媒介回放的 video 和 audio 元素,本地离线存储 localStorage 长期存储数据,浏览器关闭后数据不丢失,而sessionStorage的数据在浏览器关闭后自动删除,此外,还新增了以下的几大类元素。
内容元素,article、footer、header、nav、section。
表单控件,calendar、date、time、email、url、search。
控件元素,webworker, websockt, Geolocation。
移出的元素有下列这些:
显现层元素:basefont,big,center,font, s,strike,tt,u。
性能较差元素:frame,frameset,noframes。

如何处理HTML5新标签的浏览器兼容问题?如何区分HTML和HTML5?
处理兼容问题有两种方式:
1.IE8/IE7/IE6支持通过document.方法产生的标签,利用这一特性让这些浏览器支持HTML5新标签。
2.使用是html5shim框架
另外,DOCTYPE声明的方式是区分HTML和HTML5标志的一个重要因素,此外,还可以根据新增的结构、功能元素来加以区分。

目前HTML5已向开发人员提供了很多新的标签,如section,nav,article,header和footer等。这些标签语义化程度高,会被经常使用,但在IE6,IE7,IE8和Firefox 2等老式浏览器中却不能识别和正常使用。

一、HTML5标签在浏览器展示存在的问题

对于现阶段来说,使用HTML5标签可能遇到的最大问题就是如何在不支持新标签的浏览器中做恰当的处理。当我们在页面中使用HTML5元素时,可能会得到三种不同的结果。

结果1:标签被当作错误处理并被忽略。那么DOM构建的时候,就会当作这个标签不存在。

结果2:标签会被当作错误处理,并在DOM构建的时候依然会按照预期的代码进行创建,并且HTML标签会被构造成行内元素(也就是说虽然不能识别,但是代码里section标签依然会在dom中创建一个对应section节点,但是属于行内元素)。

结果3:标签被识别为HTML5标签,然后用DOM节点对其进行替换。DOM在构建的时候和预想的一致,并且合适的样式会应用到标签上(大部分情况下是块级元素)。

有一个具体的例子,大家思考一下下面的代码:

<div class="outer">

  <section>

  <h1>title</h1>

  <p>text</p>

  </section>

  </div>

很多浏览器(比如Firefox
3.6和Safari4)解析的时候都会将div作为最外层的元素,然后div里面是一个识别不了的元素(section),它会在DOM中创建,并被作为一个行内元素存在。h1和p元素都是作为section元素的子节点。因为section在DOM中真实存在,所以也可以修改其样式。这种情况对应结果2。

IE9之前的版本会认为section标签是一个错误,并直接将其忽略,那么h1和p标签会被解析,然后成为div标签的子节点。</section>也会被认为是一个错误并直接跳过。在这些浏览器中实际有效的代码是这样的:

<div class="outer">

  <h1>title</h1>

  <p>text</p>

  </div>

那么,旧版本的IE浏览器除了生成的DOM结构和其他浏览器不一样,其对不可识别标签的容错能力还是很棒的。因为section节点没有在DOM树中构建,所以也就不能给其增加样式。这种情况对应结果1。

当然,支持HTML5的浏览器比如IE9,Firefox4+,Safari5+会创建正确的DOM结构,然后这些标签会默认附带HTML5规范中定义的默认样式。

那么,我们所面临的最大问题就是同样的代码在不同的浏览器中形成了不同的DOM结构,并且含有不同的样式。

二、如何解决HTML5标签不兼容

或许会有很多人在质疑:为什么老式的浏览器不能识别这些标签?其实错不在浏览器,因为在那个时代根本不存在这种标签,所以不能正确识别出来,而这种不寻常的标签识别令DOM结构变得异常。对此,人们想出了很多在现阶段页面中使用HTML5元素的解决方案。每一个解决方案为了做到兼容都会遇到一些特定的问题。在此也在马海祥博客上跟大家分享一下:

1、实现标签被识别

马海祥曾做个一个测试(以IE8为例),是一个文章标题和蓝色字的文章内容,其中文章内容用了article标签。代码如下:

<!DOCTYPE html>

  <html xmlns="http://www.w3.org/1999/xhtml" lang="zh-CN">

  <head>

  <meta charset="UTF-8" />

  <title>测试</title>

  <style>

  article{color:#06F;}

  </style>

  </head>

  <body>

  <h1>文章标题</h1>

  <article>

  这是文章内容,应该是一段蓝色的文字。在老式浏览器中,如果不做hack将显示异常。

  </article>

  </body>

  </html>

在IE8浏览器中,显示如下:

IE8不能识别article标签, 定义在标签上的CSS样式没有起作用。
在IE8中,<article>被解释成命名为<article />和</article
/>两个空的标签元素,与文章内容并列为兄弟节点,如下图所示:

既然因为不能识别标签而不能使用,那我们的解决办法就是让标签被识别出来。所幸,简单地通过document.createElement(tagName)即可以让浏览器识别标签和CSS引擎知道该标签的存在。假设我们上面的例子的<head>区域加上如下代码。

<script>

  document.createElement('article');

  </script>

IE8浏览器中的DOM解释就会变成下图所示:

自然,文字也显示成正常的蓝色。如下图所示:

2、JavaScript解决方案

JavaScript解决方案目的是解决在旧版本的IE中样式应用的问题。老版本的IE不会识别不明元素已经是一个耳熟能详的特性,而如果这些元素已经通过document.createElement()创建,那么浏览器就可以识别这些标签,并可以将其在DOM树中构建,然后允许开发者对其应用样式。

这个方法可以确保HTML5标签能在旧版本IE中对应创建DOM节点,然后可以对其应用样式。这个方法将HTML5块级元素设置成display:block,从而可以在各个浏览器中做到兼容。

今天测试以下把马海祥博客的网页改成了HTML5的,调试了一下,在FF和Opera中都显示正常了,到了IE6上却变得面目全非了。对此我还特意去找了一些使用JS代码支持HTML5标签元素的方法,在此也跟大家分享一下:

(1)、使用html5shiv

查看了一下,发现了html5shiv能解决这个问题,可以把HTML5的新元素转换成IE6认识的内容。只需要在你的head中调用这段代码就行:

<!--if lt IE 9]>

  <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>

  <![endif]-->

当然你也可以直接把这个文件下载到自己的网站上。但这个文件必须在head标签中调用,因为IE必须在元素解析这前知道这些元素,才能启作用!但马海祥还要提醒你一下:还要在你的CSS文件中加上以下代码,不然有可能会出现些莫名其妙的问题。

header,nav,article,section,aside,footer{display:block;}

另外excanvas.js是Google为IE6支持canvas元素写的脚本,以后马海祥会跟大家再细说这样的例子,感兴趣的朋友可以去试试。

(2)、使用Kill IE6

除此之外你还可以使用KILL IE6一族,前提是你的浏览器允许执行JS文件。方法很简单,在你的网站的</body>之前加上以下代码就可以了:

<!--if lte IE 6]>

  <script src="http://letskillie6.googlecode.com/svn/trunk/letskillie6.zh_CN.pack.js"></script>

  <![endif]-->

上面写的<!--if lte IE 6]>在正常的HTML中属于注释,不会被执行,但在IE中是一个判断语句,所以这些代码只有在IE中才会被识别并加载。

lte:就是Less than or equal to的简写,也就是小于或等于的意思。

lt :就是Less than的简写,也就是小于的意思。

gte:就是Greater than or equal to的简写,也就是大于或等于的意思。

gt :就是Greater than的简写,也就是大于的意思。

! : 就是不等于的意思,跟javascript里的不等于判断符相同

说实话,马海祥不喜欢这个利用JavaScript解决的方案,因为它破坏了我最主要的web应用开发原则:我们不应该使用JavaScript来控制布局。不仅仅是因为这个做法给那些禁用脚本的用户带来了糟糕的用户体验,更重要的是,如果我们希望我们的web应用代码是面向未来,并且维护性高的,那么必须将视图相关部分分离出来。这个方案对在跨浏览器中构建相同的DOM结构很有帮助,也可以确保你的JavaScript和CSS在各个地方运行结果相同,但是这个优势并不能改变我对这个方法的不认同。

3、Namespace hack

永远不要缺乏使用hack解决问题的能力,在IE中还有其他技术来让浏览器识别不明的标签。这个来自Elco Klingen日志的方法一开始引起了广泛的关注。该技术包含了一个XML形式的命名空间,并使用了含有namespace前缀的元素。例如:

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:html5="http://www.w3.org/html5/">

  <body>

  <html5:section>

  <!-- content -->

  </html5:section>

  </body>

   </html>

前缀html5是纯粹是用于这个例子而且也不是官方支持的,你甚至可以用"foo"作为前缀,结果还是一样。有了前缀之后,IE会识别新的元素,从而可以应用样式。在其他浏览器中一样有效,那么最后,你就成功地在各个浏览器中构建了一样的元素和一样的样式。

这个方法的缺陷很明显:你必须在HTML文档中使用XML格式的命名空间,同样,你也需要在css中这么做:

html5\:section {

   display: block;

  }

马海祥点评:这并不是我期望Web开发者编写代码的方式。虽然这是一个非常杰出的解决方案,但是这让应用变得不自然。我不希望看到文件中充满了带命名空间的元素。

4、Bulletproof技术(防弹衣技术)

说实话,我是第一次接触到这个技术,建议在所有新的HTML5块级元素中增加一个内部的div元素,然后包含一个CSS class,用这个元素来替代HTML元素(类似在里面穿了一件防弹衣),例如:

<section>

  <div class="section">

  <!-- content -->

  </div>

  </section>

在应用样式的时候,Tantek推荐直接给div增加样式,而不是给新元素增加样式

推荐使用:

.section {

  color: blue;

  }

而不是:

section {

   color: blue;

   }

这个方案的原理是用简单的方式将原来的样式应用方式转移到一个代表了HTML5标签的元素上。由于我一般情况下不会将样式通过标签名的方式应用到元素上,所以马海祥也并完全支持这个建议。

马海祥觉得这个方案的缺陷是不同的浏览器构建了不同的DOM结构,那么你必须在编写JavaScript和CSS的时候格外小心。获取子节点或者父节点的时候,不同的浏览器返回的结果可能会不一样。特别是在下面的代码中:

<div class="outer">

  <section>

  <div class="section main">

  <!-- content -->

  </div></section>

  </div>

5、反向的bulletproof技术

还有一些方法,比如尝试使用和Tanteck方案相反的技术,也就是把HTML5元素放在div元素内部,例如:

<div class="section">

  <section>

  <!-- content -->

  </section>

  <div>

这个方案唯一的不同是HTML5元素的位置,其他都一样。喜欢这个技术的支持者认为他的一致性很好(适用于所有的元素,包括<hgroup>)。但是DOM结构的不同让这个方案意义变得不大。他的主要优势是技术上的一致性。

6、关于X-UA-Compatible的使用

目前绝大多数网站都用以下代码来作为IE8的兼容方法。

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" >

虽然微软将IE向标准迈进了一大步,而事实上IE8还存在一系列渲染的奇怪现象是不争的事实。

在X-UA-Compatible中可用的方法有:

<meta http-equiv="X-UA-Compatible" content="IE=6" >

  <meta http-equiv="X-UA-Compatible" content="IE=7" >

  <meta http-equiv="X-UA-Compatible" content="IE=8" >

  <meta http-equiv="X-UA-Compatible" content="IE=edge" >

其中最后一行是永远以最新的IE版本模式来显示网页的。

另外加上

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" >

  <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" >

而使用,Emulate模式后则更重视。

所以目前来说还是以使用

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" >

为首选。

7、通过修改HTML部分来实现

我的主要目标是确保我只需要修改HTML部分。这就意味着不需要修改CSS和JavaScript。为什么会有这样的需求?需要修改的Web应用视图越多,你越有可能制造bug。将改变限制到一个视图也就限制了bug的出现,即使出现了bug,也可以减少你查找错误的范围。如果一个视图破相了,我可以知道这是因为我增加了一个section元素,而不是考虑是不是CSS文件修改来带的影响。

在研究了所有这些解决方案,并进行一些尝试和设计之后,我回到了Tantek的方案。这是唯一一个只需要修改HTML而不用动CSS和HTML的方案。现在,我在他的方案基础上做了一些改进,来达到我想要的结果。

首先,我不会给那些代表HTML5元素的class增加样式(所以我不会使用.section这样的选择器)。我保留了div元素,然后再增加一个带语义的class来应用样式,并作为进行JavaScript操作的钩子。例如,这样的代码:

<div class="content">

  <!-- content -->

  </div>

经过改进后:

<section>

  <div class="section content">

  <!-- content -->

  </div>

  </section>

这样的修改完成后,我依然使用.content作为样式和脚本的入口。这也意味着我不需要修改CSS和JavaScript。

然后,为了避免hgroup标签这样的情况,我选择不使用这个标签。我在我已有的所有页面中没有找到任何一个使用了这个标签的。由于hgroup标签只能包含标题元素,如果你确实想要使用这个标签,那么使用hrgoup来包含本身是非常安全的(假设它没有包含其他的块级元素)。

我在马海祥博客上花了很多时间来测试比较bulletproof和反向的bulletproof哪个更好一些。我做选择时最主要的决定因素就是反向的bulletproof需要我去增加CSS代码。在那些为HTML5标签创建了DOM节点但是没有应用默认样式的元素来说,div元素里包含了一个HTML5块级元素在很多情况下都会搅乱我的布局,因为创建的DOM节点是行内元素。我不得不明确增加CSS规则来让这个节点变成块级元素从而可以正常布局,这也就违反了我不修改CSS文件的初衷。

马海祥博客点评:

在我的研究中,我使用了多个页面,然后在这些页面上使用修改过后的bulletproof技术。我分别在简单和复杂的布局中,含有和不含有JavaScript交互进行测试。在每一个例子中,我只需要修改HTML就可以让页面表现正确(不修改JavaScript和CSS)。那么,子节点和父节点的问题怎么办?有趣的事情是我在测试中并没有遇到这样的问题。

理由很简单,因为我对代码苛刻的态度。我认真地做了第二遍检查:

(1)、标签名和ID不会用于应用样式(只是用class)。

(2)、尽量选择常用的CSS选择器并且尽量减少选择器的使用。

(3)、JavaScript代码不依赖于特定的DOM结构。

(4)、标签名不用于操作DOM。

我注意到另一个有趣的事情是我使用了HTML5元素作为容器。而这些新的元素仅仅是作为功能性模块的边界。你应该花费你的大部分时间为内部的元素编写样式和脚本而不是处理各个模块间的样式和脚本。由于马海祥博客的JavaScript和CSS标签都应用在容器的内部,所以一切都显得很顺利。我想这才是一个真正的代码质量高的网站。

1.IE8/IE7/IE6支持通过document.方法产生的标签,利用这一特性让这些浏览器支持HTML5新标签。
2.使用是html5shim框架
另外,DOCTYPE声明的方式是区分HTML和HTML5标志的一个重要因素,此外,还可以根据新增的结构、功能元素来加以区分。

HTML5已形成了最终的标准,概括来讲,它主要是关于图像,位置,存储,多任务等功能的增加。
新增的元素有绘画 canvas ,用于媒介回放的 video 和 audio 元素,本地离线存储 localStorage 长期存储数据,浏览器关闭后数据不丢失,而sessionStorage的数据在浏览器关闭后自动删除,此外,还新增了以下的几大类元素。
内容元素,article、footer、header、nav、section。
表单控件,calendar、date、time、email、url、search。
控件元素,webworker, websockt, Geolocation。
移出的元素有下列这些:
显现层元素:basefont,big,center,font, s,strike,tt,u。
性能较差元素:frame,frameset,noframes。

处理兼容问题有两种方式:
1.IE8/IE7/IE6支持通过document.方法产生的标签,利用这一特性让这些浏览器支持HTML5新标签。
2.使用是html5shim框架
另外,DOCTYPE声明的方式是区分HTML和HTML5标志的一个重要因素,此外,还可以根据新增的结构、功能元素来加以区分。


如何处理html5新标签的浏览器兼容问题
1.IE8\/IE7\/IE6支持通过document.方法产生的标签,利用这一特性让这些浏览器支持HTML5新标签。2.使用是html5shim框架另外,DOCTYPE声明的方式是区分HTML和HTML5标志的一个重要因素,此外,还可以根据新增的结构、功能元素来加以区分。 已赞过 已踩过< 你对这个回答的评价是? 评论 收起 腾讯电脑管家 2019-04-03...

如何处理html5新标签的浏览器兼容问题
处理兼容问题有两种方式:1.IE8\/IE7\/IE6支持通过document.方法产生的标签,利用这一特性让这些浏览器支持HTML5新标签。2.使用是html5shim框架 另外,DOCTYPE声明的方式是区分HTML和HTML5标志的一个重要因素,此外,还可以根据新增的结构、功能元素来加以区分。

HTML5是什么?有什么作用?
从名称来看,HTML5是HTML最新的修订版本,2014年10月由万维网联盟(W3C)完成了标准制定.由此可见,HTML5继承了HTML的部分特征,又添加了许多新的语法特征,比如语义特性、本地存储特性、设备兼容特性、连接特性、网页多媒体特性等.此外HTML5还定义了处理非法文档的具体细节,使得所有浏览器和客户端程序能够一致地...

微信上的html5游戏老是闪退怎么处理
进入设置–应用程序——全部——找到有问题的应用程序,清除数据或者缓存。(注:清除数据,会清除掉应用的个人设置、账户信息等。)2、运行程序过多 如果不进行设置,很多软件都会自己运行,而手机后台程序过多会造成内存不足,从而造成应用闪退。如出现软件闪退,可先清理内存后再试试。3、手机杀毒软件 部...

如何使用HTML5的picture元素处理响应式图片
#p#副标题#e#新的解决方案:是HTML5一个新的元素。如果元素与当前的和元素协同合作将大大增强响应式图像的工作进程。它允许你放置多个source标签,以指定不同的图像文件名,进而根据不同的条件进行加载。它可以让你根据以下条件加载完全不同的图像:媒体特性结果如:视口的当前高度(viewport height),...

Web前端岗位面试题有哪些
它们有何意义?2、HTML5 为什么只需要写 <!DOCTYPE HTML>?3、行内元素有哪些?块级元素有哪些? 空(void)元素有那些?4、页面导入样式时,使用link和@import有什么区别?5、介绍一下你对浏览器内核的理解?6、常见的浏览器内核有哪些?7、html5有哪些新特性、移除了那些元素?如何处理HTML5新标签的浏览器兼容问题?

什么是h5开发
一、HTML5的基本概述 HTML5是HTML的最新版本,它增加了一系列新的元素、属性和API,用于构建更丰富、更交互的网页应用。与传统的HTML相比,HTML5提供了更好的媒体支持、更强大的图形处理能力以及更好的设备兼容性。二、H5开发的主要特点 1. 丰富的媒体支持:HTML5内置了对音频、视频等多媒体元素的直接...

html5指南-2.如何操作documentmetadata_html5教程技巧
referrer: 返回连接到当前document的document url信息; title:获取或者设置当前document的title。 来看下面的例子: 代码如下: example'); 结果(不同浏览器显示的结果可能不一样): 2.如何理解兼容模式 compatMode属性告诉你浏览器是如何处理当前document的。有太多不标准的html了,浏览器会试图显示这些页面...

网页开发必须使用HTML5新元素吗
在PC端网站开发时,需要先确定要兼容的浏览器版本,如果不需要兼容IE8-,那么可以采用HTML5新结构标签;如果需要兼容IE8-,还希望使用HTML5新增结构标签,则需要进行兼容处理(兼容方法)在移动端开发时,所有的浏览器都兼容HTML5的新增结构标签,所以可以使用,也推荐使用。header、footer、nav等新增结构...

html5出来后,asp.net该如何调整,何去何从
html5一般指客户端的更新体验,当然服务端也有更新,但是还是用服务端语言(比如asp.net)写,工具不变,思想和实现变了。html5概念很大,比如有新的HTML技术,但是浏览器不都支持,现在难以流行。html5还可以指将用户体验提升至更高层次(比如迈向B\/S体验模式)提供更丰富、更人性化的体验。包括JS的...

东至县13371963556: 如何处理html5新标签的浏览器兼容问题 -
广定爱路: 对于结构类的标签,通过JS来实现兼容 header footer等结构类标签,在不支持的浏览器当中,都属于“用户自定义标签”,虽然会显示,但是会以行内元素的样式展示.此时需要利用JS创建这个元素,之后用CSS为其设置块元素的样式.如下...

东至县13371963556: 如何解决IE6/IE7/IE8浏览器不兼容HTML5新标签的问题 -
广定爱路: 兼容它的新标签这个还比较容易解决,通过JS给浏览器定义这些新标签就行了,意思就是声明给浏览器知道,这些标签.比如声明head footer(function(){ var element=['header','footer','article','aside','section','nav','menu','hgroup','details','dialog','...

东至县13371963556: 如何解决html5的浏览器兼容性 -
广定爱路: 方法/步骤许多主流的北京网站设计公司发现,很多的HTML5都不能够真正的跨平台,同时我们也会根据自身的经验和行业资深的技术分析出HTML5不能跨平台的原因,因此我们在设计网站的时候应该怎么解决H5在实际应用中的兼容性问题呢...

东至县13371963556: 如何让ie浏览器支持html5标签 -
广定爱路: 让ie浏览器支持html5标签 HTML5出现也不短了,很多网站的页面都进行了改版,为了降低代码量(不需要起太多的类名),提升加载速度,提高标签的语义性,因此,在网页中大量使用了section,article,header等HTML5标签.自己最近在写响应式布局的范例,里面也使用到了header等标签.还是比较希望能够做成兼容“旧版浏览器”的,在此和大家共享一下,如何让旧浏览器支持HTML5新增标签.HTML5 新标签兼容旧版本浏览器的方法

东至县13371963556: 怎么能让html5+css3兼容IE6 - 8浏览器? -
广定爱路: ie6-ie8根本就不兼容HTML5,很多HTML5的特性根本就不支持.温馨提示:目前支持HTML5的浏览器有:Firefox、Chrome、Safari、Opera、IE9++,IE9也只是部分支持HTML5.

东至县13371963556: html5中ie浏览器不能兼容哪些问题 -
广定爱路: HTML5是用于取代1999年所制定的HTML4.01和XHTML1.0标准的HTML(标准通用标记语言下的一个应用)标准版本;现在仍处于发展阶段,但大部分浏览器已经支持某些HTML5技术.HTML5有两大特点:首先,强化了Web网页的表现性能....

东至县13371963556: 我的浏览器不支持HTML5 VIDEO??? -
广定爱路: LS你笨蛋啊,不懂HTML5就别乱说. HTML5是HTML的新标准.即使不是很完善,可是有些浏览器已经支持HTML5了. HTML5的VIDEO是HTML5的新标签,用来播放视频文件(不需要插件哦!). 请问你的是什么浏览器?IE8及以下的都不支持哦! 这个是没有办法解决的,是你的浏览器不支持.换个浏览器就可以了.

东至县13371963556: html5有哪些新特性,移除了那些元素 -
广定爱路: 其实说,HTML5就是html、css、js的结合体,不用大惊小怪的.还有一方面是HTML5还不是很成熟,取决于浏览器的支持程度.至于HTML5的新特性,有若干点,比如说其中的canvas绘图,新增的api包括:canvas,geolocation ,websocket , webstorage 还有新增的若干标签,如video,audio标签.

东至县13371963556: html5和css3可以解决不同浏览器兼容性问题吗 -
广定爱路: 不可以,css3目前低版本浏览器兼容不好,html5标签的话可以通过html5shiv.googlecode.com/svn/trunk/html5.js解决.

东至县13371963556: 如何解决ie6不兼容html5 css3问题?请问各位高手 -
广定爱路: 如果希望兼容HTML5,可以安装一个插件,js的插件,解决了标签识别问题.其实就是DOM的createlement.如果希望兼容CSS3,只有放弃,死心就是解脱.IE9都不能很好兼容,何况IE6.插件参考美瑞网的一篇文章.如今HTML5愈...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网