web framework

24
网网 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 年年年年年年年年 年年年年年年 年年年年年年年年年年年年年 ,:一,。

Upload: lewis-wen

Post on 29-Jan-2016

233 views

Category:

Documents


0 download

DESCRIPTION

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 的负面影响,最后还是由布局内

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

小结

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

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

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

构 + 悟…

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

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

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