Tailwind CSS 瀑布流布局

对于瀑布流这种布局方式,相信很多小伙伴都接触过了,如下图所示。

瀑布流布局

很多人以为实现这种 “参差不齐” 的卡片排版必须计算高度或使用 JavaScript。实际上,现代浏览器支持的 CSS 多列布局(columns)已经能解决 90% 的瀑布流需求了。在 Tailwind CSS 中,我们只需要使用几个类名即可轻松实现。

Tailwind CSS 瀑布流语法

在 Tailwind CSS 中,实现瀑布流布局的核心逻辑在于:将容器划分为多列,并防止内部卡片被 “切断”。其中,我们需要配合使用以下 2 组类名:

1. 设置列数

  • columns-{count}:设置布局的列数。
  • 常用类名:columns-2、columns-3、md:columns-4 等。
  • gap-{size}:设置列与列之间的间距。

2. 防止卡片断开

  • break-inside-avoid:这是瀑布流卡片的 “必加项”。如果不加,当一个卡片正好位于列的底部时,它可能会被强行拆分成两半,一半在左边,一半在右边,视觉效果非常差。

Tailwind CSS 瀑布流示例

接下来,我们通过一个简单的例子来讲解一下如何使用 Tailwind CSS 来实现瀑布流布局。

示例:瀑布流布局

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title></title>
        <script src="https://unpkg.com/@tailwindcss/browser@4"></script>
    </head>
    <body class="p-8 bg-green-50 min-h-screen">
        <div class="max-w-6xl mx-auto">
            <h2 class="mb-10 text-3xl font-black text-center text-emerald-900">绿叶精品课</h2>
            
            <div class="columns-1 md:columns-2 lg:columns-3 gap-6">
                
                <div class="break-inside-avoid mb-6 bg-white p-4 rounded-3xl shadow-sm border border-emerald-100">
                    <div class="w-full h-64 bg-emerald-100 rounded-2xl mb-4"></div>
                    <h3 class="font-bold text-emerald-900">Vue 快速上手</h3>
                    <p class="mt-2 text-sm text-emerald-800/60">Vue 全家桶(Vite、Vue Router、Pina 等)</p>
                </div>
                
                <div class="break-inside-avoid mb-6 bg-white p-4 rounded-3xl shadow-sm border border-emerald-100">
                    <div class="w-full h-32 bg-green-200 rounded-2xl mb-4"></div>
                    <h3 class="font-bold text-emerald-900">SQL 快速上手</h3>
                    <p class="mt-2 text-sm text-emerald-800/60">“保姆级” SQL 入门教程</p>
                </div>
                
                <div class="break-inside-avoid mb-6 bg-white p-4 rounded-3xl shadow-sm border border-emerald-100">
                    <div class="w-full h-48 bg-teal-100 rounded-2xl mb-4"></div>
                    <h3 class="font-bold text-emerald-900">Python 十大项目</h3>
                    <p class="mt-2 text-sm text-emerald-800/60">采用 10 个当下最热门项目来讲解</p>
                </div>
                
                <div class="break-inside-avoid mb-6 bg-white p-4 rounded-3xl shadow-sm border border-emerald-100">
                    <div class="w-full h-72 bg-emerald-50 rounded-2xl mb-4"></div>
                    <h3 class="font-bold text-emerald-900">Tailwind CSS 实战</h3>
                    <p class="mt-2 text-sm text-emerald-800/60">采用 Tailwind CSS v4 版本讲解</p>
                </div>
                
            </div>
        </div>
    </body>
</html>

页面效果如下图所示。

Tailwind CSS 实现瀑布流布局

分析:

在这个例子中,我们实现纯 CSS 瀑布流的秘诀在于:

  • columns 系列类名:我们在容器上设置了 columns-1 md:columns-2 lg:columns-3。这不仅决定了列数,还能自动处理内容的流转。注意,这种布局的排版顺序是 “从上到下、再从左到右”。
  • break-inside-avoid:在每一个内部卡片(div)上,我们都加上了这个类名。它用于确保卡片作为一个整体被渲染,而绝对不会出现内容被截断跨列显示的 Bug。
  • 间距处理:我们配合使用了容器的 gap-6(处理列间距)和在每个卡片上添加 mb-6(处理行间距),使得网格看起来更加匀称。注意:在多列布局中不要在父容器上使用 space-y-*,否则会导致各列顶部无法齐平。

常见问题

1. 瀑布流的排序顺序是怎样的?

这是一个需要注意的地方。CSS columns 布局的填充顺序是 “垂直方向” 的:它会先填满第 1 列,再去填第 2 列。

也就是说,如果你的数据是按照时间排序的,那么最新的内容会出现在第 1 列的顶部,次新的在第 1 列下方。这与 JavaScript 瀑布流(通常按高度插入)略有不同。

2. 为什么我的卡片背景色在手机端不一致呢?

这通常是因为没有正确设置 break-inside-avoid。如果不设置这个属性,浏览器为了填满列的高度,可能会把卡片切开,导致背景色和阴影看起来断开了。

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号