一览CSS布局标准

标签: 前端 | 发表时间:2013-05-03 23:16 | 作者:Kejun
出处:http://hikejun.com/blog

回顾历史,CSS1于1996.12.17发正式版,它是为辅助HTML的展现效果而生的。
1998.5.12,CSS2发正式版。随后发修订版CSS2.1,纠正了CSS2中的一些错误。注意从CSS2起,CSS的作用就不是辅助展现了,变为全全负责展现。
(注:当年 CSS2的勘误表有兴趣可以看看)

CSS2.1明确了2个模型,一个是众所周知的盒模型(Box model),CSS1没有盒模型的概念,盒模型的前身在CSS1里叫做面向盒的格式化模型。元素抽象为盒,以盒为对象设计思路清晰多了。CSS3的盒模型丰富了更多属性。盒的产生,以及盒的定位就是CSS2.1定义的第二个模型-可视格式化模型(Visual Formatting Model)。CSS3相关的布局标准实际上也在这个大的框架之下。

CSS布局有明确标准始于CSS2。CSS1里压根没提布局,虽然CSS1里有Float元素的定义,但它的设计不是为页面布局,只是为了实现图文绕排。早期用table布局便顺理成章。CSS2是98年变为推荐标准的,按理此时应该普及新的CSS布局标准,但table布局的使用习惯一直保持到2004年才被Jeffrey Zeldman那本书点醒。05年它的中文版《网站重构》出版,国内掀起重构浪潮。早期网页开发者是受软件教育的(Frontpage, Dreamweaver之类),完全没有标准的概念。

所以要从标准出发学习CSS,而不是仅仅掌握一些工具(包括一些库)。这是有前车之鉴的。

回到布局的话题上。CSS2.1的布局分为3种:
1. 常规流(Normal Flow)
2. 浮动(Float)
3. 绝对定位(Absolute Position)

这3种不能混用。如果代码里看到position:absolute;display:block;这种明显是概念混乱。很多人也错把position:relative跟position:absolute归为一类。position:relative是常规流中的一种,例外是它可以和Float一起使用。关于CSS2.1布局的阐述请看这里: http://kejun.github.io/bootcamp_htmlcss/?5

IE6时代被忽视的常规流布局:
1. Inline-Block。兼容性: http://caniuse.com/#feat=inline-block,触发IE的hasLayout可以实现相似的效果,以至于可以兼容IE6/7,逐渐被广泛应用。
2. CSS Table。兼容性: http://caniuse.com/#feat=css-table,仅仅不兼容IE6/7,在IE6时代被埋没。随着IE6/7的淡出终有出头之日了。

对float的滥用就像当年对table的滥用“。很多人设计布局时不假思索的用Float,明显欠缺对布局技术有更多了解。尤其在低端浏览器日渐淡出,新的布局技术触手可及的当下,是时候学习实践这些新技术了。之前做过一个demo,用6种思路实现同一种两列布局: http://dabblet.com/gist/4094139。看完本文后,可以有更多实现思路。

今天脱囗而出的CSS3只是一种笼统的叫法。有CSS Level 1,CSS Level 2,时至今日还没有CSS Level 3。CSS2.1之上的新标准大部分仍在WD状态,只有CSS Color Level 3和Selectors Level 3进入REC状态。

(注:PD – Public Draft, 公共草案,初步想法。不乏PD之后就废弃的。WD – Working Draft, 工作草案。开始有人修订它了。LC – Last Call, 对外宣布了。CR – Candidate Recommendation, 候选推荐。REC – Recommendation,正式推荐。也就是正式版标准。这些状态只能说明标准的稳定状态。浏览器厂商从自身利益出发,选择性的支持了一些仍处于WD状态的标准。于是出现各种厂商前缀。标准制订跟不上发展,浏览器厂商在竞争中冒进,苦逼的是开发者。)

新的布局标准可以更简单更灵活的实现布局。CSS3目前有5种布局方案:
1. 多栏布局(Multi-Column Layout )
2. 灵活盒布局(Flexible Box Layout)
3. 栅格布局(Grid Layout)
4. CSS3的浮动盒(CSS3 Floating Boxes)
5. Regions

Multi-Column Layout
当前状态:CR
历史:1999.6.23发PD,2009.12.17进入CR状态
兼容性: http://caniuse.com/#feat=multicolumn
Demo: http://dabblet.com/gist/5507829
问题:
1. 目前只能平均分栏,还不支持分别指定栏宽(未来会有)。
2. 浏览器支持的新旧标准不一。
比如,上例中div.intro的内容想保持在一栏中,chrome支持column-break-inside: avoid;这是 2005.12.15更新的WD中的标准。由此推测chrome遵循的是05年的WD标准。目前CR标准已改成break-inside。Firefox20仍实现的是 2001年的WD标准
3. 多栏布局更适合用于内容流布局,不适合页面布局。

Flexible Box Layout
当前状态: CR
历史:2009.7.23发PD, 2011.3.22进入WD状态,2012.9.18进入CR状态
兼容性: http://caniuse.com/#feat=flexbox
Demo: http://dabblet.com/gist/5508104
理解它分为两部分:Flex容器(Flex Container)和Flex项(Flex Item)。
1. 定义Flex容器(display:flex)后, 它的一级子元素(inline box/block box/anonymous box),可沿水平或垂直方向排列(flex-direction, 默认row),可指定靠某一边对齐(flex-wrap),可指定对齐方式(justify-content)。每个Flex项默认是等高的(align-items, 默认stretch)。
2. Flex项不指flex属性时,宽度由实际内容的宽度决定。
3. Flex项可以指定以什么比例填充空白。如:
.list li { flex:1; } 则均匀填充。
.list li:nth-child(1) { flex: 4; background: #f80; }  本例中Flex Item 1的宽为4/8。
4. flex属性是可以动画的。
5. Flex项可以控制顺序(order, 默认0,值高在后面)。
参考: http://d.hatena.ne.jp/teramako/20121021/p1

曾在weibo上出过一道题:“ 实现一个不定宽高的层,在窗口中水平垂直居中”,用Flex Box可以轻松实现:
html,body { height:100%; }
body { display:flex; }
.list { justify-content:center; }

(Grid) Template Layout (曾经称为Advanced Layout)
当前状态:WD
历史:2005.12.15发PD, 2007.8.9进入WD状态。最终合并进Grid Layout

Grid Position
历史: 2007.9.5发PD,随后被废弃

Grid Layout
当前状态:WD
历史:2011.4.7发PD,2012.3.22进入WD状态,最新一版是2013.4.2
兼容性: http://caniuse.com/#feat=css-grid
以这种兼容性还不值得学它。1996年有个 基于帧布局的草案。当时没往这条路上走,最终绝对定位进入CSS2。Grid Layout正是建在它的基础之上。

CSS3的浮动盒(CSS3 Floating Boxes)
当前状态: WD
历史:2002.10.24就出现在CSS basic box model的草案中。
CSS3的浮动盒太未来了,还没有浏览器支持。比如:
float: right contour; contour关键字,文字可以沿图片不规则的轮廓绕排。
min-height: contain-floats; 新的清浮动方式
float-displace: block; 新的float-displace属性

Regions和Shapes
当前状态:WD
历史: 2011.6.9发表PD, 2011.11.29进入WD状态,最新一版WD是2012.8.23
兼容性: http://caniuse.com/#feat=css-regions
Demo: http://dabblet.com/gist/5509294 Chrome 19+, IE10+
它适用于内容流布局。兼容性有限,可以先简单看看。

Have Fun!

相关 [css 布局 标准] 推荐:

一览CSS布局标准

- - Kejun's Blog
回顾历史,CSS1于1996.12.17发正式版,它是为辅助HTML的展现效果而生的. 1998.5.12,CSS2发正式版. 随后发修订版CSS2.1,纠正了CSS2中的一些错误. 注意从CSS2起,CSS的作用就不是辅助展现了,变为全全负责展现. (注:当年 CSS2的勘误表有兴趣可以看看).

css三列布局

- - Wing的风言风语
   web平面设计中有一个既经典又基础的问题(据说很多公司面试都考):三列布局问题,就是一个大盒子,里面竖直再分三块小盒子并排,其中左边的盒子和右边的盒子固定宽度,中间的盒子自适应宽度,无乱怎么样放大缩小浏览器都不会变形. 这两天研究了一下这个问题,默认父容器是body,1:设置三个盒子都左浮动且宽度都是33.3%,不行.

CSS技巧荟萃:了解CSS页面布局和加载流程

- - 前端观察
如果你开发web相关应用或者网站的话,肯定知道CSS对于页面布局的重要性. 在本篇CSS技巧中我们将介绍页面加载的流程来帮助你更好的实现页面布局. 在我们开始正式的介绍页面流程前,我们需要简单了解几种不同类型的html元素,以及它们的缺省显示方式. 这里我们主要重点介绍两个类型的元素:. 如果大家关心html5的话,你应该知道在HTML5中也包含了几个新的元素,例如,section,article等等,但是仍旧遵循这里我们介绍的显示类型.

前端代码标准最佳实践:CSS

- - CSDN博客推荐文章
上一篇《 前端代码标准最佳实践:javascript》发表后,大家讨论还是很热烈,从侧面体现了前端工程师对写标准的前端代码的重视程度很高. 这些最佳标准实践并不是那个权威组织发布的,而是由大量的前端工程师们在实践过程中的经验总结,目的在于提高代码的可读性,可维护性和性能. 那么接着上一篇,我们再来谈谈CSS代码的一些标准实践.

Semantic:来自未来的CSS布局框架

- 小宇 - 雷锋网
CSS网格框架可以让你享受轻松的生活,但这依然无法掩盖它们的不足. 让我们感到幸运的是,先进技术为我们引入了新的方法去布局网页. 在我们前往了解先进技术前,我们必须首先了解当前影响CSS网格样式的三个看似不可克服的缺陷. 这是我从“纯化论者”口中听到过的最大的抱怨,自我在两年前创建1KB CSS Grid框架开始,CSS网格系统就规定标记和描述必须在一起.

CSS布局中一个简单的应用BFC的例子

- - 阿里巴巴(中国站)用户体验设计部博客
上文中我们讲述了在一个星球上发生的有关overflow:hidden的故事. 这次,我们再欣赏下她另一个迷人之处. 而是由于她会引起 BFC(Block Formatting Context). BFC(Block Formatting Context),简单讲,它是提供了一个独立布局的环境,每个BFC都遵守同一套布局规则.

页面架构HTML+CSS ●▽● 各种布局各种实现

- - SegmentFault 最新的文章
(1)清除浏览器默认样式. (1)项目开发初期就定义好. (2) reset.css 在引入的时候一定要放在第一位. (3)不同的产品 reset.css不一样. 3.table合并边框间距. table { border-collapse: collapse; // 合并边框 border-spacing: 0; //边框间距.

[常用布局]左栏固定宽度,右栏自适应的两种纯CSS方法

- - 蓝飞技术部落格
其一,左栏固定宽度,右栏自适应之绝对定位法:. 左栏固定宽度,右栏自适应之绝对定位法. 由于左栏使用绝对定位,脱离了文档流,因此有一个缺陷,即当左栏高度大于右栏时,无法将container撑开,这个缺陷单单只看两栏布局并没有太大影响,但如果两栏布局下面有一个底栏,就会出现底栏与左栏重叠的情况:.

CSS图形

- GLORY - 酷壳 - CoolShell.cn
下面的示例展示了使用纯CSS制作的各种图形,你可以自由地修改文中的CSS代码. 经测试,IE9, Chrome, FF, Safari都可以正常显示. 五角星形 via Kit MacAllister. 心形 via Nicolas Gallagher. 无穷大 via Nicolas Gallagher.

用 Compass 寫 CSS

- Jay - Blog.XDite.net
最近在開發一個新產品,整體來說應該是接近寫完了,不過越接近完工,抓 IE 系列的 bug 就越是挫折. 朋友 @evenwu 就來洗我要不要換成 Compass,說這東西超神奇,超好用,還可以把 IE bug 殺光光. 其實之前就久仰 Compass 大名了,只是文件實在看起來太他媽的眼花繚亂,因為專案進度一直在跑,不太敢貿然換掉寫 CSS 的方式.