Download doc - web Framework

Transcript
Page 1: web Framework

网页栅格系统研究( 1 ): 960 的秘密

2008 年 10 月 22 日 | 设计探讨

研究网页栅格系统前,来看一组数据:

网站 首页页面宽度 px

Yahoo! 950

淘宝 950

MySpace 960

新浪 950

网易 960

Live Search

958

搜狐 950

优酷 960

AOL 960

上面列举的都是 Alexa 全球排名前 100 的站点 ,它们的首页宽度为 950px/

960px. 除了微软的 Live Search, 这些站点有个共同特点:页面结构较复杂,

都可以认为是门户型网站。

再来看看 Google, YouTube, Facebook, Flickr!, eBay 等知名站点,它们的

首页宽度没什么固定规律,共同的特点是:功能专一,页面结构相对简单。

根据上面的简单分析可以认为:当搭建页面结构复杂的门户型网站时,开发工

程师们不约而同地都选择将页面宽度定为 950px/960px.

Page 2: web Framework

这是一件很有趣的事情,为什么要选择这个宽度呢?这个宽度值究竟有什么魔

力?

神奇的 960

设计师们对苹果情有独衷。在 1024 x 768 的分辨率下,打开 Firefox:

自然状态下,Firefox 窗体的大小约为 974 x 650. 减掉左右两边 7px 的边框,

网页的实际大小为上图中的红色部分,高宽为 960 x 650.

有趣的 960 就这样出现了。是的,可以认为一切就这么简单。栅格系统最早出现

在平面设计领域,设计师们爱用苹果,苹果下浏览器的默认宽度为 960px, 于

是 960 就这么“自然”地出现了。

数字背后的奥妙

Page 3: web Framework

上面的“自然”出现,细究自然是不让人信服的。苹果系统的设计者们在没有喝

醉酒的情况下选择了 960,而不是其它什么 1000 之类的整数,自然另有奥妙。

科学界有很多问题都可以归结到数学问题上,我们也从数学着手:

960 可以分解为 2 的 6 次方乘以 3 和 5, 这使得 960 可以分割成以下宽度的整

数倍:

2, 3, 4, 5, 6, 8, 10, 12, 15, 16, 20, 24, 30, 32, 40,48, 60, 64, 80, 96, 120, 160, 192, 240, 320, 480

共 26 种(26 = 7 * 2 * 2 – 2, 减去 2 是去掉 1 和 960 自身),我们标记为:

N(960) = N(2^6 * 3 * 5) = 26

根据上面的算法,可以得到:

N(360) = N(2^3 * 3^2 * 5) = 22N(480) = N(2^5 * 3 * 5) = 22N(720) = N(2^4 * 3^2 * 5) = 28N(750) = N(2 * 3 * 5^3) = 14N(800) = N(2^5 * 5^2) = 16N(960) = N(2^6 * 3 * 5) = 26N(1000) = N(2^3 * 5^3) = 14N(1024) = N(2^10) = 9N(1440) = N(2^6 * 3^2 * 5) = 34N(1920) = N(2^7 * 3 * 5) = 30

根据直觉(严格证明也不难,不过还是留给数学系的学生去证明吧),我们得

到一个有趣的结论:

Page 4: web Framework

要使得 N(width)最大,width 的取值有两个系列:

A 系列: …, 320, 720, 1440, …

B 系列: …, 480, 960, 1920, …

N 越大,可组合的宽度值就越多。对栅格系统来说,这意味着越灵活!

目前绝大多数显示器都支持 1024 x 768 及其以上分辨率。为了有效的利用屏

幕宽度同时保证栅格的灵活度,可以看出 960 是非常合适的。这样,在目前主

流显示器下,960 就成为网页栅格系统中的最佳宽度了。(也许不久的将来,

将会流行 1440)

细心的你也许会记得,本文开头列举的宽度值中,950 也出现了好几次。950

是怎么来的?和 960 是啥关系?这些疑问,请关注本系列的下一篇文章。

网页栅格系统研究( 2 ):蛋糕的切法

2008 年 10 月 22 日 | 设计探讨

首先澄清一个应用场景问题。研究( 1 ) 中指出,对于结构复杂的网站,不少设

计师们喜欢采用 960 固定宽度布局。但要注意的是,960并不是万能钥匙,大

部分网站没有也不需要栅格系统。Amazon 采用的是宽度自适应布局,最大限

度的呈现信息。Google 更是简简单单,主题部分就一个列表。eBay 的页面非常

Page 5: web Framework

简洁,商品页面宽度自适应,信息自然流畅,噪音少,购物很踏实。类似的站点

还有很多,对于这些站点来说,宽度自适应布局更受青睐。

有个很有意思的网站是 Yahoo!, 看起来是固定宽度布局,实际上在 CSS 中只

要去掉一行,就能摇身一变自适应宽度了:

#page { }

为什么 Yahoo!最后选择了定宽布局呢?这很可能是因为定宽布局比宽度自适

应布局更容易控制。对于结构复杂的网站来说,可维护性和可扩展性非常重要 。

Yahoo!是以信息展示为主的门户型网站,960 的宽度对于信息的阅读比较友善

(Joe Clark写了一篇屏幕阅读时有关行长的有趣文章)。种种因素使得

Yahoo!最后采用了定宽布局(Tommy Olsson总结了每种布局设计的优缺

点)。

这里将只关注定宽布局,适用的场景是搭建复杂的门户型网站。对于宽度自适应

布局和相应的栅格系统,暂不讨论(根据实现的技术手段不同,宽度自适应布

局又分为流体布局和弹性布局。我个人蛮喜欢弹性布局,以后有时间再研究)。

好了,已经将范围缩小到定宽布局的网页栅格系统,那我们开始吧。

并不遥远的 750

还记得 800×600 的显示器不?虽然才时隔几年,感觉却好像是上个世纪的事

了。Mark Boulton做了最早的探索:

Page 6: web Framework

将 750 分割成均等的 6份,这就形成了栅格系统,稍加组合划分就形成了两栏

布局和三栏布局。Mark Boulton 还研究了 Gutter(垂直栏之间的间隙)对栅

格的影响,有兴趣的可以阅读原文,或者跟着我往下看吧,下面将详细阐述。

几个术语和一个公式

Page 7: web Framework

一个标准的栅格系统,包括以下部分:

将 Flowline 的总宽度标记为 W, Column 的宽度标记为 c, Gutter 宽度标记为

g, Margin 的宽度标记为 m, Column 的个数标记为 N, 我们可以得到以下公式:

W = c * N + g * (N - 1) + 2 * m

一般来说,Gutter 的宽度是 Margin 的两倍,上面的公式可以简化为:

W = c * N + g * (N - 1) + g = (c + g) * N

将 c+g 标记为 C, 公式变得非常简单:

W = C * N

上面的公式就是栅格系统的基础,很简单吧。

950 的来历

Page 8: web Framework

具体应用时,Margin 其实是一个空白边,从视觉上看并不属于总宽度。不少栅

格设计里习惯性地设定 Gutter 为 10px, 这样 Margin 就是 5px. 当 W 为

960,分割成 6 列时,栅格如下图:

上图的处理是左右 Margin各为 5px. 也可以将 Margin集中放在一边,比如右

边:

无论 Margin放在何处(这只影响技术实现,不影响设计),我们真正要关注

的是去除 Margin 之后的部分:

这就是我们要真正关注的 950!将 W 的含义变为去除 Margin 的总宽度,公式

变化为:

W = N * C - g

将上面的公式实例化一下:

950 = 12 * 80 - 10950 = 16 * 60 - 10

Page 10: web Framework

上面三种切法,N 越大,灵活度越高。可以根据网页的实际复杂度来选用对应的

切法。在 960 Grid System 首页中,展示了 12 x 80 的应用:

我们来看下 研究( 1 ) 中开头列举的网站的栅格应用情况。

Yahoo!是很标准的 24 x 40 栅格:

Page 11: web Framework

淘宝网目前只有商城上部分使用了栅格系统(大的两栏布局遵守了 24 x 40 的

栅格化,主体部分使用的另一套 740 的栅格划分):

网易很不错,采用的是 16 x 60 的栅格系统:

研究(1)中的其它站点都没有真正严格地采用栅格系统。

栅格系统的优势

上面的“发现”是让人有点沮丧的。目前严格采用栅格系统的站点非常少,为什

么我们还要努力的让网页栅格化呢?

Page 12: web Framework

栅格系统具有以下优势:

1. 能大大提高网页的规范性。在栅格系统下,页面中所有组件的尺寸都是有

规律的。这对于大型网站的开发和维护来说,能节约不少成本。

2. 基于栅格进行设计,可以让整个网站各个页面的布局保持一致。这能增加

页面的相似度,提升用户体验。

3. 对于设计师们来说,灵活地运用栅格系统,能做出很多优秀和独特的设

计。(详见《超越 CSS》一书)

对于大型网站来说,我相信栅格化将是一种潮流和趋势。

下面讨论栅格系统中的黄金分割。

黄金分割

黄金分割可以归结为数学问题:对于长度为 1 的线段,将其分成两部分 x 和 1

– x, 使得:

x / 1 = (1 - x) / x

化为简单的二次方程:

x^2 + x - 1 = 0

正数解为:

x = (sqrt(5) - 1) / 2 ~= 0.618

Page 13: web Framework

这就是黄金分割。这个比例不仅仅出现在诸如绘画、雕塑、音乐、建筑等艺术领域

在管理、工程设计等方面也有着不可忽视的作用。 (这是个自然界的魔数,类似

的还有真空光速、普朗克常数、精细结构等等,感兴趣的 Google 吧)

在平面设计领域,黄金分割点被广泛采用。比如下面这种图:

数一数上面有多少黄金分割?

对于 960 栅格,实际宽度是 950. 两栏布局时,黄金分割为:

对于 24 x 40 的情景,最接近黄金分割的两栏布局是 350 : 590, 栏数比例为

9 : 15. 但实际使用时,因为窄栏经常用来做导航或放辅助信息,并不需要

Page 14: web Framework

350px 这么宽。因此实际情况下经常被采用的布局是:

上面讲的都是宽度方向上的栅格化,下面我们看看高度方向上如何应用。

高度方向上的栅格

还记得研究(1)中那张红红的很刺眼的图吗?注意高度值 560 也是很神奇的。

N(560) = N(2^4 * 5 * 7) = 18560 / 960 ~= 0.583

N(560)比较大,同时可以让高宽比接近黄金分割。针对 560, 我们采用 14 x

40 栅格:

这样,我们就在宽度和高度两个方向上都实现了栅格化。

Page 15: web Framework

网页栅格系统研究( 3 ):粒度问题

2008 年 10 月 28 日 | 设计探讨

研究( 2 ) 中讨论了栅格系统的基础知识。这一篇将集中探讨栅格系统的粒度问

题。(注:如非特别指明,栅格系统均指 24 列 960 栅格系统)

淘宝的首页(截图)目前尚未严格遵守栅格系统,如果重构的话,宽度方向可

以考虑采用下面的栅格布局(只考虑页面主体部分,忽略高度的比例):

(图 1)

纷乱的高度世界

我们来看下图 1 左上角。左上角部分目前的宽度为 256px, 重构的话可以将宽度

缩小到 230px 以符合栅格(不可避免的要调整内容,比如人气宝贝中将只能放

下 3张图片)。来仔细看下高度方向:

Page 16: web Framework

(图 2)

高度方向的布局是:90 : 117 : 100, 第一个间隔是 8, 总高度为 325. 很明显,

高度方向没有任何栅格化的迹象。实际上,

即便是严格遵守栅格系统的 Yahoo!首页,高度方向上也没有严格栅格化。

这究竟是为何?

一切皆有可能

我们缩小关注点:

(图 3)

Page 17: web Framework

上图中,图像的大小是 70 x 70, 刚好是 24 列 960 栅格系统两列的宽度。对于

右边的文字,采取了如下样式:

font-size: 12px;line-height: 150%; /* 12 x 150% = 18px */

中文字体是宋体,line-height 的计算值是 18px. 注意图 3 中文字部分可视区

域的高度为 65, 上下各有 4px 和 1px 的间隙。为什么会产生这么奇怪的间隙呢

我们来看下图:

(图 4)

从上图中我们可以得知,12px 的宋体中文字,实际高度只有 11px. line-

height 减去 11 多出来的高度,则“均匀”分布在上下间隙中(如果多出来的

高度为偶数,则上下均分;为奇数时,上面比下面多 1px)。这样,对于 70px

的高度来说,要布局 4行文字时,假设行高多出来的上半部分为 x, 下半部分为

y, 在最理想的情况下,应该满足以下公式:

11 * 4 + 4 * x + 3 * y = 70

x = y 或 x = y + 1

不难推出,x 最理想的整数解为 4. 从而 line-height 为 4 + 11 + 3 = 18. 因

此:

对于 24 列 960 栅格系统来说,如果要在高度方向上实现栅格,font-size 为

12px 时,line-height 的最佳取值是 18px(150%).

Page 18: web Framework

追求完美点话,还可以将文字部分 margin-top: -1px, 使得 65 上下的间隙为

3 和 2.

至此,我们可以初步判断:

高度方向上是有可能严格栅格化的。一切皆有可能!

然而,现实总那么残酷

(图 5)

上图中的标题高度为 22, 这在 24 列 960 栅格系统中是无法对齐的。而且总高

度为 100, 在 24 列 960 栅格系统中也不存在(110才可以)。或许高度方向上

我们可以细化行宽为 20, 但依旧没法解决上面两个问题(22 是明显不能解决的,

而对于 100px 的高度,也无法通过细化行宽来解决。可选高度永远是 10 的奇

数倍,如果进一步细化,小于 10后,会变得非常繁琐,没什么实际应用价

值)

宽度世界里会好些吗

Page 19: web Framework

(图 6)

上面是 Yahoo!首页上的两个小模块,我都不想去标注模块里面的布局宽度了

(因为一点都不符合 24 列 960 栅格系统)。宽度世界里,和高度世界一样充满

希望但现实却残酷无比。

银弹是不存在的

栅格系统是美好的。但如果我们一味地追求将所有设计都栅格化(必须承认我曾

有这个幻想),则立刻会陷入地狱一般的黑暗中。这篇文章中的艰难尝试(我分

析了 20 多个小模块),让我突然醒悟到一个粒度问题:任何设计都有适用范

围,超出最佳适用范围,强行使用只会带来无尽的烦恼。对于栅格系统(这里指

所有栅格系统,包括多种栅格系统混合使用的情景)来说,我觉得以下场景非

常适合:

1. 页面的总体宽度布局,比如两栏、三栏等布局

2. 一些固定区块的尺寸,比如广告图片的尺寸

3. 区块之间的间距,可以参考栅格系统的槽宽(Gutter)

4. 一些可以栅格化的小区域,比如图 3 中的例子,暗合栅格往往能简化布

局上的考虑

Page 20: web Framework

除了上面这些应用场景,强行使用栅格系统,往往会束手束脚,适得其反。这篇

文章的目的,就是尝试用最啰嗦最费神貌似很科学实际很无聊的分析来指出栅

格系统应用时的粒度问题。在粒度问题上达成一致后,下一篇中我们将讨论栅格

系统的技术实现,最后一篇则讨论栅格系统的压轴好戏:模块化开发。

网页栅格系统研究( 4 ):技术实现

2008 年 11 月 05 日 | 设计探讨, 前端技术

前三篇文章中,明确了栅格系统的设计细节和适用范围。这一篇将集中讨论

960 栅格系统的技术实现。

Blueprint 的实现

Blueprint 是一个完整的 CSS 框架,栅格系统是它的一部分功能。我们来看

demo 页面 :

以上三栏布局的代码为:

<style type="text/css"> .container { margin: 0 auto; width: 950px } .span-8 { float: left; margin-right: 10px } div.last { margin-right: 0 } hr { clear: both; height: 0; border: none }</style><div class="container"> <div class="span-8"></div> <div class="span-8"></div>

Page 21: web Framework

<div class="span-8 last"></div> <hr /></div>

上面是基本功能,Blueprint 还支持 append-n, prepend-m, border 等“高

级”功能,这些就不细说了。Blueprint 的特点简单总结如下:

1. 采用浮动来实现布局,简单明了

2. 950 两侧没有 margin, 最后一列的 class需要加上 last

3. 采用额外标签来清除浮动

960.gs 的实现

谈到 960 栅格系统,不得不提 960.gs. Nathan Smith 在这篇文章中,详细阐

述了他的想法和设计思路。这里有个 demo 页面 ,核心代码很简单:

<style type="text/css"> .container_12 { margin: 0 auto; width: 960px } .grid_4 { float: left; margin: 0 10px }</style><div class="container_12"> <div class="grid_4"></div> <div class="grid_4"></div> <div class="grid_4"></div> <div class="clear"></div></div>

上面就构建了三栏布局:

有意思的几点:

Page 22: web Framework

1. margin 是均匀放在 950 两侧的

2. 所有 grid 除了宽度不同,左右边距都一致margin: 0 10px;

3. 代码简单清晰,起始和结束列不需要添加额外 class

很明显,Blueprint 和 960.gs 都是采用浮动来实现布局的,主容器需要添加额

外标签来清除浮动(可以参考这里)。当然,这也不是什么大问题,请看这篇文

章的总结,不添加额外标签也可以清除浮动。

YUI 的实现

接着来看大名鼎鼎的 YUI Grids CSS. YUI 的 CSS 框架由三个文件组成:

reset.css - 样式重置

fonts.css - 版式字体控制

grids.css - 栅格系统

我们从 demo 开始:

注意,demo链接中的宽度是 750 的,但我们只要将<div

id="doc"></div>中的 id改为 doc2, 页面宽度就自动变为 950 宽了(YUI非

常强大^o^)。来看下 dom 结构:

Page 23: web Framework

采用的也是浮动布局,简化后的 CSS代码为:

<style type="text/css"> .doc2 { margin: auto; width: 73.076em } .yui-u { float: left; margin-left: 1.99%; width: 32% } div.first { margin-left: 0 } #ft { clear: both }</style>

YUI 的特点是:

1. 依旧是采用浮动布局,槽(Gutter)宽通过 margin-left 来控制

(Blueprint采用右边距,960.gs采用均分,这三个框架对槽的处理实

在有意思)

2. 总宽度采用 em, 这样可以用在弹性布局上

3. 栏的布局用的是百分比,采用了流体布局

YUI 的好处是能用来做自适应布局,在这前面两个框架里是没有的。但普通的定

宽布局,YUI则显得有点麻烦,比如我们要实现四栏布局,dom 得这样写:

Page 24: web Framework

先来两个两栏布局,再细分为四栏布局,清晰度上欠佳。

更多栅格实现

栅格化更多是一种布局思想,实现技术可以千差万别。比如今年冒出来的伪绝对

定位,立刻就可以用来实现栅格系统。明城兄弟就尝试了一把。

肯定还有非常多的栅格化实现方案,这里就不一一挖掘了。

双飞翼栅格系统

挺奇怪这个名字?请先阅读这篇文章:渐进增强式布局探讨. 简单说,双飞翼

布局是一种布局实现技术,可以利用它来实现一整套栅格系统。

先看 test 页面:Grids Layout Test.

Page 25: web Framework

具体技术细节在渐进增强式布局探讨一文中已经阐述,这里不再重复。有几点需

要说明:

1. 这套栅格系统并不能实现所有布局。这和 YUI Grids 类似,只能实现预定

的一些布局。比如三栏布局,目前只加入了 5 : 13 : 6, 5 : 12 : 7, 9 :

9 : 6, 8 : 8 : 8四种情况,这是从淘宝的现有页面中分析总结出来的。对

于同一个站点来说,太多不同的三栏比例不是好事(淘宝目前都有点多,

以后可能还会进一步统一)。因此如果采用这套栅格系统的话,需要先分

析站点,定义出一套合适的比例。这里有个所有比例的自动生成工具:

grids_css_generator.html.

2. 关于命名:.grid-c2-s6表示两栏(c2: column 2)布局,sub栏的宽

度是 4 列(s4: sub width is 4 * 40 -10). 而.grid-c2-s6f, 最后的 f

表示两栏布局的第二种情况,即 sub 和 main互换。类似地,.grid-c3-

s5e6d表示三栏布局,其中 sub栏的宽度是 5, extra栏的宽度是 6, 最

后的 d表示是 s5e6三栏布局中的第四种情况。

3. 为了方便使用,将最常用的两栏布局.grid-c2-s5 用.grid-c2 直接表示。

同样的,.grid-c3表示.grid-c3-s5e6. 这是淘宝的默认值,其他站点可

以根据实际情况修改。

4. 这套布局符合渐进增强式工作流程。细心的你可能已经发现,所有两栏布

局和三栏布局,HTML 中的 DOM 结构是完全一样的,只有最外层 div

的 class 不同。如果要交换左右栏,只要非常简单的修改下 class 就可以

Page 26: web Framework

5. 实际使用时,两栏布局和三栏布局已经够用。其实有了两栏,其它布局就

都可以组合出来。这里有一个尝试性页面:grids_test4_v0.1.html. 组

合布局看起来很强大,但实际使用时会把问题搞复杂,不推荐使用,干

脆忘掉吧。

最后来看下两个测试页面:两栏布局 grid-c2_test.html 和 三栏布局 grid-

c3_test.html.

目前除了发现在 ie6 下有个 bug(超大图片等会撑乱布局,其实可以用

overflow: hidden 来解决,但考虑 overflow 的负面影响,最后还是由布局内

部的模块来自主控制的好),尚未发现其他问题。

小结

栅格系统更多的是一种布局思想,在实际使用时,根据具体需求选用合适的技

术来实现即可。需要注意的是,对于栅格的技术实现来说,太灵活未必是件好事

适度灵活最难得。怎么才能适度呢?这需要疯狂实践 + 不断的反思 + 持续的重

构 + 悟…

栅格搭好了页面框架,接下来很重要的一件事情就是往里面添加内容模块。让内

容模块规范化,让页面生成工业化,对大型站点来说,这是栅格系统最有商业

价值的地方。下一篇也是本系列最后一篇将展示栅格系统中的模块化应用。