多列布局(通常称为multicol)是一种规范,用于将内容布置到一组列框中,就像报纸中的列一样。本指南解释了规范如何与一些常见的用例示例一起使用。
关键概念和术语
Multicol与CSS中的任何其他布局方法不同,它将内容(包括所有后代元素)分段为列。这与在使用CSS Paged Media时将内容分段为页面的方式相同,例如通过创建打印样式表。
规范定义的属性有:
- column-width
- column-count
- columns
- column-rule-color
- column-rule-style
- column-rule-width
- column-rule
- column-span
- column-fill column-gap
通过给一个元素添加 column-count 或 column-width,该元素变成了多列容器,或简称为 multicol 容器。这些列是都是匿名的盒子,在规范中描述为列盒子。
columns 定义
创建一个 multicol 容器必须使用至少一个 column-* 属性,这些就是 column-count 和 column-width。
column-count 属性
column-count 属性指定你想要显示内容的列的数量。浏览器会将正确分配的空间给每列并创建需要的列数。
在以下示例中,我们使用 column-count 属性在.container 元素上创建三列 。.container 元素的内容包括其子元素都会分裂成三列。
.container {
column-count: 3;
}
<div class="container">
<p>Veggies es bonus vobis, proinde vos postulo essum magis kohlrabi welsh onion daikon amaranth tatsoi tomatillo melon azuki bean garlic.</p>
<p>Gumbo beet greens corn soko endive gumbo gourd. Parsley shallot courgette tatsoi pea sprouts fava bean collard greens dandelion okra wakame tomato. Dandelion cucumber earthnut pea peanut soko zucchini.</p>
<p>Turnip greens yarrow ricebean rutabaga endive cauliflower sea lettuce kohlrabi amaranth water spinach avocado daikon napa cabbage asparagus winter purslane kale. Celery potato scallion desert raisin horseradish spinach carrot soko.</p>
</div>
在上面的例子中内容被段落 p 标签的默认样式包裹。因此,每段都有一个间距。你可以看到这个间距引起第一行文本被推了下来。这是因为 multicol 容器创建了一个新的块格式化上下文(BFC),这意味着子元素的间距不会与父容器的间距互相重叠。
column-width 属性
column-width 属性用于给每列设置一个最佳宽度。如果你声明 column-width,浏览器将算出 该宽度在multicol 容器能分多少列,并且把额外的的空间填充到这些列当中。因此,应将列宽视为最小宽度,因为由于额外的空间,列可能而更宽。
当单个列的可用宽度小于 column-width 的值的情况下,列的宽度会缩小为小于所声明的列宽。
在以下示例中,我们使用 column-width 属性值为200 px。但最终为了适配容器,列的宽度却大于200像素,额外的空间被平均分配了。
.container {
column-width: 200px;
}
<div class="container">
<p>Veggies es bonus vobis, proinde vos postulo essum magis kohlrabi welsh onion daikon amaranth tatsoi tomatillo melon azuki bean garlic.</p>
<p>Gumbo beet greens corn soko endive gumbo gourd. Parsley shallot courgette tatsoi pea sprouts fava bean collard greens dandelion okra wakame tomato. Dandelion cucumber earthnut pea peanut soko zucchini.</p>
<p>Turnip greens yarrow ricebean rutabaga endive cauliflower sea lettuce kohlrabi amaranth water spinach avocado daikon napa cabbage asparagus winter purslane kale. Celery potato scallion desert raisin horseradish spinach carrot soko.</p>
</div>
同时使用 column-count 和 column-width
如果在 multicol 容器上指定这两个属性,则 column-count 将作为最大列数。因此,将按column-width 的值计算,直到达到 column-count 定义的列数。在此之后,即使有足够的空间容纳指定列宽大小的列,也不再绘制,并且额外空间在现有列之间均匀分布。
同时使用这两个属性时,可能会获得的列数少于 column-count 数值中指定的列数。
在下一个例子中,我们使用 column-width 的值为 200px,column-count 的值为 2。即使有超过两列的空间,我们也得到两个。如果没有足够的空间容纳两列 200px,我们得到一个。
.container {
column-count: 2;
column-width: 200px;
}
<div class="container">
<p>Veggies es bonus vobis, proinde vos postulo essum magis kohlrabi welsh onion daikon amaranth tatsoi tomatillo melon azuki bean garlic.</p>
<p>Gumbo beet greens corn soko endive gumbo gourd. Parsley shallot courgette tatsoi pea sprouts fava bean collard greens dandelion okra wakame tomato. Dandelion cucumber earthnut pea peanut soko zucchini.</p>
<p>Turnip greens yarrow ricebean rutabaga endive cauliflower sea lettuce kohlrabi amaranth water spinach avocado daikon napa cabbage asparagus winter purslane kale. Celery potato scallion desert raisin horseradish spinach carrot soko. .</p>
</div>
columns 缩写
您可以使用 columns 缩写来设置 column-count 和 column-width。如果设置长度单位,这将用于 column-width,设置一个整数,它将用于 column-count。您可以设置两者,用空格分隔这两个值。
此 CSS 结果与示例1相同,column-count 设置为3。
.container {
columns: 3;
}
此 CSS 结果与示例2相同,column-width 为200px。
.container {
columns: 200px;
}
此 CSS 结果与示例3相同,同时设置 column-count 和 column-width。
.container {
columns: 2 200px;
}