本章内容简介:
定制网格布局的宽度是一件简单的事情。因为 YUI 的网格布局基于 em 值,而该值又与基准字体大小相联系,所以将想要的宽度转换成 em 值只需要少量简单的计算即可。宽度是按照 em 单位设置的,因为 em 会随着基准字体大小缩放。换言之,当用户调整字体大小时,整个网格也会随之作出响应。由于基准字体大小设为13像素,因此转换成 em 值时,只要将宽度除以 13 即可,至少对于多有非 IE 浏览器来说是如此。对于 IE 而言,必须将宽度除以 13.3333 。下面的示例演示如何实现一个重写值:
<style>
#custom-doc {
margin: auto; text-align: left; /* leave unchanged */
width: 46.15em; /* non-IE */
*width: 45.00 em; /* IE */
min-width: 600px; /* optional but recommended */
}
</style>
在本节的示例中,我们已经给出了基于网格的文档的基本结构,如下所示:
<html>
<head>
<title></title>
<link rel="stylesheet" type="text/css" href="reset-fonts-grids.css" />
</head>
<body>
<div id="doc">
<div id="hd">
<!-- Header content goes here -->
</div>
<div id="bd">
<!-- Body content goes here -->
</div>
<div id="ft">
<!-- Footer content goes here -->
</div>
</div>
</body>
</html>
首先,在文档的 head 标记中包括 grids.css 文件。然后创建带有想要的 doc ID 的 div 元素,在这里就是 "doc" ,这会产生 750 像素宽度的布局。在该元素内部有 3 个 div 元素,ID 分别为 hd、bd 和 ft,分别表示页眉、正文和页脚。
大多数网站都有列式布局,其中的一列表示主要内容,另一列表示次要内容。YUI Grids 有一组围绕这个概念构建的预制模版 (尺寸基于 IAB 指导原则)。最初的两列有两个带有CSS类名 yui-b 的 div 元素, b 代表 "block"(块) 。为了实现源代码顺序无关性 (换言之,主要内容或次要内容首先出现在源代码中,但在布局中并不是如此),使用 ID 为 yui-main 的 div 元素将主要内容块包装起来。最后,为了触发 6 种预设模版中的一种,要把如下CSS 类名之一分配给根 div 元素。
-------------------------------------------------------------------------------------
模版类 | 预设说明
-------------------------------------------------------------------------------------
yui-t1 | 左列宽度160像素
yui-t2 | 左列宽度180像素
yui-t3 | 左列宽度300像素
yui-t4 | 右列宽度160像素
yui-t5 | 右列宽度180像素
yui-t6 | 右列宽度300像素
-------------------------------------------------------------------------------------
下面是使用预设 yui-t4 实现基本模版布局的代码清单:
<div id="doc" class="yui-t4">
<div id="hd">
<!-- Header content goes here -->
</div>
<div id="bd">
<div id="yui-main">
<div class="yui-b">
<!-- Primary content goes here -->
</div>
</div>
<div class="yui-b">
<!-- Secondary content goes here -->
</div>
</div>
<div id="ft">
<!-- Footer content goes here -->
</div>
</div>
可以使用 YUI 网格进一步将内容块划分成两部分。网格 (在有限的程度上) 等同于 HTML 表中的行元素。在网格中放置两个单元元素,它们等同于表的单元格。网格通过 CSS 类名 yui-g 来识别,而单元通过 CSS 类名 yui-u 来识别。下面是一个网格中有两个单元的代码:
....
<div class="yui-g">
<div class="yui-u first">
<!-- Unit content here -->
</div>
<div class="yui-u">
<!-- Unit content here -->
</div>
</div>
.......
实现4个单元的代码如下:
<div class="yui-g">
<div class="yui-g first">
<div class="yui-u first">
<!-- Unit content here -->
</div>
<div class="yui-u">
<!-- Unit content here -->
</div>
</div>
<div class="yui-g first">
<div class="yui-u first">
<!-- Unit content here -->
</div>
<div class="yui-u">
<!-- Unit content here -->
</div>
</div>
</div>
注意,外层网格 (yui-g) 包含另外两个网格。因为每个网格只有两个单元,所以总共有4个单元。还请注意CSS类名first。每当有两个或更多的 yui-u 或 yui-g 这样的一系列项时,CSS 类名first 将告诉 YUI 特殊对待这一系列中的第一项 (例如调整外边距等)。简而言之,CSS 类名 first 确保元素能够正确地布局。网格单元 (yui-u) 将可用空间划分成相同的两部分。但在有些情况下,需要让其中一个单元更大一些,或者需要3个单元。这就是特殊网格发挥作用的地方。
------------------------------------------------------------------------------------------------------------------
特殊网格类 | 说明
yui-gb | 1/3-1/3-1/3
yui-gc | 2/3-1/3
yui-gd | 1/3-2/3
yui-ge | 3/4-1/4
yui-gf | 1/4-3/4
------------------------------------------------------------------------------------------------------------------
通过结合使用网格和特殊网格,我们可以构建非常复杂的布局。下面的代码就实现了这样的一个复杂布局。
<html>
<head>
<title></title>
<link rel="stylesheet" type="text/css" href="reset-fonts-grids.css" />
<link rel="stylesheet" type="text/css" href="base-min.css" />
</head>
<body>
<div id="doc" class="yui-t4">
<div id="hd">
<h1>Header</h1>
</div>
<div id="bd">
<div id="yui-main">
<h2>Primary Col</h2>
<div class="yui-b">
<div class="yui-g">
<div class="yui-g first">
<div class="yui-u first"><h3>Row 1, Col 1</h3><p>Lorem ipsum dolor sit amet, consectet......</p></div>
<div class="yui-u"><h3>Row 1, Col 2</h3><p>Lorem ipsum dolor sit amet, consectet......</p></div>
</div>
<div class="yui-g">
<div class="yui-u first"><h3>Row 1, Col 3</h3><p>Lorem ipsum dolor sit amet, consectet......</p></div>
<div class="yui-u"><h3>Row 1, Col 4</h3><p>Lorem ipsum dolor sit amet, consectet......</p></div>
</div>
</div>
<div class="yui-gc">
<div class="yui-u first"><h3>Row 2, Col 1</h3><p>Lorem ipsum dolor sit amet, consectet......</p></div>
<div class="yui-u"><h3>Row 2, Col 2</h3><p>Lorem ipsum dolor sit amet, consectet......</p></div>
</div>
</div><!-- end of yui-b-->
</div><!-- end of yui-main-->
<div class="yui-b">
<h2>Secondary Col</h2>
<p>Lorem ipsum dolor sit amet, consectet......</p>
</div><!-- end of yui-b-->
</div><!-- end of bd -->
<div id="ft">
<p>Footer</p>
</div><!-- end of ft -->
</div><!-- end of doc -->
</body>
</html>
除了出于清晰起见而将 CSS 文件夹和文件重命名为以添加 "css" 前缀 (它们现在名为 cssreset、cssfonts 和 cssgrids) 之外,YUI 3 CSS 文件现在也包括上下文。这意味着我们并不会被迫将CSS文件应用于整个页面,而是可以通过库文件的 -content.css 版本只将它们应用于页面的某个部分。这使得改进没有使用 YUI 的现有页面变得简单得多。此外,不再是一个 ID 定义一个网格文档,而是每个页面上可以有多个布局并存,所有基于 ID 的css选择器已经替换成 css 类名。