《HTML 5与CSS 3 权威指南(第3版·上册)》——3.3 HTML 5中网页结构

简介:

本节书摘来自华章出版社《HTML 5与CSS 3 权威指南(第3版·上册)》一 书中的第3章,第3.3节,作者:陆凌牛,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.3 HTML 5中网页结构

前面两节详细介绍了在HTML 5中具体新增了哪些结构元素以及这些元素的定义和使用方法。在HTML 5中,可以使用这些结构元素来编排一份网页大纲,通过该网页大纲,我们可以一目了然地知道网页中具有哪些内容,网页中以什么样的结构形式来组织这些内容。

3.3.1 HTML 5中的大纲

在Word文档中,一份文档的大纲如下所示:

6e759a08839530c62b06d86142ee4508afffb0f4

HTML 5网页文档中的大纲也基本如此,只不过使用不同的结构元素进行表达而已。换句话说,在HTML 5中,使用各种结构元素所描述出来的整个网页的层次结构,就是该网页的大纲。因此,在组织这份大纲的时候,不能使用div元素,因为div元素只能当作容器,用在需要对网页中某个局部使用整体样式时。
许多工具可以对HTML 5的网页文档进行分析,然后将该文挡中的大纲以可视化的形式展现出来。网站中就有一个文档大纲分析器,可以针对代码清单3-21中所示文档进行分析,分析结果如图3-4所示。
代码清单3-21 大纲分析工具测试用代码

<!DOCTYPE html>
<head>
<meta charset="UTF-8">
<title>大纲分析</title>
</head>
<section>
    <h1>HTML5的基础知识</h1>
    <section>
        <h2>HTML5概述</h2>
        (正文)
        <section>
            <h3>HTML5是什么?</h3>
            (正文)
        </section>
        <section>
            <h3>HTML5中的新增API</h3>
            (正文)
        </section>
    </section>
    <section>
        <h2>HTML5快速入门</h2>
        (正文)
        <section>
            <h3>HTML与XHTML</h3>
            (正文)
        </section>
    </section>
</section>

c4ba06c3378ad5b02c6ebd38e240126be34a7803

图3-4中出现“1.Untitled Section”,是由于该网页文档中第一个元素即为section元素,缺乏整个网页标题元素。加入标题元素(<h1>元素),将代码清单3-21中的代码修改为代码清单3-22所示的代码,分析出来的大纲如图3-5所示。
代码清单3-22 添加了header元素后的大纲分析工具测试用代码

<!DOCTYPE html>
<head>
<meta charset="UTF-8">
<title>大纲分析</title>
</head>
 <h1>HTML5的基础知识</h1>
<section>
    <h2>HTML5概述</h2>
    (正文)
    <section>
        <h3>HTML5是什么?</h3>
        (正文)
    </section>
    <section>
        <h3>HTML5中的新增API</h3>
        (正文)
    </section>
</section>
<section>
    <h2>HTML5快速入门</h2>
    (正文)
    <section>
        <h3>HTML与XHTML</h3>
        (正文)
    </section>
</section>

b72ec56e300ed07802a4b9c2a67b9edfed32d9a9

看到这里,你也许会问,如果光加一个<h1>元素,就可以分析出标题来,那么还需要header元素干什么?答案是h1元素一般用来显示文字标题。事实上,在要定义为网页标题的整个内容中,往往并不只是显示一段文字而已,其中还包括了大量的导航条、企业LOGO图片、广告f?lash等,这些内容都可以放在一个header元素中,作为整个网页标题的内容,而标题文字为h1元素中的文字,在大纲中显示该标题文字。但是,这里要说明的是,header元素本身的作用不是被用来生成大纲的,大纲是依靠header元素中的h1~h6元素来生成的,如使用代码清单3-23中的代码生成的大纲如图3-6所示。
代码清单3-23 在企业网站中使用图片来显示企业名称

<!DOCTYPE html>
<head>
<meta charset="UTF-8">
<title>企业网站</title>
</head>
 <header>
    <img src="title.jpg" alt="用来显示企业名称的图片">
</header>
<section>
    <h2>企业描述</h2>
    (正文)    
</section>

bd31c038823e284b7a73050c395eaff2fe072d71

这里会产生这样一个问题,在很多企业网站(或其他网站)中,企业的标题并不是以文字来显示的,而是为了视觉效果,放在图片中显示的。难道这种情况就不能生成大纲了吗?笔者认为,这里有个小技巧,在header元素中,使用如下代码,既可以用图片来显示企业名称,又可以生成大纲。

<header>
    <h1><img src="title.jpg" alt="企业名称"></h1>
</header>

在header元素中使用这段代码后,生成的大纲如图3-7所示。

145f7994bfaf541e5ed9475a97cd5508c0c2ed22

与header元素相同,footer元素中如果没有标题元素(h1~h6元素)也不用于生成大纲。
在代码清单3-21或代码清单3-23中的代码底部追加如下代码,生成的大纲将不会有任何变化。

<footer>
    版权所有:陆凌牛
</footer>

另外,对nav元素与aside元素来说,如果不在元素内部加入标题元素(h1~h6元素),生成大纲时会在该元素所在位置处添加一个“Untitled Section”的说明文字,但是根据HTML 5的开发文档记载,nav元素的作用为存放一组链接组,aside元素的作用为表示当前页面或文章的附属信息部分,允许不在这两个元素中添加标题,也就是说,大纲中存在对这两个元素的内容为“Untitled Section”的说明文字是合理的。
在代码清单3-21的代码底部添加如下代码,生成的大纲如图3-8所示。

<nav>
    <ul>
        <li><a href="#">链接测试1</a></li>
        <li><a href="#">链接测试2</a></li>
    </ul>
</nav>
<aside>
    侧边栏中的内容
</aside>

f7d917e03b2782e6cfe4638f0ae719b69ff8a6d1

另外,在HTML 5中,body元素、blockquote元素、f?ieldset元素、td元素、details元素及f?igure元素称为节根(sectioning root)元素。这些元素的共同特征是拥有自己独立的大纲,并且这些元素内的section元素、article元素、标题元素(h1~h6元素)、nav元素以及aside元素等,只用于生成其父元素的大纲时,而不用于生成父元素的上层祖先元素的大纲时。
在代码清单3-24中,blockquote元素内部有一个h1元素,正是因为这个h1元素是位于节根元素blockquote元素内部的,所以在针对blockquote元素的父元素body元素生成页面大纲时,该h1元素并没有显示在大纲中,如图3-9所示。
代码清单3-24 针对body元素生成大纲时节根元素中的子元素不起作用

<!DOCTYPE html>
<meta charset="UTF-8">
<body>  
<h1>网页标题</h1>  
<blockquote>    
<h1>节根元素内部标题</h1>  
</blockquote>
</body>

aa3e724b8b5e335d17caaacf6397e3d7e9c883a4

3.3.2 大纲的编排规则

关于内容区块的编排,可以分为显式编排与隐式编排两种方式。
1.?显式编排内容区块
显式编排是指明确使用section等元素创建文档结构,在每个内容区块内使用标题(h1~h6、hgroup等),如代码清单3-25所示。
代码清单3-25 显式编排内容区块示例

<body>
    <h1>网页级内容区块标题</h1>
    <p>网页级内容区块的正文</p>
    <section>
        <h2>section级内容区块的标题</h2>
        <p>section级内容区块的正文</p>
    </section>
</body>

2.?隐式编排内容区块
所谓隐式编排,是指不明确使用section等元素,而是根据页面中所书写的各级标题(h1~h6、hgroup)等自动创建各级内容区块。因为HTML 5分析器只要看到书写了某个级别的标题,就会判断存在相对应的内容区块。代码清单3-26为一个隐式编排内容区块的
示例。
代码清单3-26 隐式编排内容区块示例

<body>
    <h1>网页级内容区块标题</h1>
    <p>网页级内容区块的正文</p>
    <!--分析器根据h2等元素判断生成内容区块-->
    <h2>section级内容区块的标题</h2>
    <p>section级内容区块的正文</p>
</body>

将这两种编排方式进行对比,很明显,显式编排更加清晰明确、易读。
3.?标题分级
不同标题之间是有级别的,h1的级别最高,h6的级别最低。隐式编排时按如下规则自动生成内容区块。
如果新出现的标题比上一个标题级别低,生成下级内容区块。
如果新出现的标题比上一个标题级别高或级别相等,生成新的内容区块。
第一条规则的示例与前面一样,现在我们来看关于第二条规则的示例,如代码清单3-27所示。
代码清单3-27 第二条规则示例

<body>
<section>
    <h2>section级别的内容区块的标题</h2>
    <p>section级别的内容区块的正文</p>
    <!—因为下面的标题级别比上一个标题级别高,所以自动创建新的内容区块 -->
    <h1>新的section级别的内容区块的标题</h1>
    <p>新的section级别的内容区块的正文</p>
</section>
</body>

如果把上一个示例改成显式编排,代码如代码清单3-28所示。
代码清单3-28 第二条规则的显式编排示例

<body>
<section>
    <h2>section级别的内容区块的标题</h2>
    <p>section级别的内容区块的正文</p>
</section>
<section>
    <h1>新的section级别的内容区块的标题</h1>
    <p>新的section级别的内容区块的正文</p>
</section>
</body>

因为隐式编排容易让自动生成的整个文档结构与所想要的文档结构不一样,而且也容易引起文档结构混乱,所以尽量使用显式编排。
4.?不同的内容区块可以使用相同级别的标题
另外,不同的内容区块可以使用相同级别的标题。例如,父内容区块与子内容区块可以使用相同级别的标题h1。这样做的好处是,每个级别的标题都可以单独设计,如果既需要“整个网页的标题”,又需要“文章的标题”(譬如书写文档时),这样做将会带来很大的便利性,如同代码清单3-29所示。
代码清单3-29 不同的内容区块可以使用相同级别的标题

<body>
<h1>网页的标题</h1>
<article>
    <header>
        <hgroup>
            <h1>文章标题</h1>
            <h2>文章子标题</h2>
        </hgroup>
        <p>文章正文</p>
    </header>
</article>
</body>

5.?网页编排示例
基于以上讲解过的知识点,我们来看应该怎样编排网页的内容。代码清单3-30为一个标准博客网页的示例,这个示例具备一个标准博客网页的基本要素,只缺少为了使用样式而补充添加的div元素。
代码清单3-30 网页编排示例

<!DOCTYPE html>
<head>
  <title>网页编排示例</title>
  <meta charset="UTF-8">
</head>
<body>
<!-- 网页标题 -->
<header>
    <h1>网页标题</h1>
    <!-- 网站导航链接 -->
    <nav>
        <ul>
            <li><a href="index.html">首页</a></li>
            <li><a href="help.html">帮助</a></li>
        </ul>
    </nav>
</header>
<!-- 文章正文 -->
<article>
    <hgroup>
        <h1>文章主标题</h1>
        <h2>文章子标题</h2>
    </hgroup>
    <p>文章正文</p>
    <!--文章评论 -->
    <section class="comments">
        <article>
            <h1>评论标题</h1>
            <p>评论正文</p>
        </article>
    </section>
</article>
<!-- 版权信息 -->
<footer>
    <small>版权所有:陆凌牛</small>
</footer>
</body>

这个示例使用了嵌套artilce元素的方式,将关于评论的article元素嵌套在主article元素中,在HTML 5中,推荐使用这种嵌套article元素的方式。

3.3.3 对新的结构元素使用样式

因为很多浏览器尚未对HTML 5中新增的结构元素提供支持,我们无法知道客户端使用的浏览器是否支持这些元素,所以需要使用CSS追加如下声明,目的是通知浏览器页面中使用的HTML 5中新增元素都是以块方式显示的,如下所示。

// 追加block声明
article, aside, dialog, f?igure, footer, header, legend, nav, section, main 
{   display: block; }
// 正常使用样式 
nav{f?loat;left;width:20%;}
article{f?loat:right;width:79%;}

另外,Internet Explorer 8及之前的浏览器不支持用CSS的方法来使用这些尚未支持的结构元素,为了在Internet Explorer浏览器中也能正常使用这些结构元素,需要使用JavaScript脚本,如下所示。

// 在脚本中创建元素
<script>
document.createElement("header");
document.createElement("nav");
document.createElement("article");
document.createElement("footer");
document.createElement("main");
</script>
<style>
// 正常使用样式 
nav{f?loat;left;width:20%;}
article{f?loat:right;width:79%;}
</style>

尽管这段JavaScript脚本在其他浏览器中是不需要的,但它不会对这些浏览器造成什么不良影响。另外,到了Internet Explorer 9之后,这段脚本就不需要了。

相关文章
|
20天前
|
前端开发 测试技术 定位技术
如何利用HTML和CSS构建企业级网站的全过程。从项目概述到页面结构设计,再到HTML结构搭建与CSS样式设计,最后实现具体页面并进行优化提升,全面覆盖了网站开发的关键步骤
本文深入介绍了如何利用HTML和CSS构建企业级网站的全过程。从项目概述到页面结构设计,再到HTML结构搭建与CSS样式设计,最后实现具体页面并进行优化提升,全面覆盖了网站开发的关键步骤。通过实例展示了主页、关于我们、产品展示、新闻动态及联系我们等页面的设计与实现,强调了合理布局、美观设计及用户体验的重要性。旨在为企业打造一个既专业又具吸引力的线上平台。
44 7
|
20天前
|
前端开发 JavaScript 搜索推荐
HTML与CSS在Web组件化中的核心作用及前端技术趋势
本文探讨了HTML与CSS在Web组件化中的核心作用及前端技术趋势。从结构定义、语义化到样式封装与布局控制,两者不仅提升了代码复用率和可维护性,还通过响应式设计、动态样式等技术增强了用户体验。面对兼容性、代码复杂度等挑战,文章提出了相应的解决策略,强调了持续创新的重要性,旨在构建高效、灵活的Web应用。
29 6
|
20天前
|
前端开发 UED 开发者
CSS Sprites和图标字体在网页图标加载优化中的应用。CSS Sprites通过合并多图标减少HTTP请求,提升加载速度
本文探讨了CSS Sprites和图标字体在网页图标加载优化中的应用。CSS Sprites通过合并多图标减少HTTP请求,提升加载速度;图标字体则以字体形式呈现图标,便于调整样式。文章分析了两者的优缺点及应用场景,并提供了应用技巧和注意事项,旨在帮助开发者提升页面性能,改善用户体验。
21 5
|
20天前
|
存储 移动开发 前端开发
高效的 HTML 与 CSS 编写技巧,涵盖语义化标签、文档结构优化、CSS 预处理、模块化设计、选择器优化、CSS 变量、媒体查询等内容
本文深入探讨了高效的 HTML 与 CSS 编写技巧,涵盖语义化标签、文档结构优化、CSS 预处理、模块化设计、选择器优化、CSS 变量、媒体查询等内容,旨在提升开发效率、网站性能和用户体验。
31 5
|
20天前
|
前端开发 JavaScript UED
在数字化时代,Web 应用性能优化尤为重要。本文探讨了CSS与HTML在提升Web性能中的关键作用及未来趋势
在数字化时代,Web 应用性能优化尤为重要。本文探讨了CSS与HTML在提升Web性能中的关键作用及未来趋势,包括样式表优化、DOM操作减少、图像优化等技术,并分析了电商网站的具体案例,强调了技术演进对Web性能的深远影响。
25 5
|
2月前
|
前端开发 JavaScript 搜索推荐
打造个人博客网站:从零开始的HTML和CSS之旅
【9月更文挑战第32天】在这个数字化的时代,拥有一个个人博客不仅是展示自我的平台,也是技术交流的桥梁。本文将引导初学者理解并实现一个简单的个人博客网站的搭建,涵盖HTML的基础结构、CSS样式的美化技巧以及如何将两者结合来制作一个完整的网页。通过这篇文章,你将学会如何从零开始构建自己的网络空间,并在互联网世界留下你的足迹。
|
1月前
|
JSON 移动开发 数据格式
html5+css3+js移动端带歌词音乐播放器代码
音乐播放器特效是一款html5+css3+js制作的手机移动端音乐播放器代码,带歌词显示。包括支持单曲循环,歌词显示,歌曲搜索,音量控制,列表循环等功能。利用json获取音乐歌单和歌词,基于html5 audio属性手机音乐播放器代码。
107 6
|
3月前
|
移动开发 前端开发 JavaScript
Twaver-HTML5基础学习(9)HTML节点(HTMLNode)
本文介绍了Twaver HTML5中的HTML节点(HTMLNode),这是一种专门用于呈现HTML元素的网元。文章解释了HTMLNode如何继承自Node并具有所有Node的特点,以及如何通过setName()方法将HTML元素作为网元的LabelAttachment或者AlarmAttachment呈现。示例代码展示了如何在React组件中创建HTMLNode并添加HTML元素,以及如何自定义告警显示样式。
27 1
Twaver-HTML5基础学习(9)HTML节点(HTMLNode)
|
2月前
|
前端开发 JavaScript 搜索推荐
打造个人博客网站:从零开始的HTML与CSS之旅
【9月更文挑战第31天】在这个数字时代,拥有一个个人博客网站是展示自我、分享知识和连接世界的重要方式。本文将引导你通过简单的HTML和CSS知识,一步步构建起你的在线空间。无论你是编程新手还是希望通过实践加深理解,这篇文章都将是你的理想指南。我们将探索基本概念,实现页面布局,并点缀以个性化样式,最终将静态页面转变为动态交互式网站。准备好了吗?让我们开始吧!