Skip to content

使用css3 column多列布局实现瀑布流效果

查看示例代码

CSS3多列布局(Multi-column)

多列布局(Multi-column)

多列布局就是将文本内容设计成像报纸那样的多列布局。或者说在之前我们通过js或者JQuery才能实现的瀑布流,在CSS3中我们可以直接通过CSS就可以实现,虽然有兼容性上面的问题。。

兼容性

IE10+、FireFox16+、Chrome26+、Safari6.1+、Opera12.1

CSS3多列布局的属性

属性说明
column-count指定元素应该分为几列
column-fill指定如何填充每个列
column-gap指定列与列之间的间隙
column-rule所有 column-rule-* 属性的简写形式
column-rule-color指定列与列之间边框的颜色
column-rule-style指定列与列之间边框的样式
column-rule-width指定列与列之间边框的宽度
column-span指定元素应该横跨多少列
column-width指定列的宽度
columnscolumn-width 与 column-count 属性的简写属性

columns 设置对象的列数个每列的宽度

设置或检索对象的列数和每列的宽度。

语法:

css
columns: <'column-width'> || <'columns-count'>;

参数说明:

(1)第一个参数指每列的宽度

(2)第二个参数指列数。可写两个,也可写一个。

两个参数优先考虑列数(在放的下的情况下)。若是宽度不够(列数*设置的宽度>容器的宽度),将会自动减小一列,并自动加宽段落的宽度,使之达到容器的宽度。中间自动生成合适的间距。

column-width 设置列宽

语法:

css
columns-width:<length> | auto默认;

: 用长度值来定义列宽,不允许负值;auto:根据列数自定分配宽度。

虽说设置了列宽,但还是会根据列数和容器宽度来自动分配宽度。

PS:每列中的空隙为14像素。

column-count 设置列数

设置或检索对象的列数。

语法:

css
column-count:<integer> | auto;

参数说明:: 用整数值来定义列数,不允许负值;auto:根据列宽自定分配宽度。

column-gap 设置列之间的间隙

设置或检索对象的列与列之间的间隙。

语法:

css
column-gap:<length> | normal;

参数说明:用长度值来定义列与列之间的间隙(不是字与字间的距离,而是段落和段落间的距离),不允许负值;normal:与字体大小相同。normal间隙取决于字体大小。和字体大小相等。

column-rule 设置列与列之间的边框

语法:

css
column-rule:<column-rule-width> || <column-rule-style> || <column-rule-color>

参数说明

● column-rule-width 边框的厚度

● column-rule-style 边框的样式

● column-rule-color 边框的颜色

PS:特别注意,如果列与列之间的间隙 < 边框的宽度,这就会出现列盖在边框上的情况。

column-rule-width

设置或检索对象的列与列之间的边框厚度。

语法:

css
column-rule-width:<length> | thin | medium | thick;

参数说明

● length:用长度值来定义边框的厚度,不允许负值;

● medium:定义默认厚度的边框;

● thin:定义比默认厚度细的边框;

● thick:定义比默认厚度粗的边框。

column-rule-style 设置边框的样式

设置或检索对象的列与列之间的边框样式。

语法

css
column-rule-style:none | hidden | dotted | dashed | solid | double | groove | ridge | inset | outset;

参数说明

● none:无轮廓;

● hidden:隐藏边框;

● dotted:点状轮廓;

● dashed:虚线轮廓;

● solid:实线轮廓;

● double:双线轮廓;

● groove:3D凹槽轮廓;

● ridge:3D凸槽轮廓;

● inset:3D凹边轮廓;

● outset:3D凸边轮廓。

注意:如果是有两条线的轮廓,width将会是包括了两条线的距离。

column-rule-color 设置边框颜色

设置或检索对象的列与列之间的边框颜色。

语法:

css
column-rule-color:<color>;

参数说明:指定颜色。没有宽度没有样式,颜色将会失效。默认黑色。

column-span 设置元素跨所有列

设置或检索对象元素是否横跨所有列。

语法:

css
column-span:none | all;

参数说明:none:不跨列;all:横跨所有列。

不是像其他column属性用在容器当中,而是用在容器里的子元素当中。

column-fill 设置列与列的高度统一(目前主流浏览器都不兼容)

设置或检索对象所有列的高度是否统一。

语法:

css
column-fill: auto默认 | balance;

参数说明:auto:列高度自适应内容;balance:所有列的高度以其中最高的一列统一。

主流浏览器都不兼容此属性。

column-break 设置换行

● column-break-before 设置指定对象前是否换行。

● column-break-after 设置指定对象后是否换行。

● column-break-inside 设置对象内部是否换行

column-break-before

设置或检索对象之前是否断行。

语法:

css
column-break-before:auto | always | avoid;

参数说明:auto:既不强迫也不禁止在元素之前断行并产生新列;always:总是在元素之前断行并产生新列;avoid:避免在元素之前断行并产生新列。

column-break-after

设置或检索对象之后是否断行。

语法:

css
column-break-after:auto | always | avoid;

参数说明:auto:既不强迫也不禁止在元素之后断行并产生新列;always:总是在元素之后断行并产生新列;avoid:避免在元素之后断行并产生新列。

column-break-inside属性

设置或检索对象内部是否断行。

语法:

css
column-break-inside:auto默认 | avoid

示例代码

vue
<template>
  <div class="masonry-container">
    <div class="masonry-brick" v-for="(item, index) in items" :key="index">
      <div class="content">
        <img :src="item.img" alt=""/>
        {{ item.text }}
      </div>
    </div>
  </div>
</template>

<script>
export default {
  name: '瀑布流',
  data() {
    return {
      items: [
        { text: 'Item 1', img: 'https://www.hezhiwenda.info/vite/assets/9abea6958c4044d49a27dd627d2eade6.jpg' },
        { text: 'Item 2', img: 'https://www.hezhiwenda.info/vite/assets/2024-02-24%20130848.m10r45IQ.jpg' },
        { text: 'Item 3', img: 'https://www.hezhiwenda.info/vite/assets/2024-02-24%20131143.DRM0MOWY.jpg' },
        { text: 'Item 4', img: 'https://www.hezhiwenda.info/vite/assets/2024-02-24%20131628.DMfPZkgc.jpg' },
        { text: 'Item 5', img: 'https://www.hezhiwenda.info/vite/assets/2024-02-24%20134053.DDQCnaPT.jpg' },
        // ... 更多items
      ]
    };
  }
};
</script>

<style scoped>
.masonry-container {
    column-count: 3; /* 根据需要调整列数 */
    column-gap: 6px; /* 列与列之间的间隙 */
    width: 100%; /* 容器宽度 */
}
.masonry-container .content {
    break-inside: avoid; /* 防止元素被分割到不同列 */
    margin: 0 0 6px; /* 元素之间的垂直间隙 */
}
.masonry-container .content img {
    width: 100%; /* 图片宽度自适应容器宽度 */
    height: auto; /* 图片高度自适应 */
}
</style>

粤ICP备20009776号