CSS布局的前世今生

文章来源:fantasai的演讲记录

黑暗时代

直到1990年代中期,网页设计仍然不堪入目,HTML元素里混杂着样式控制,例如用H1来表示更大的字体,在TABLE里设置背景色,当时算得上技巧别致的布局方法是在TABLE里放置透明的GIF图片来占位。

CSS1时代

90年代后期,CSS被发明出来的初心是为了让样式与结构分离,用一种简便的语法把控制样式的代码写在一个独立的文件内,这种概念在当时显得超前。
CSS1并没有真正控制布局的工具,它主要是为了代替HTML里一些与样式相关的属性,例如宽度、高度。CSS1定义的属性有width、height、float、clear、margin、padding、backgrounds、borders、fonts、list styles、alignment、white-space等。其中float是为了代替HTML里用于IMG和TABLE的align属性,float在CSS1的设计意图里并非用于左右布局,仅仅是按照float的字面意义——实现图文环绕的效果。
CSS1的主流布局方法仍然是TABLE。边距margin和padding的出现,使得我们可以在TABLE之间实现间隔,取代过去用于占位的透明GIF以及换行符BR。这些概念在今日看来理所当然,但在当时却是革命性的。

CSS2时代

1998年W3C发布了CSS2,把当时最先进的布局工具引入CSS。通过display属性的灵活使用,HTML的任意元素可以被转换为任意的显示方式。网页设计者不必再被HTML元素的固有布局限制,能够在保证语义的基础上,实现更灵活的视觉效果。例如导航菜单能够横排并列,为了保持sidebar和main两列高度一致,可以把它们都设为display:table-cell
此时,布局思想仍然是以TABLE为基础,display包含了众多与table等价的值,是为了方便其他元素转换为table。然而,由于不同浏览器的内核差异,以table为基础的布局方法很难实现跨浏览器兼容。
在这样的背景下,聪明的网页设计者开始发掘其他属性来控制布局,浮动和定位的地位一跃成为主流,奠定了所谓DIV布局的江山。这种布局思想的灵活性非常强,充分利用CSS2里的各种材料,衍生出无数技巧。但从宏观结构的角度来看,技巧性布局的做法像是在建造房子时不搭建钢筋混凝土框架、仅仅用混杂的材料胶粘拼接而成。不利于维护,也不利于理解。
CSS的工作组一直在为了“让样式的构建和表达更具意义”而努力。在CSS2的实践过程中发现存在诸多模糊之处,有些特性缺乏实用性,浏览器的兼容性更成为切图人员的噩梦。2002年,CSS2.1修订版发布,弥补了很多漏洞。与此同时,浏览器开发商也在逐步改善对CSS的支持。CSS2.1在2000年代后期稳固了统治地位,为CSS3标准的制定打下坚实基础。

CSS标准的发展与浏览器市场的变化密不可分。在黑暗年代和CSS1初生时期,Netscape与IE争霸;21世纪初,IE6一统江湖;2000年代中期,各类浏览器崛起,兼容性成为重要挑战;2000年代后期,浏览器对CSS的支持渐趋一致;2010年代初,随着移动端的需求,HTML5和CSS3兴盛。

CSS3时代

CSS3采用模块化设计,各个部分可以各自发展升级,主要分为四块(从易到难):

  • 页面处理能力:例如选择器和媒体查询。
  • 视觉装饰效果:例如多背景、圆角、边框图片、渐变。
  • 字体和国际化:例如垂直书写、自定义字体、换行和对齐的控制。
  • 布局:这是最复杂、最具难度的一部分。

网页VS打印

  • 打印:明确知道打印的尺寸、可自由调节内容布局、反复预览调试、而且打印出来所见即所得,所有人能看到一致的结果。
  • 网页:不同的用户有不同的客户端设置、不同设备的屏幕尺寸不一致、分辨率不一致、用户会缩放浏览器、缩放字体、还会生成你无法控制的内容。你还没机会改。用户必然会在不同的场景下浏览网页。必须保证在用户第一次打开时正常显示页面,并能够适应用户无止境的场景变换。
    网页与打印的差别,意味着网页布局必须具备四个特性:
  • 灵活性
  • 适应性
  • 自动化
  • 健壮性

CSS3布局:设计原则

CSS3是CSS工作组首次要为2D布局设计一个含义明晰的系统。这套系统需要具备:

  • 灵活性:适应不同的屏幕尺寸、字体、生成内容等。
  • 全面性:在合理的约束条件下,给予网页设计者足够的发挥空间;既能便捷实现常用的效果,也能满足复杂的技巧。
  • 健壮性:当遇到意外状况(例如未知的字体、超长的文本、超小的屏幕)时,页面仍能保持基本的结构和可读性,不至于崩溃。
  • 易理解:长期以来,DIV布局不易于理解,因为当初就不是为了布局设计的。CSS3的目标是设定更清楚的布局语法,清楚反映出设计者的布局意图。
  • 性能优:网页是多个应用交互的平台,布局系统需要考虑性能,避免多重嵌套之类的写法。

CSS3的布局模块

  • 多列布局
    这是最早确定下来的规范之一,易于使用,但只针对较为特定的布局场景。使用column属性时,设置的值并不是绝对的,而是一组让浏览器去适配的目标。多列布局系统会根据客户端的实际尺寸灵活调整列宽,列的高度也会根据内容来平衡,这是多列布局的优点。
    当处于内容过长、屏幕狭窄的场景内,多列布局会暴露弊端,用户不得不反复上下滚动。最适合多列布局的场景是较短篇幅的内容或者翻页媒体。多列布局能够很好的兼容IE9之后的浏览器。
  • 弹性布局
    弹性布局引入了弹性尺寸的概念,既可以指定绝对的比例,也可以让多余的空间自动分配。弹性布局适用于对一条直线上(沿坐标轴)各个元素尺寸的控制,属于一维布局,能够灵活设置一个坐标轴上各个元素的尺寸、对齐、排序。
  • 网格布局
    目前仅有IE10以上版本支持部分属性,尚未进入实用阶段。在这种布局下,可将元素声明为网格,给予一定的行、列空间,再把后代元素填充进去。对于不同的网格空间,能够定义其大小、位置和层级。
    网格布局是二维布局,思路是为了摆脱HTML结构以及文档流从上至下的限制,有利于响应式设计。利用网格线的范围设置,可以轻松让不同单元格的内容实现互换,不需要像position布局那样计算尺寸。通过合并单元格,实现更复杂的布局。
  • 区域(Regions)和排除(Exclusions)
    “区域”和“排除”的概念来源于Adobe InDesign的排版方法,借鉴印刷媒体的布局优势。
    使用“区域”布局时,可以指定文档流的内容源和多个目标区域,让内容源在目标区域里“流动”,多个目标区域的灵活布局能够使内容流动变得非常丰富多彩,不再拘泥于常规的文档流。
    “排除”布局是建立在实现图文环绕效果的思路上,float元素虽然是为图文环绕而生,但在浮动位置的设置上受到限制。wrap-flow:both属性能够让文字环绕在Exclusion元素两侧。甚至可以使用Shapes模块来定义被环绕元素的形状,不过被环绕元素的位置由四周的内容来决定,很消耗性能,精确的视觉效果和性能不可兼得。
  • 媒体查询
    媒体查询允许我们针对不同的输出环境配置不同的CSS,只需要根据需要设定临界值,在各个临界值区间内输出不同的布局。

CSS规范的产生过程

三个阶段

  • 设计阶段:工作草案;
    • 探索阶段:变化很多,部分方案可能不会进入成熟的规范。
    • 修订阶段:模块接近完成,功能应用范围有了较好的定义,但还需要经历评审程序,解决细节问题。
    • 精炼阶段:已经能够完备地交付候选推荐,仍需要精细地打磨,发布最终征求意见稿。
  • 测试阶段:候选推荐;
    • 由多个独立团队测试规范的精确性和互通性,建立测试套件,收集测试结果,至少需要有两个独立的实例能通过测试。
  • 维护阶段:推荐标准;
    • 正式成为推荐标准前,要确保测试时遇到的问题都可解释,遇到的bug都已解决,然后进入维护期。
      详细可参考下图:


      W3C技术报告发展过程

      当工作组暂停或关闭时,会发布工作组备忘(Working Group Note);工作组重启后,备忘恢复为工作草案。

创新资源

对CSS的建议来源于四面八方,包括实践、设计者、工作组的专家等。工作组并没有决断者,一个好的设计需要让所有参与者接受。例如圆角、过渡、动画、转换是出于实践的需求,多重背景、选择器、多列布局、媒体查询、颜色格式是基于规范的理论,边框图像是出于设计目的,伸缩布局、文本是各种来源综合形成的规范。

评审和修订

建立规范的过程,并不都是从草案起步。很大程度上是在回应反馈的过程中不断评审、修订,发展出一套东西。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,725评论 1 92
  • 选择qi:是表达式 标签选择器 类选择器 属性选择器 继承属性: color,font,text-align,li...
    love2013阅读 2,301评论 0 11
  • 没有爱情的婚姻是否能长久 现在结婚快五年了,我们是通过相亲认识的,认识三个月就结婚了,当时也有很多同事说我们那么快...
    赖汝婵阅读 417评论 0 1
  • 一、功能 1、管理多个kafka集群2、便捷的检查kafka集群状态(topics,brokers,备份分布情况,...
    献给记性不好的自己阅读 4,807评论 2 6
  • 和颐酒店女子被袭击一案,真的给我们很大的警醒。 你会觉得这真的是很悲凉又痛苦的一件事:"仅仅是被别人认为说是"小两...
    陈路得阅读 279评论 0 0