资讯专栏INFORMATION COLUMN

CSS3魔法堂:说说Multi-column Layout

gitmilk / 2608人阅读

摘要:注意会生成新的,因此不会出现效果。图中蓝色线框,位于内,作为间的分隔线。不可否认求学之路的艰辛苦闷。如此的努力,为了仅仅是能在大学逍遥快活一番这动机实在让人心寒,也正因如此造就了大学生的堕落。人类文明进步最有力的证明。

前言

 是否记得《读者文摘》中那一篇篇优美感人的文章呢?那除了文章内容外,还记得那报刊、杂志独有的多栏布局吗?
 当我们希望将报刊、杂志中的阅读体验迁移到网页上时,最简单直接的方式就是采用多栏布局来对内容排版,然而在过去我们仅能通过float+positioned来模拟多栏布局,而且效果不尽人意。而CSS3引入新的Multi-column Layout模型,从底层支持多栏布局。
 文本作为学习笔记,以便日后查阅。

通栏布局与多栏布局

 在深入Multi-column Layout模型之前,我们先看看疗效吧。

通栏布局

 大家在网上浏览的新闻、博客等一般采用的是通栏布局,效果如同当前本篇博客一样,就是所有内容均集中在一列中排版。若将这种布局方式运用在报刊、杂志上那只能一个字来形容,那就是丑了。

多栏布局


 感觉是不是犹如在读纸质的杂志呢:)

深入Multi-column Layout模型 模型组成


multi-column element(abbr. multicol):图中白色线框,column-widthcolumn-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-widthcolumn-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 directionblock directioninline dimensionblock 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-startblock-end,沿block direction排列实际上就是从block-startblock-end排列。当writing-modehorizontal-tb时,block-start为上,block-end为下;当writing-modevertical-rl时,block-start为右,block-end为左;当writing-modevertical-lr时,block-start为左,block-end为右;

inline direction其实是Flow-relative Direction下的inline base direction,我们要从关注"左右"转移到关注line-startline-end,沿inline direction排列实际上就是从line-startline-end排列。当writing-modehorizontal关键词时,且directionltr,则line-start为左,line-end为右,否则相反;若writing-modevertical关键词时,且directionltr,则line-start为上,line-end为下,否则相反。

  
  

梦开始的地方

核心提示:十年寒窗无人问,一举成名天下知。不可否认求学之路的艰辛苦闷。但这似乎也阻止不了那些为上大学而昼夜奋战的莘莘学子。如此的努力,为了仅仅是能在大学“逍遥快活一番”这动机实在让人心寒,也正因如此造就了大学生的堕落。电脑,科技革命的产物。人类文明进步最有力的证明。这也成为了大学生必不可少的装备之一,但大多数...

十年寒窗无人问,一举成名天下知。不可否认求学之路的艰辛苦闷。但这似乎也阻止不了那些为上大学而昼夜奋战的莘莘学子。如此的努力,为了仅仅是能在大学“逍遥快活一番”这动机实在让人心寒,也正因如此造就了大学生的堕落。

CSS属性详解

1.column-width:auto|
 设置每栏的宽度

column-count属性值为auto,则column-count=父容器宽度/column-width;

column-count属性值不为auto,则该设置为每栏的最小宽度,并根据父容器宽度,调整显示的栏目数目。(注意:当column-width*column-count < 父容器宽度时,column-width将自动扩大)

2.column-count:auto|
 作用:设置栏目数量

column-width属性值为auto,则无论父容器宽度是多少,依然保持固定的栏目数;

column-width属性值不为auto,则该设置为栏目的最大数量,并根据父容器宽度,调整显示的栏目数目。(注意:当column-width*column-count < 父容器宽度时,column-width将自动扩大)

column: ||

3.column-gap:normal|
 作用:设置栏之间的间距,normal的结果值一般为1em。
4.column-rule:||