css如何制作瀑布流

什么是瀑布流?

‌**瀑布流是一种网站页面布局方式,视觉表现为宽度相等、高度不定的元素组成的参差不齐的多栏布局。**‌ 随着页面向下滚动,新的元素会附加到最短的一列,不断向下加载‌。

瀑布流的特点包括:

  • 参差不齐的排列方式‌:元素的高度各不相同,形成一种动态的视觉效果。

  • 流式布局的扩展性‌:用户可以不断向下浏览,加载更多内容。

  • 适用于图片为主的网站 ‌:常见于一些图片、新闻、博客等内容的展示,有效利用空间,提高用户体验‌

    纯css写法

    复制代码
    .waterfall {
        /* 分为3列 */
        column-count: 3;
        /* 列之间的间隙 */
        column-gap: 1em;
        /* 清除默认的内边距 */
        padding: 0;
    }
     
    .item {
        /* 设置背景、边框、边距等样式 */
        background-color: #f4f4f4;
        border: 1px solid #ddd;
        margin-bottom: 1em;
        padding: 1em;
        /* 确保内容不会被拆分到两列中 */
        break-inside: avoid;
    }

    在这个例子中,.waterfall 类定义了瀑布流容器的样式,其中 column-count 属性用于设置列数,column-gap 属性用于设置列之间的间隙。.item 类则定义了每个项目的样式。

    注意,虽然 CSS3 的列布局为创建瀑布流布局提供了一种简单的方法,但它可能不适合所有情况。例如,对数据进行排序的话,这种的排序顺序是竖着的,如果你需要更复杂的布局控制,或者需要在不同屏幕大小下有不同的列数,那么可能需要使用 JavaScript 或更复杂的 CSS 技术。

    此外,break-inside: avoid; 属性用于确保每个项目的内容不会被拆分到两列中,这有助于保持瀑布流布局的视觉一致性。但是,这个属性可能在一些旧的或不支持的浏览器中不起作用。

制作瀑布流布局可以通过 CSS Flexbox、Grid 或使用 JavaScript 来实现。以下是使用 CSS Grid 和 Flexbox 的示例:

示例 1:使用 CSS Grid

复制代码
<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="UTF-8">
		<meta name="viewport" content="width=device-width, initial-scale=1.0">
		<!-- 使页面在移动设备上响应式显示 -->
		<title>瀑布流布局 - CSS Grid</title>
		<style>
			body {
				margin: 0;
				padding: 0;
				font-family: Arial, sans-serif;
				/*设置字体*/
				background-color: #f4f4f4;
			}

			.grid-container {
				display: grid;
				/* 使用CSS Grid布局 */
				grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
				/* 自动填充列,最小宽度200px */
				gap: 16px;
				/* 设置网格项之间的间隙为16px */
				padding: 16px;
				/* 为容器添加内边距 */
			}

			.grid-item {
				background-color: white;
				/* 设置网格项的背景色 */
				border: 1px solid #ddd;
				/* 设置边框样式 */
				border-radius: 4px;
				/* 设置圆角 */
				overflow: hidden;
				/* 隐藏溢出的内容 */
				box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
				/* 添加阴影效果 */
				padding: 10px;
				/* 为网格项添加内边距 */
				text-align: center;
				/* 文本居中对齐 */
			}

			img {
				max-width: 100%;
				/* 图片最大宽度为100%,以适应容器 */
				border-radius: 4px;
				/* 图片添加圆角 */
			}
		</style>
	</head>
	<body>

		<div class="grid-container"> <!-- 网格容器 -->
			<div class="grid-item"><img src="https://via.placeholder.com/200x150" alt="Placeholder 1"></div>
			<div class="grid-item"><img src="https://via.placeholder.com/200x300" alt="Placeholder 2"></div>
			<div class="grid-item"><img src="https://via.placeholder.com/200x200" alt="Placeholder 3"></div>
			<div class="grid-item"><img src="https://via.placeholder.com/200x250" alt="Placeholder 4"></div>
			<div class="grid-item"><img src="https://via.placeholder.com/200x100" alt="Placeholder 5"></div>
			<div class="grid-item"><img src="https://via.placeholder.com/200x350" alt="Placeholder 6"></div>
		</div>

	</body>
</html>

示例 2:使用 CSS Flexbox

复制代码
<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="UTF-8">
		<meta name="viewport" content="width=device-width, initial-scale=1.0"> <!-- 使页面在移动设备上响应式显示 -->
		<title>瀑布流布局 - Flexbox</title>
		<style>
			body {
				margin: 0;
				padding: 0;
				font-family: Arial, sans-serif;
				/* 设置字体为Arial或无衬线体 */
				background-color: #f4f4f4;
			}

			.flex-container {
				display: flex;
				/* 使用Flexbox布局 */
				flex-wrap: wrap;
				/* 允许子元素换行 */
				gap: 16px;
				/* 设置子元素之间的间隙为16px */
				padding: 16px;
				/* 为容器添加内边距 */
			}

			.flex-item {
				background-color: white;
				/* 设置每个子元素的背景色为白色 */
				border: 1px solid #ddd;
				/* 设置边框样式为浅灰色 */
				border-radius: 4px;
				/* 设置圆角半径为4px */
				overflow: hidden;
				/* 隐藏溢出的内容 */
				box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
				/* 添加阴影效果 */
				flex: 1 1 200px;
				/* 设置子元素的生长、缩小以及基础宽度为200px */
				text-align: center;
			}

			img {
				max-width: 100%;
				/* 图片最大宽度为100%,以适应其容器 */
				border-radius: 4px;
				/* 图片添加圆角 */
			}
		</style>
	</head>
	<body>

		<div class="flex-container"> <!-- 创建一个Flexbox容器 -->
			<div class="flex-item"><img src="https://via.placeholder.com/200x150" alt="Placeholder 1"></div>
			<!-- 第一项,包含一张占位符图片 -->
			<div class="flex-item"><img src="https://via.placeholder.com/200x300" alt="Placeholder 2"></div>
			<!-- 第二项,包含一张高度更大的占位符图片 -->
			<div class="flex-item"><img src="https://via.placeholder.com/200x200" alt="Placeholder 3"></div>
			<!-- 第三项,包含一张正方形占位符图片 -->
			<div class="flex-item"><img src="https://via.placeholder.com/200x250" alt="Placeholder 4"></div>
			<!-- 第四项,包含一张长方形占位符图片 -->
			<div class="flex-item"><img src="https://via.placeholder.com/200x100" alt="Placeholder 5"></div>
			<!-- 第五项,包含一张较矮的占位符图片 -->
			<div class="flex-item"><img src="https://via.placeholder.com/200x350" alt="Placeholder 6"></div>
			<!-- 第六项,包含一张较高的占位符图片 -->
		</div>

	</body>
</html>

说明

  • CSS Grid :利用 grid-template-columns 设置自动填充的列,并定义最小宽度。使用 gap 进行间距设置。
  • Flexbox :使用 flex-wrap: wrap 使元素在容器中换行,使用 flex: 1 1 200px 设置基础宽度和自适应性。

你可以根据需要调整项的大小和数量,以上代码能够适应不同屏幕尺寸,实现简单的瀑布流效果。

相关推荐
Nan_Shu_61416 分钟前
学习: Threejs (2)
前端·javascript·学习
G_G#24 分钟前
纯前端js插件实现同一浏览器控制只允许打开一个标签,处理session变更问题
前端·javascript·浏览器标签页通信·只允许一个标签页
@大迁世界40 分钟前
TypeScript 的本质并非类型,而是信任
开发语言·前端·javascript·typescript·ecmascript
GIS之路1 小时前
GDAL 实现矢量裁剪
前端·python·信息可视化
是一个Bug1 小时前
后端开发者视角的前端开发面试题清单(50道)
前端
Amumu121381 小时前
React面向组件编程
开发语言·前端·javascript
持续升级打怪中1 小时前
Vue3 中虚拟滚动与分页加载的实现原理与实践
前端·性能优化
GIS之路1 小时前
GDAL 实现矢量合并
前端
hxjhnct1 小时前
React useContext的缺陷
前端·react.js·前端框架
前端 贾公子2 小时前
从入门到实践:前端 Monorepo 工程化实战(4)
前端