马海祥博客是一个专注于分享SEO优化、网站制作、网络营销和运营思维的自媒体博客!
马海祥博客 > 网站制作 > html代码教程 > 解析HTML5页面元素的嵌套规则及引起的错误问题

解析HTML5页面元素的嵌套规则及引起的错误问题

时间:2014-01-19   文章来源:马海祥博客   访问次数:

据统计在2013年内全球有近10亿手机用户使用了支持HTML5浏览器,同时HTML Web开发者数量将达到200万。毫无疑问,HTML5将成为未来5-10年内,移动互联网领域的主宰者。

HTML5之所以能成为近几年的热点话题,是因为HTML5提供了一些新的元素和属性,例如<nav>(网站导航块)和<footer>。这种标签将有利于搜索引擎的索引整理,同时更好的帮助小屏幕装置和视障人士使用,更便于手机用户的使用。除此之外,HTML5还为其他浏览要素提供了新的功能,随后我将会在马海祥博客上为大家逐个来介绍这些新功能。今天我要在马海祥博客上介绍的是HTML5页面元素的嵌套规则。

解析HTML5页面元素的嵌套规则及引起的错误问题-马海祥博客

一、回顾HTML4/XHTML的嵌套规则

在我们的印象中会有这样的嵌套规则:

解析HTML5页面元素的嵌套规则及引起的错误问题-马海祥博客

内联元素不能嵌套块元素<p>元素和<h1~6>元素不能嵌套块元素

看到这里你或许会有疑问:到底什么是块元素,什么是内联元素呢?

在此马海祥还特意查询了官网上的W3C CSS2.1规范中对块元素和内联元素的定义:

Block-level elements are those elements of the source document that are formatted visually as blocks (e.g., paragraphs). The following values of the 'display' property make an element block-level: 'block', 'list-item', and 'table'.

Inline-level elements are those elements of the source document that do not form new blocks of content; the content is distributed in lines (e.g., emphasized pieces of text within a paragraph, inline images, etc.). The following values of the 'display' property make an element inline-level: 'inline', 'inline-table', and 'inline-block'. Inline-level elements generate inline-level boxes, which are boxes that participate in an inline formatting context.

对于以上定义,我们可以这样理解:块元素一般都从新行开始,内联元素在一行内显示,我们也可以通过CSS属性display的'inline' 或 ' block' 来改变元素为内联元素或块元素,当然这是CSS中对元素的分类,显然用 'display' 的属性值来对html元素进行分类是不严谨的。

如果按照上述规则来讲,那么FACEBOOK的做法就是一种错误的做法,因为他在内联元素<a>元素中嵌套了块元素元素<div>,但是细心的读者应该会发现上述规则是基于HTML4/xHTML1的strict模式,而FACEBOOK现在已经统一使用了html5的doctype,那么这个规则到底还是是否适用?

二、HTML5的元素嵌套规则

元素的嵌套规则和页面头部申明的DTD有着千丝万缕的关系,那么在最新的HTML5规范中是否对元素嵌套有着新的规范呢?

让我们先了解下W3C在最新的HTML5规范中对元素的分类方式,如下图所示:

解析HTML5页面元素的嵌套规则及引起的错误问题-马海祥博客

由上图我们可以看出,元素的分类不再是块元素或内联元素这样来分类(其实从来就没有这样分),而是按照如下分类来分:Flow(流式元素)、Heading(标题元素)、Sectioning(章节元素)、Phrasing(段落元素)、Embedded(嵌入元素)、Interactive(交互元素)、Metadata(元数据元素)。

1、HTML5规范中的最新元素介绍

(1)、Flow(流式元素)

在应用程序和文档的主体部分中使用的大部分元素都被分类为流式元素。

a, abbr, address, area(如果它是map元素的后裔), article, aside, audio, b, bdi, bdo, blockquote, br, button, canvas, cite, code, command, datalist, del, details, dfn, div, dl,em, embed, fieldset, figure, footer, form, h1, h2, h3, h4, h5, h6, header, hgroup, hr, i, iframe, img, input, ins, kbd, keygen, label, map, mark, math, menu, meter,nav, noscript, object, ol, output, p, pre, progress, q, ruby, s, samp, script, section, select, small, span, strong, style(如果该元素设置了scoped属性), sub, sup, svg, table, textarea, time, u, ul, var, video, wbr, text

(2)、Heading(标题元素)

标题式元素定义一个区块/章节(section)(无论是明确的使用章节式内容的元素标记,或者标题式内容自身所隐含的)的标题。

h1, h2, h3, h4, h5, h6, hgroup

(3)、Sectioning(章节元素)

章节式元素是用于定义标题及页脚范围的元素。

article, aside, nav, section

(4)、Phrasing(段落元素)

段落式元素是文档中的文本、标记段落级文本的元素。

a(如果其只包含段落式元素), abbr, area(如果它是map元素的后裔), audio, b, bdi, bdo, br, button, canvas, cite, code, command, datalist, del(如果其只包含段落式元素), dfn, em, embed, i,iframe, img, input, ins(如果其只包含段落式元素), kbd, keygen, label, map(如果其只包含段落式元素), mark, math, meter, noscript, object, output, progress, q, ruby, s, samp, script,select, small, span, strong, sub, sup, svg, textarea, time, u, var, video, wbr, text

(5)、Embedded(嵌入元素)

嵌入式元素是引用或插入到文档中其他资源的元素。

audio, canvas, embed, iframe, img, math, object, svg, video

(6)、Interactive(交互元素)

交互式元素是专门用于与用户交互的元素。

a, audio(如果设置了controls属性), button, details, embed, iframe, img(如果设置了usemap属性), input(如果type属性不为hidden状态), keygen, label, menu(如果type属性为toolbar状态),object(如果设置了usemap属性), select, textarea, video(如果设置了controls属性)

(7)、Metadata(元数据元素)

元数据元素是可以被用于说明其他内容的表现或行为,或者在当前文档和其他文档之间建立联系的元素。

base,command,link,meta,noscript,script,style,title

各分类会有交叉或重叠的现象,这说明在html5中,元素可能属于上述所有分类中的一个或多个。

2、举例分析<h1>~<h6>、<div>、<a>元素

(1)、<h1>~<h6>元素

Categories:
    Flow content.
    Heading content.
    Palpable content.
  Contexts in which this element can be used:
    As a child of an hgroup element.
    Where flow content is expected.
  Content model:
    Phrasing content.

其中的「Categories」说明该元素的类别,「Contexts in which this element can be used」说明该元素能在何种场景下被使用,也就是它的父元素是什么,「Content model」说明该元素可以包含的内容是什么,由于页面中的元素是层层嵌套的,一个元素有可能既是父元素同时也是子元素的角色,所以下面我们以「Content model」也就是可包含的子元素做讨论。

那么对于h1~h6元素:

它们同时属于Flow content 、Heading content 和 Palpable content三个分类;

它们的父元素可以是<hgroup>,同时那些子元素是流式元素的元素也可以作为h1-h6元素的父元素;

它们允许的子元素是段落式元素;

(2)、<div>元素

Categories:
    Flow content.
    Palpable content.
  Contexts in which this element can be used:
    Where phrasing content is expected.
  Content model:
    Flow content.

对于<div>元素:

同时属于Flow content、Palpable content分类;

父元素必须是那些子元素为段落式元素的元素;

允许的子元素是流式元素。

<div>元素允许的子元素是流式元素,流式元素基本涵括了页面中的大部分元素,所以我们在用<div>时可以不用担心嵌套错误的问题。

但对于<h1>~<h6>元素,它们允许的子元素为段落式元素,而段落式元素并不包含诸如<div>、<p>、<ul><ol>之类的元素,这就说明按照html5的规范,是不允许在标题元素内部嵌入<div>、<p>、<ul><ol>之类的元素。

(3)、<a>元素

Categories:
    Flow content.
    Phrasing content.
    Interactive content.
    Palpable content.
  Contexts in which this element can be used:
    Where phrasing content is expected.
  Content model:
    Transparent, but there must be no interactive content descendant.

对于<a>元素:

同时属于Flow content、Phrasing content、Interactive content、Palpable content分类;

父元素必须是那些子元素为段落式元素的元素;

允许的子元素是以它的父元素允许的子元素为准,但不能包含交互式元素;

这样看<a>元素还是挺有意思的,允许的子元素要看它的父元素所能包含的子元素。

接下来我们看下以下的代码

 <ul>
     <li><h4><a href=""><div></div></a></h4></li>
   </ul>

这时<a>的父元素为<h4>,对于<h1>~<h6>的标题元素上面已经提过,允许的子元素是段落式元素,那么此时对于<a>允许的子元素即为段落式元素,而段落式元素中是不包含<div>元素的,所以FCAEBOOK这样的嵌套方法是错误的!

让我们来把代码做一下修改:

<ul>
     <li><div><a href=""><div></div></a></div></li>
   </ul>

这时<a>的父元素为<div>,而<div>元素允许的子元素是流式元素,流式元素中包含<div>元素,所以这样的情形下在<a>里面嵌套<div>就是正确的做法!

三、嵌套错误可能引起的问题

上面讲了HTML5对元素新的分类方式和以<h1>~<h6>、<div>、<a>元素举例讲述了各自的嵌套规则,但FACEBOOK即使不按照标准去嵌套也不会有大的错误问题,这就给我们带来了一个思考:嵌套错误到底会不会有问题?

例子1、开始与结束标签嵌套错误

<div><h2>内容</div></h2>

测试结果如下图所示:

解析HTML5页面元素的嵌套规则及引起的错误问题-马海祥博客

例子2、<p>元素嵌套<div>元素

<p><div>内容</div></p>

测试结果如下图所示:

解析HTML5页面元素的嵌套规则及引起的错误问题-马海祥博客

例子3、列表元素<li>兄弟元素为<div>

<ul><li>内容</li><div>内容</div></ul>

测试结果如下图所示:

解析HTML5页面元素的嵌套规则及引起的错误问题-马海祥博客

例子4、<h2>元素嵌套<div>元素

<h2><div>内容</div></h2>

测试结果如下图所示:

解析HTML5页面元素的嵌套规则及引起的错误问题-马海祥博客

例子5、<a>元素嵌套<a>元素

<a href=""><a href="">内容</a></a>

测试结果如下图所示:

解析HTML5页面元素的嵌套规则及引起的错误问题-马海祥博客

通过上述5个例子,马海祥总结了如下5个观点:

(1)、元素开始与结束标签嵌套错误,页面可以在大部分浏览器被正常解析,IE9会出现解析错误。

(2)、在<p>元素内嵌入<div>等元素造成所有浏览器的解析错误。

(3)、在<h1>~<h6>元素内嵌入<div>等元素所有浏览器可以解析正常。

(4)、在<a>元素内嵌入<a>元素会导致所有浏览器的解析错误。

(5)、在列表元素<li><dt><dd>等插入非列表兄弟元素会导致IE6\IE7的解析错误。

其实,马海祥觉得这里说解析错误并不是很合理,应该是说浏览器解析出来的结果和我们期望的结果不一致,但任何的嵌套错误都不会导致页面呈现有很大的出错。

我们知道JS代码如果写的有语法错误,浏览器的JS解释器就会拒绝执行并且报错,而浏览器在遇到不符合语法规定的HTML代码时则会千方百计将其呈现出来。

四、严格嵌套约束、语义嵌套约束

通过上面的示例我们发现在<p>元素里嵌套<div>元素或者<a>元素里<a>元素会导致所有的浏览器都解析错误,这其实是W3C规范的严格嵌套约束,严格嵌套约束要求必须去遵守,不然就会导致所有浏览器的解析错误。

1、严格嵌套约束规则:

a元素里不可以嵌套交互式元素(<a>、<button>、<select>等。

<p>里面不可以嵌套<div>、<h1>~<h6>、<p>、<ul>/<ol>/<li>、<dl>/<dt>/<dd>、<form>等。

暂时没有发现更多的了,如果有谁发现更多点的话欢迎通过马海祥博客来告诉我。

2、语义嵌套约束:

每个元素基本都有自己的嵌套规则(即父元素可以是什么,子元素可以是什么),除了严格嵌套约束之外的一些规则就是语义嵌套约束,对于语义嵌套约束,如果不遵守,页面可能正常,但也可能解析错误,这和下面要讲的容错机制有关。

五、浏览器的容错机制

并不是每位同学在写完页面后去做合法性检查,因此浏览器厂商不得不让它们的浏览器以尽可能宽松的方式去处理网页,每个浏览器内核中都有相当一部分代码专门用来处理那些含糊不清的html标记及嵌套,并且会去猜测前端们到底想如何呈现网页,这是浏览器的容错机制。

这其实在告诉我们,我们写出来的HTML代码不符合W3C规范可能最终呈现出来没有异样,但那其实是浏览器的一种容错机制,我们没有理由让自己以一个随性的态度去coding,对待自己的代码应该一丝不苟,即使HTML5的胸襟很宽广。

马海祥博客点评:

原本我认为从HTML4到XHTML是一个时代,现在又从XHTML跨到了HTML5,新时代新标准的诞生,我们应该敞开胸怀去拥抱,而不是排斥。

因为你关注或不关注,标准就在那里,只增不减。所以我们更应该感谢W3C这样一个组织,让各个浏览器厂商抛开彼此的敌意共同制定新的标准。不然,也许你会像90年代那样,JS引用一个元素都需要为某个浏览器写一套自己的代码。

本文发布于马海祥博客文章,如想转载,请注明原文网址摘自于http://www.mahaixiang.cn/html/389.html,注明出处;否则,禁止转载;谢谢配合!

相关标签搜索: HTML5   HTML5页面   HTML5元素   HTML5问题  

上一篇:深入解析HTML5的8大性能
下一篇:如何实现shtml页面的局部缓存

您可能还会对以下这些文章感兴趣!

  • HTML5在网站性能监控方面带来的新特性

    HTML5本身是由W3C推荐出来的,它的开发是通过谷歌、苹果,诺基亚、中国移动等几百家公司一起酝酿的技术,这个技术最大的好处在于它是一个公开的技术。换句话说,每一个公开的标准都可以根据W3C的资料库找寻根源。另一方面,W3C通过的HTML5标准也就意味着每一个浏览器或每一个……【查看全文

    阅读:311关键词: html5   网站性能   日期:2016-10-24
  • 解析HTML5页面元素的嵌套规则及引起的错误问题

    据统计在2013年内全球有近10亿手机用户使用了支持HTML5浏览器,同时HTML Web开发者数量将达到200万。毫无疑问,HTML5将成为未来5-10年内,移动互联网领域的主宰者。 HTML5之所以能成为近几年的热点话题,是因为HTML5提供了一些新的元素和属性,例如nav(网站导航块)和footer……【查看全文

    阅读:2559关键词: HTML5   HTML5页面   HTML5元素   HTML5问题   日期:2014-01-19
  • 各大浏览器在Mac和Windows平台对CSS3和HTML5兼容情况查询表

    不知不觉中,支持CSS3和HTML5的浏览器变得越来越多,甚至包括最新版的IE,当然,所谓支持仅仅是部分支持,因为CSS3和HTML5的W3C规范都尚未形成,如果你现在就希望使用CSS3和HTML5创建你的站点,至少要对各个浏览器对这两种新技术的支持情况有一个全面了解,需要指出的是……【查看全文

    阅读:4829关键词: 浏览器   css3   html5   浏览器兼容   日期:2015-01-13
  • 以SEO的角度来分析HTML5与搜索引擎优化的联系

    HTML5是用于取代1999年所制定的 HTML 4.01 和 XHTML 1.0 标准的 HTML 标准版本,现在仍处于发展阶段,但大部分浏览器已经支持某些 HTML5 技术。HTML 5有两大特点:首先,强化了 Web 网页的表现性能。其次,追加了本地数据库等 Web 应用的功能。广义论及HTML5时,实际指……【查看全文

    阅读:1277关键词: HTML5   搜索引擎优化   SEO的角度   SEO   日期:2012-10-16
  • HTML5性能优化与分析

    每次跟朋友谈起HTML5,就会有人说可以先用HTML5的方式就是把DOCTYPE先改了,因为目前很多页面都还是用传统的方式,HTML5的方式,本身是兼容IE浏览器的,从IE6到IE10都可以,包括高级浏览器都支持,所以说拥抱HTML5最简单的方式就是把DOCTYPE给改了,从性能角度来说,HTM……【查看全文

    阅读:1634关键词: html5   html5优化   日期:2015-10-30
  • 如何解决IE6/IE7/IE8浏览器不兼容HTML5新标签的问题

    HTML5是用于取代1999年所制定的HTML4.01和XHTML1.0标准的HTML(标准通用标记语言下的一个应用)标准版本;现在仍处于发展阶段,但大部分浏览器已经支持某些HTML5技术。HTML5有两大特点:首先,强化了Web网页的表现性能。其次,追加了本地数据库等Web应用的功能。 广义论及HTM……【查看全文

    阅读:18466关键词: IE6   IE7   IE8   浏览器   HTML5标签   HTML5   不兼容   日期:2014-03-13
  • 如何规范大型网站的HTML代码

    写Web页面就像我们建设房子一样,地基牢固,房子才不会倒。同样的,我们制作Web页面也是一样的,一个良好的HTML结构是制作一个网站的开始,良好的CSS只存在同样良好的HTML中,所以一个干净的,语义的HTML的优点很多,那么平时制作中,我们又该如何规范大型网站的HTML代……【查看全文

    阅读:6037关键词: 大型网站   代码   html   html代码   日期:2014-06-27
  • 各大主流浏览器对HTML5的兼容性测试及结果分析

    随着HTML5技术的普及和推广,Web开发社区逐渐开始尝试在RIA(富互联网应用)中使用HTML5,这种实践主要优势在于开发人员能够通过HTML5的各种技术以一种前所未有的统一、简洁、无插件依赖的方式实现炫目、复杂的Web应用,目前来说,HTML5的优越性已经得到了广大开发人员……【查看全文

    阅读:11797关键词: 主流浏览器   HTML5   兼容性   兼容性测试   浏览器   HTML5兼容性   日期:2014-05-30
  • HTML5和HTML4的区别:HTML5新标签的用法解释

    HTML5本身是由W3C推荐出来的,HTML5提供了一些新的元素和属性,例如

  • 深入解析HTML5的8大性能

    从性能角度来说,HTML5首先是缩减了HTML文档,使这件事情变得更简单。第一,从用户可读性上说,原先一大堆东西,像初学者第一次看到这些东西是看不懂的,而HTML5的声明方式对用户来说显然更友好一些。第二,文档编码的声明,用HTML5方式的话,就很简单。很多人问HTML5是……【查看全文

    阅读:1263关键词: QQ漂流瓶   QQ漂流瓶群发   HTML5   HTML5性能   日期:2013-05-18
↓ 点击查看更多 ↓

互联网更多>>

SEO优化 更多>>

百度搜索用户建议专区上线公告 企业网站SEO推广能给企业带来哪些好处?