(6.1)分栏布局

6.1 分栏布局

  分栏布局也被称为多列布局、多栏布局,这种布局可以将内容布局到多个列框中,类似报纸上的排版。

  分栏布局比较特殊,有别于传统布局,它将子元素在内的所有内容拆分为列,这与打印网页的时候将网页内容分成多个页面的方式类似。分栏布局主要针对图文排版布局,应用在横向排版场景中,文档流是倒N方向。有个别布局只能使用分栏布局实现,分栏布局虽然在日常开发中用得不多,但是遇到合适的场景时是一种非常有用的布局方式。

  IE10+浏览器都可以使用分栏布局,API稳定,在移动端的兼容性比弹性布局要好,可以放心使用。例如,有一段无序列表,可以看到每一个列表项的内容很少,如果容器的宽度足够,则可以使用columns属性实现分栏布局,让排版更舒服。

HTML

<ul> 
    <li>重庆市</li>
    <li>哈尔滨市</li>
    <li>长春市</li>
    <li>兰州市</li>
    <li>北京市</li>
    <li>杭州市</li>
    <li>长沙市</li>
    <li>沈阳市</li>
    <li>成都市</li>
    <li>合肥市</li>
    <li>天津市</li>
    <li>西安市</li>
</ul>

CSS

ul {
    columns: 2;
}

相比其他布局方法,分栏布局最大的优点是不会改变元素原本的display计算值。例如,在默认状态下,<li>元素会出现项目符号,如圆点或数字序号。此时,如果对<li>元素使用弹性布局或网格布局,则项目符号就会消失,因为display:flexdisplay:grid会重置<li>元素内置的display:list-item声明。

与分栏布局相关的CSS属性共有以下10个:

● columns;(重点)

● column-width;

● column-count;

● column-rule;

● column-rule-color;

● column-rule-style;

● column-rule-width;

● column-span;

● column-fill;

● column-gap;(关注)

虽然这10个CSS属性都有各自的作用,但是在实用程度上却有明显的差异。根据我的开发经验,超过80%的分栏布局只需要使用columns属性就足够,因此,大家的学习重心可以放在columns属性上,column-gap属性有时候也会用到,所以也可以关注下,至于剩下的属性,大家了解一下基本作用即可。

6.1.1 重点关注columns属性

columns属性是column-widthcolumn-count属性的缩写,举几个使用columns属性的例子:

/*栏目宽度*/
columns: 18em;

/*栏目数目*/
columns: auto;
columns: 2;

/*同时定义宽度和数目,顺序任意*/
columns: 2 auto;
columns: auto 2;
columns: auto 12em;
columns: auto auto;

因此,关注columns属性本质上就是关注column-width和column-count这两个CSS属性。

1.关于column-width

column-width 表示每一栏/列的最佳宽度,注意,是“最佳宽度”,实际渲染宽度多半和指定的宽度是有出入的。

最佳宽度

几乎不存在分栏布局的栏目宽度就是 column-width 设置的宽度这样的场景。

因为column-width和传统的width属性不同,column-width 更像是一个期望尺寸,浏览器会根据这个期望尺寸确定分栏数目,一旦分栏数目确定了,column-width属性的使命也就完成了,接下来根据分栏数目对容器进行的分栏布局就和column-width属性没有任何关系了。

没错,column-width属性在分栏布局中就是一个工具属性。

不支持百分比。

column-width:30%; /*不合法*/

2.关于column-count

  column-count表示理想的分栏数目,又出现了很微妙的词——“理想的”,也就是意味着最终的分栏数目可能不受column-count属性值的控制。

 在分栏布局中,最终分栏的数量要么由column-count属性决定,要么由column-width属性决定,这两个CSS属性都可能有更高的决定权。

  决定权优先级的计算诀窍可以用一句话概括:统一转换column-count值,哪个值小就使用哪一个。例如,下面的CSS代码:

具体解析过程如下。

(1).container-1元素宽度为360px,因此column-width:100px换算成column-count的值是3.6,而.container-1元素已经设定了column-count:2,遵循“哪个值小哪个优先级高”的规则,最终.container-1元素的内容分成了2栏。

(2).container-2元素设置的是column-count:4,比column-width:100px换算成的column-count值大,因此,最终.container-2元素的内容分成了3栏(3.6栏向下取整)。

另外,从.container-2的效果可以看出,分栏布局的每一栏的高度并不总是相等的,内容的分割也不总是均匀的,浏览器有一套自己的算法。

6.1.2 column-gap 和 gap 属性的关系(直接用gap)

column-gap 属性表示每一栏之间的空白间隙的大小,可以是长度值,也可以是百分比值,语法示意如下:

/*关键字属性值*/
column-gap: normal;

/*长度值*/
column-gap: 3px;
column-gap: 3em;

/*百分比值*/
column-gap: 3%;

实际上,在分栏布局中,如果不考虑IE浏览器,我们可以直接使用gap属性设置分栏间隙大小,例如:

.container
{
	columns: 2;
	gap: 1rem;
}

至于原因,用一句话解释就是:column-gap 是 gap 属性的子属性。

gap属性进行了统一

在网格布局规范制定之后的一段时间,CSS世界中的行与列之间的间隙使用了gap属性进行了统一,也就是分栏布局、弹性布局和网格布局的间隙都全部统一使用gap属性表示,而gap属性实际上是column-gap属性和row-gap属性的缩写。

6.1.3 了解 column-rule、column-span 和 column-fill 属性

高级属性。

1.column-rule 属性

column-rule 属性是 column-rule-widthcolumn-rule-stylecolumn-rule-color 这3个CSS属性的缩写,正如border是border-style、border-width和border- color的缩写一样。

.container {
width: 320px;
border: solid deepskyblue;padding: 10px;
column-count: 2;

/*和border规则一样*/
column-rule: dashed deepskyblue; 
}

2.column-span 属性

column-span 属性有点类似表格布局中的HTML属性 colspan,表示某一个内容是否跨多栏显示。这个CSS属性是作用在分栏布局的子元素上的。

column-span: none; /* 默认值 */
column-span: all;
  • none表示不横跨多栏,默认值。

  • all表示横跨所有垂直列。

例子:设置了column-span:all的“第4段”文字所在的<p>元素几乎贯穿了整个容器元素

3.column-fill 属性

column-fill 的作用是当内容分栏的时候平衡每一栏填充的内容。

  • balance是默认值。
  • auto属性值在Firefox中渲染正确,Chrome中需要固定高度才有效。
  • balance-all 没有浏览器支持。
column-fill: auto;
column-fill: balance; /* 默认值 */
column-fill: balance-all;/* 没有浏览器支持 */

6.1.4 分栏布局实现两端对齐布局

分栏布局非常适合实现单行的两端对齐布局效果

不需要改变元素的display属性,也不需要定位,只需要设置好column-count属性的值,然后使用column-gap属性设置想要的间隙就好了

demo: https://demo.cssworld.cn/new/6/1-6.php

6.1.5 break-inside 属性与元素断点位置的控制

break-inside属性可以定义页面打印、分栏布局发生中断时元素的表现形式。如果没有发生中断,则忽略该属性

break-inside: auto;
break-inside: avoid; /* 表示元素不能中断 */

demo: https://demo.cssworld.cn/new/6/1-7.php

6.1.6 box-decoration-break 属性与元素断点装饰的控制

chrome 兼容性差。

posted @ 2022-02-11 22:34  【唐】三三  阅读(545)  评论(0编辑  收藏  举报