div 元素,通过与 id、class 及 role 属性配合,提供向文档添加额外结构的通用机制。这个元素不会将表现的风格定义于内容。所以,创作者可以通过将这个元素与样式表、xml:lang、属性等配合使用,使 XHTML 适应他们自身的需求和口味。
div 是 division 的简写。division 意为分割、区域、分组。比方说,当你将一系列的链接组合在一起,就形成了文档的一个 division。
确定结构的通用机制
所有编写 HTML 的人对段落和标题这类常见的元素都很熟悉,但是有些人对 div 就可能不那么熟悉了。在W3C的描述中我们可以找到理解 div 元素的关键,“一种添加结构的通用机制。”
在本站的首页,我们将教程目录列表封装于一个 div 之中,这是因为教程目录并不是正文的任何元素的一部分。其中,h2元素标记每个教程的标题,同时 ul 列表元素标记每个教程的详细列表。但是在更大更具体的意义中,这个教程目录扮演了一个结构化的角色,即二级导航组件。为了强调这个角色,我们使用 navsecond 这个 id 标注这个 div。
因此,将 id 标注为 "menu"、"content" 或者 "searchform"会帮助你回忆。进一步讲,标记不等同于设计,结构良好的的页面可以被格式化为你希望的任何样子。这样做的结果是,无论你使用纯粹 CSS 布局或者混合布局,你都会彻底改掉使用表现标记进行思考和创作的习惯。
id Vs. class
id 属性对于 XHTML 并不新鲜;class 属性或者 div 元素也一样。它们都可以回溯到 HTML 时代。id 属性为一个元素分配一个唯一的名字。每个名字只能在被赋予的页面使用一次。(例如,假如你的页面包含 id 为 content 的 div,那么另外一个 div 或者其他别的元素都不能使用这个名字。相反地,class 属性可以被一遍又一遍地使用在页面中(例如,页面中的五个段落都可以使用名为 "small" 或者"footnote" 的 class 名称)。下面的标记将有助于阐明 id 和 class 的差异:
<div id="searchform">Search form components go here. This
section of the page is unique.</div>
<div class="blogentry">
<h2>Today's blog post</h2>
<p>Blog content goes here.</p>
<p>Here is another paragraph of blog content.</p>
<p>Just as there can be many paragraphs on a page, so too
there may be many entries in a blog. A blog page could use
multiple instances of the class "blogentry" (or any other
class).</p>
</div>
<div class="blogentry">
<h2>Yesterday's blog post</h2>
<p>In fact, here we are inside another div of class
"blogentry."</p>
<p>They reproduce like rabbits.</p>
<p>If there are ten blog posts on this page, there might
be ten divs of class "blogentry" as well.</p>
</div>
在这个例子中,名为 searchform 的 div 被用来封装包含搜索表单的页面区域,而 div class="blogentry" 则用来封装 blog 中的每个文章入口。在页面中只有一个搜索表单,所以我们选择 id 标注这个唯一的组件。但是 blog 则拥有许多的(文章)入口,所以 class 属性被应用于这种情况。同样地,新闻站点通常拥有多个 div,这些 div 的 class 可以命名为 "newsitem" 或者别的什么。
然而不是所有的站点都需要 div。blog 站点可以仅仅使用 h1, H2, 和 h2 标题和 <p> 段落,新闻站点也一样。我们在这里展示 class 为 blogentry 的 div,并不是鼓励你在站点中塞满 div,而仅仅是为了向你展示这个原则:在同一个 HTML 文档中,使用多次 class,但只能使用一次 id。
粘性贴纸理论
把 id 属性比作粘性贴纸来进行思考应该是有帮助的。我会在冰箱上拍一张贴纸来提醒自己去买牛奶,电话上面也会贴一张,提醒我给一位逾期缴纳的客户打电话。还有一个,被贴在账本夹上面,来提醒我这个月 15 号之前必须缴纳的账单。
当某一 id 属性作为一个有磁性的东西(磁铁)被用于一系列特定的 CSS 规则时,它被称为CSS选择器。有许多创建选择器的方法,不过 id 是很容易使用的,并且有多的用途。
id 的力量
id 属性不可思议地强有力。它具有以下的能力:
作为样式表选择器,使我们有能力创作紧凑的最小化的 XHTML。
作为超文本的目标锚,取代过时的 name 属性。
作为从基于 DOM 的脚本来定位特定元素的方法。
作为对象元素的名称。
作为一种综合用途处理 (general purpose processing) 的工具(在 W3C 的例子中,“当把数据从HTML页面中提取到数据库,或将 HTML 文档转换为其他格式等情况下,作为域识别工具来使用。”)。
id的规则
id 值必须以字母或者下划线开始;不能以数字开始。虽然 W3C 验证不会捕获这个错误,但是 XML 解析器会的。同时,如果你将 id 与 JavaScript 在表单中配合使用,那么 id 名称和值必须是合法的 JavaScript 变量。空格和连字号,特别是连字号,是不被允许的。不仅如此,将下划线用于 class 或者 id 名都不是个好主意,这是由于在 CSS2.0(以及某些浏览器)中的限制。
语义标记和可用性
现在,我们已经讨论过了用途广泛的 XHTML 元素(特别是 div 和 id),让我们在看看关于本站首页的例子。首先让我们回顾一下这个位于报头位置的菜单:
<div id="navfirst">
<ul id="menu">
<li id="h"><a href="/h.asp" title="html教程">html教程</a></li>
<li id="x"><a href="/x.asp" title="XML教程">XML教程</a></li>
<li id="b"><a href="/b.asp" title="浏览器脚本">浏览器脚本</a></li>
<li id="s"><a href="/s.asp" title="服务器脚本">服务器脚本</a></li>
<li id="d"><a href="/d.asp" title="dot net教程">dot net教程</a></li>
<li id="m"><a href="/m.asp" title="多媒体教程">多媒体教程</a></li>
<li id="w"><a href="/w.asp" title="建站手册">建站手册</a></li>
</ul>
</div>
我们拥有七个链接,每个链接被分配一个id来对应相应的内容:例如名为 h 的 id 对应 HTML 教程,以此类推。同时这些链接被封装于名为 menu 的列表元素内,名为 menu 的 id 标明了这个列表的职能 - 一个菜单列表,而更外围的名为 navfirst 的 div 则用来标注页面中的这个节 (section),将之与诸如主要内容 (maincontent)、侧栏 (sidebar) 和页脚 (footer) 之类的元素区别开来。
div 和 ul 两个元素提供了真实的结构,即标明了其中内容的职能(导航栏)和它在文档中所属的位置(页面的报头位置)。相反地,传统的表格布局无法提供有关数据的任何语义信息,同时会轻松地吃掉三倍的带宽。