当前位置:首页 > JavaScript

js实现瀑布流

2026-02-28 18:50:32JavaScript

实现瀑布流布局

瀑布流布局是一种常见的网页布局方式,适用于图片、卡片等内容的展示。通过 JavaScript 实现瀑布流布局,可以动态计算元素的位置,确保每一列的高度均衡。

基础实现步骤

HTML 结构

<div class="waterfall-container">
  <div class="waterfall-item">Item 1</div>
  <div class="waterfall-item">Item 2</div>
  <div class="waterfall-item">Item 3</div>
  <!-- 更多 item -->
</div>

CSS 样式

js实现瀑布流

.waterfall-container {
  position: relative;
  width: 100%;
}

.waterfall-item {
  position: absolute;
  width: 200px; /* 固定宽度 */
  margin-bottom: 20px; /* 间距 */
  box-shadow: 0 0 5px rgba(0, 0, 0, 0.1);
}

JavaScript 逻辑

function initWaterfall() {
  const container = document.querySelector('.waterfall-container');
  const items = document.querySelectorAll('.waterfall-item');
  const columnCount = 3; // 列数
  const gap = 20; // 间距
  const itemWidth = 200; // 与 CSS 中的宽度一致
  const containerWidth = container.offsetWidth;

  // 计算列宽(考虑间距)
  const columnWidth = (containerWidth - (gap * (columnCount - 1))) / columnCount;

  // 初始化列高数组
  const columnHeights = new Array(columnCount).fill(0);

  // 遍历每个 item,计算位置
  items.forEach(item => {
    // 找到当前高度最小的列
    const minHeight = Math.min(...columnHeights);
    const columnIndex = columnHeights.indexOf(minHeight);

    // 设置 item 的位置
    const left = columnIndex * (columnWidth + gap);
    const top = minHeight;

    item.style.width = `${columnWidth}px`;
    item.style.left = `${left}px`;
    item.style.top = `${top}px`;

    // 更新列高
    columnHeights[columnIndex] += item.offsetHeight + gap;
  });

  // 设置容器高度
  container.style.height = `${Math.max(...columnHeights)}px`;
}

// 初始化瀑布流
window.addEventListener('load', initWaterfall);
window.addEventListener('resize', initWaterfall);

动态加载更多内容

如果需要滚动加载更多内容,可以通过监听滚动事件动态添加新元素并重新计算布局。

js实现瀑布流

let isLoading = false;

function loadMoreItems() {
  if (isLoading) return;
  isLoading = true;

  // 模拟异步加载数据
  setTimeout(() => {
    const container = document.querySelector('.waterfall-container');
    const fragment = document.createDocumentFragment();

    // 添加新元素(示例)
    for (let i = 0; i < 10; i++) {
      const item = document.createElement('div');
      item.className = 'waterfall-item';
      item.textContent = `New Item ${i + 1}`;
      fragment.appendChild(item);
    }

    container.appendChild(fragment);
    initWaterfall(); // 重新计算布局
    isLoading = false;
  }, 1000);
}

// 监听滚动事件
window.addEventListener('scroll', () => {
  const scrollTop = document.documentElement.scrollTop;
  const windowHeight = window.innerHeight;
  const documentHeight = document.documentElement.scrollHeight;

  // 滚动到底部时加载更多
  if (scrollTop + windowHeight >= documentHeight - 100) {
    loadMoreItems();
  }
});

使用 CSS Grid 简化实现

如果不需要支持过旧的浏览器,可以使用 CSS Grid 简化瀑布流布局的实现。

CSS 样式

.waterfall-container {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
  grid-gap: 20px;
  grid-auto-flow: dense;
}

.waterfall-item {
  break-inside: avoid; /* 避免内容断裂 */
}

JavaScript 调整

function adjustGridLayout() {
  const container = document.querySelector('.waterfall-container');
  const items = document.querySelectorAll('.waterfall-item');

  items.forEach(item => {
    const rowHeight = Math.ceil(item.offsetHeight / 20) * 20;
    item.style.gridRowEnd = `span ${rowHeight}`;
  });
}

window.addEventListener('load', adjustGridLayout);
window.addEventListener('resize', adjustGridLayout);

注意事项

  • 性能优化:对于大量元素,使用 DocumentFragment 减少 DOM 操作次数。
  • 图片加载:如果内容包含图片,需监听图片加载完成后再计算布局,避免高度计算错误。
  • 响应式设计:动态调整列数以适配不同屏幕尺寸。

以上方法提供了基础的瀑布流实现,可根据实际需求进一步扩展功能。

标签: 瀑布js
分享给朋友:

相关文章

js实现全选

js实现全选

实现全选功能的方法 在JavaScript中实现全选功能通常涉及监听全选复选框的点击事件,并根据其状态控制其他复选框的选中状态。以下是几种常见的实现方式: 基础DOM操作实现 通过获取所有目标复选框…

js 实现vue

js 实现vue

Vue.js 的基本实现 在 JavaScript 中实现 Vue.js 的核心功能,可以通过数据绑定、响应式系统和虚拟 DOM 来实现。以下是实现 Vue.js 核心功能的简化版本。 数据响应式系…

js实现瀑布流

js实现瀑布流

实现瀑布流布局 瀑布流布局是一种常见的网页布局方式,常用于图片展示、商品列表等场景。以下是使用 JavaScript 实现瀑布流布局的几种方法。 纯 JavaScript 实现 通过计算元素的位置和…

js实现授权

js实现授权

授权流程设计 授权流程通常涉及前端与后端的交互,常见方案包括OAuth2.0、JWT等。以JWT为例的典型流程: 用户提交凭证(如用户名密码)到认证服务 服务端验证通过后生成包含用户信息的JWT令牌…

js实现投球

js实现投球

实现投球动画的基本思路 使用JavaScript和CSS动画结合的方式模拟投球效果。核心是通过改变元素的位置、旋转和缩放属性,配合定时器或CSS过渡实现平滑动画。 创建基础HTML结构 <…

js怎么实现异步

js怎么实现异步

异步实现方法 JavaScript中实现异步操作主要通过以下几种方式: Promise Promise是ES6引入的异步解决方案,用于处理异步操作的成功或失败状态。 const promise =…