CSS3魔法堂:说说Multi-column Layout
前言
是否记得《读者文摘》中那一篇篇优美感人的文章呢?那除了文章内容外,还记得那报刊、杂志独有的多栏布局吗?
当我们希望将报刊、杂志中的阅读体验迁移到网页上时,最简单直接的方式就是采用多栏布局来对内容排版,然而在过去我们仅能通过float+positioned来模拟多栏布局,而且效果不尽人意。而CSS3引入新的Multi-column Layout模型,从底层支持多栏布局。
文本作为学习笔记,以便日后查阅。
通栏布局与多栏布局
在深入Multi-column Layout模型之前,我们先看看疗效吧。
通栏布局
大家在网上浏览的新闻、博客等一般采用的是通栏布局,效果如同当前本篇博客一样,就是所有内容均集中在一列中排版。若将这种布局方式运用在报刊、杂志上那只能一个字来形容,那就是丑了。
多栏布局

感觉是不是犹如在读纸质的杂志呢:)
深入Multi-column Layout模型
模型组成

multi-column element(abbr. multicol):图中白色线框,column-width或column-count属性值不为auto时,该元素则作为multicol并为其子元素提供multi-column layout。
注意:
- multicol会生成新的BFC,因此不会出现collapsing margins效果。
column box(abbr. column):图中红色线框,如同line box一样用于组织multicol中的各子元素。具体特性如下
- multicol下的子元素被分配到column box中进行排版,若column box不足以容纳某个子元素,则将子元素拆解成N个部分并分配到N个column box中;
- column box沿multicol的inline direction排列;
- column box的数目是根据
column-width、column-count属性值,和multicol的content box的inline dimension上的长度度计算而来的; - 同一个multicol下的所有column box的宽度都是一样的,当
column-fill:balance时高度均等于mluticol在block dimension上的长度; - 子元素所属的containing block不再是multicol的content box,而是该元素位于的column box;(因此如
width:100%和float:left均是以column box为参考系) - 若内容超出column box在inline dimension的长度时,则会被隐藏;(视觉上就是内容刚好在column gap前被截取了)
- absolute positioned元素不参与multi-column layout.
column gap:图中粉色线框,位于column box之间。
column rule:图中蓝色线框,位于column gap内,作为column box间的分隔线。
注意上述内容有几个相对陌生的概念——inline direction、block direction、inline dimension、block dimension,其实就是对应我们默认情况下的"从左至右"、"从上到下"、"水平方向"和"垂直方向"。那为何不用后者来描述呢?原因就是后者是一种"合理误解"的描述方式,"从左至右"只是inline direction的其中一种而已。下面我们简单梳理一下!参考
- block dimension与inline dimension相互垂直;
- writing mode为水平方向时,inline dimension与horizontal dimension一致;writing mode为垂直方向时,inline dimension与vertical dimension一致;
- block direction其实是Flow-relative Direction下的block flow direction,我们要从关注"上下"转移到关注
block-start和block-end,沿block direction排列实际上就是从block-start到block-end排列。当writing-mode为horizontal-tb时,block-start为上,block-end为下;当writing-mode为vertical-rl时,block-start为右,block-end为左;当writing-mode为vertical-lr时,block-start为左,block-end为右; - inline direction其实是Flow-relative Direction下的inline base direction,我们要从关注"左右"转移到关注
line-start和line-end,沿inline direction排列实际上就是从line-start到line-end排列。当writing-mode含horizontal关键词时,且direction为ltr,则line-start为左,line-end为右,否则相反;若writing-mode含vertical关键词时,且direction为ltr,则line-start为上,line-end为下,否则相反。

<style type="text/css">
.container{
width: 300px;
height: 500px;
padding: 5px;
border: dashed 1px #888;
font-size: 14px;
line-height: 1.5;
letter-spacing: 0.3em;
-webkit-writing-mode: vertical-rl;
text-align: justify;
-webkit-columns: auto 2;
-webkit-column-gap: 1.5em;
}
.container h1{
background: #eee;
text-align: center;
}
.container p{
text-indent: 2em;
}
</style>
<div class="container">
<h1>梦开始的地方</h1>
<p>核心提示:十年寒窗无人问,一举成名天下知。不可否认求学之路的艰辛苦闷。但这似乎也阻止不了那些为上大学而昼夜奋战的莘莘学子。如此的努力,为了仅仅是能在大学“逍遥快活一番”这动机实在让人心寒,也正因如此造就了大学生的堕落。电脑,科技革命的产物。人类文明进步最有力的证明。这也成为了大学生必不可少的装备之一,但大多数...</p>
<p>十年寒窗无人问,一举成名天下知。不可否认求学之路的艰辛苦闷。但这似乎也阻止不了那些为上大学而昼夜奋战的莘莘学子。如此的努力,为了仅仅是能在大学“逍遥快活一番”这动机实在让人心寒,也正因如此造就了大学生的堕落。</p>
</div>
CSS属性详解
1.column-width:auto|<length>
设置每栏的宽度
- 若
column-count属性值为auto,则column-count=父容器宽度/column-width; - 若
column-count属性值不为auto,则该设置为每栏的最小宽度,并根据父容器宽度,调整显示的栏目数目。(注意:当column-width*column-count< 父容器宽度时,column-width将自动扩大)
2.column-count:auto|<integer>
作用:设置栏目数量
- 若
column-width属性值为auto,则无论父容器宽度是多少,依然保持固定的栏目数; - 若
column-width属性值不为auto,则该设置为栏目的最大数量,并根据父容器宽度,调整显示的栏目数目。(注意:当column-width*column-count< 父容器宽度时,column-width将自动扩大)
column:<column-width> || <column-count>
3.column-gap:normal|<length>
作用:设置栏之间的间距,normal的结果值一般为1em。
4.column-rule:<length>||<style>||<color>||<transparent>
作用:设置栏之间边框的宽度、样式和颜色。
子属性column-rule-width:<lenght>
子属性column-rule-style:<border-style>
子属性column-rule-color:<color>
5.column-span:1|all
作用:设置某子元素跨1栏还是跨所有栏。
6.column-fill:balance|auto
作用:设置栏高是相等,还是根据自身内容而定。
7.在默认情况下,当column没有足够的空间容纳整个子元素时,则会对子元素进行拆解(如同line box中的inline-level box一样)。而CSS3中还提供了break-before/after/inside3个属性来调整拆解方式。
break-before:auto|always|avoid|left|right|page|column|avoid-page|avoid-column
break-after:auto|always|avoid|left|right|page|column|avoid-page|avoid-column
break-inside:auto|avoid|avoid-page|avoid-column
针对screen媒介的属性值
auto, 不强制也不禁止在盒子前/后/内发生网页/栏目拆解;
always/column, 强制在盒子前/后发生网页/栏目拆解;
avoid/avoid-column, 禁止在盒子前/后/内发生网页/栏目拆解;
针对打印的属性值
left/right/page/avoid-page

<p style="-webkit-column-break-inside:avoid;">核心提示:十年寒窗.....</p>
兼容——无法抹去de痛
Multi-column Layout的各个属性在不同的浏览器中的支持程度也有所区别,但就columns属性的支持如下:

-webkit-columns
-moz-columns
columns
总结
由于兼容性问题,我们并不能很好地享受Multi-column Layout的美好,幸运的是模拟报刊多栏布局的场景并不多见,而且用户通过网页阅读时已习惯通栏布局,因此不是非用不可啦!
尊重原创,转载请注明来自:http://www.cnblogs.com/fsjohnhuang/p/5412841.html_肥仔John
感谢
CSS3 Multi-column Layout
Columns
http://caniuse.com/#search=column
《CSS 3实战》——第6章 CSS 3多列布局
《图解CSS3核心技术与案例实战》——第9章 CSS3 多列布局
CSS3魔法堂:说说Multi-column Layout的更多相关文章
- CSS3魔法堂:CSS3滤镜及Canvas、SVG和IE滤镜替代方案详解
一.前言 IE特有的滤镜常常作为CSS3各种新特性的降级处理补充,而Adobe转向HTML5后与Chrome合作推出CSS3的Filter特性,因此当前仅Webkit内核的浏览器支持CSS3 F ...
- CSS3魔法堂:认识@font-face和Font Icon
一.前言 过去我们总通过图片来美化站点的LOGO.标题.图标等,而现在我们可以通过@font-face获取另一种更灵活的美化方式. 二.看看例子 /* 定义 */ @font-face { font- ...
- CSS3魔法堂:CSS3滤镜及Canvas、SVG和IE滤镜替代方案详解[转]
一.前言 IE特有的滤镜常常作为CSS3各种新特性的降级处理补充,而Adobe转向HTML5后与Chrome合作推出CSS3的Filter特性,因此当前仅Webkit内核的浏览器支持CSS3 F ...
- CSS3魔法堂:背景渐变(Gradient)
一.前言 很久之前就了解过CSS3的线性渐变(Linear-Gradient),这段时间决定进一步认知这一特性,以下笔记以便日后查阅. 二.CSS3的各种背景渐变 1. 线性渐变 示例——七彩虹 ...
- CSS3魔法堂:禁止用户改变textarea大小
一.前言 在FF.Chrome和Safari下默认时允许用户以拖拽形式来改变textarea大小,这不仅与IE下textarea的行为特点有异,而且textarea的大小变化会撑大其父节点从而破坏整体 ...
- CSS魔法堂:"那不是bug,是你不懂我!" by inline-block
前言 每当来个需要既要水平排版又要设置固定高宽时,我就会想起display:inline-block,还有为了支持IE5.5/6/7的hack*display:inline;*zoom:1;.然后发 ...
- CSS魔法堂:Box-Shadow没那么简单啦:)
前言 说起box-shadow那第一个想法当然就是用来实现阴影,其实它还能用于实现其他好玩的效果的,本篇就打算说说box-shadow的那些事. 二话不说看效果 3D小球 <style typ ...
- CSS魔法堂:重拾Border之——更广阔的遐想
前言 当CSS3推出border-radius属性时我们是那么欣喜若狂啊,一想到终于不用再添加额外元素来模拟圆角了,但发现border-radius还分水平半径和垂直半径,然后又发现border-t ...
- CSS魔法堂:重拾Border之——不仅仅是圆角
前言 当CSS3推出border-radius属性时我们是那么欣喜若狂啊,一想到终于不用再添加额外元素来模拟圆角了,但发现border-radius还分水平半径和垂直半径,然后又发现border-t ...
随机推荐
- VB.Net 2010中 ./和../的含义
文件路径 文件路径就是文件在电脑(服务器)中的位置,表示文件路径的方式有两种:相对路径和绝对路径. Windows由于使用 斜杆/ 作为DOS命令提示符的参数标志了,为了不混淆,所以采用 反斜杠\ 作 ...
- 测试函数用Return 返回值和用函数名返回值的区别
'*************************************************************************'**模 块 名:工程1 - Form1'**说 ...
- Visual Studio中创建混合移动应用程序解决方案Xamarin Portable Razor
在Visual Studio中创建混合移动应用程序的一个解决方案是使用Xamarin Portable Razor工具,这是ASP.NET MVC API针对移动设备的一个轻量级实现.Xamarin编 ...
- 剑指Offer面试题:29.丑数
一.题目:丑数 题目:我们把只包含因子2.3和5的数称作丑数(Ugly Number).求按从小到大的顺序的第1500个丑数.例如6.8都是丑数,但14不是,因为它包含因子7.习惯上我们把1当做第一个 ...
- 轻量级ORM框架初探-Dapper与PetaPoco的基本使用
一.EntityFramework EF是传统的ORM框架,也是一个比较重量级的ORM框架.这里仍然使用EF的原因在于为了突出轻量级ORM框架的性能,所谓有对比才有更优的选择. 1.1 准备一张数据库 ...
- UWP开发之控件:用WebView做聊天框
目录 说明 WebView存在的价值 使用WebView的几个重要技巧 使用WebView做的聊天框 说明 大家都知道,无论是之前的Winform.WPF还是现在的IOS.Android开发中,都存在 ...
- Unit Testing with NSubstitute
These are the contents of my training session about unit testing, and also have some introductions a ...
- 2013 duilib入门简明教程 -- VS环境配置(2)
既然是入门教程,那当然得基础点,因为搜索duilib相关资料时,发现有些小伙伴到处都是编译错误,以及路径配置错误等等,还有人不知道SVN,然后一个个文件手动下载的. 其实吧,duili ...
- CI Weekly #3 | 关于微服务、Docker 实践与 DevOps 指南
CI Weekly 围绕『 软件工程效率提升』 进行一系列技术内容分享,包括国内外持续集成.持续交付,持续部署.自动化测试. DevOps 等实践教程.工具与资源,以及一些工程师文化相关的程序员 Ti ...
- mybatis中的#和$的区别
#相当于对数据 加上 双引号,$相当于直接显示数据 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111,那么解析成sq ...