当前位置:首页 > 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
分享给朋友:

相关文章

vue实现js休眠

vue实现js休眠

Vue 中实现 JavaScript 休眠 在 Vue 中实现 JavaScript 休眠通常需要使用异步方式,以避免阻塞主线程。以下是几种常见方法: 使用 setTimeout 和 Promis…

js实现复制

js实现复制

使用document.execCommand方法 在较旧的浏览器中,可以使用document.execCommand('copy')实现复制功能。创建一个临时的textarea或input元素,将需要…

js实现倒计时

js实现倒计时

使用 setInterval 实现倒计时 通过 setInterval 定时器每秒更新剩余时间,适用于简单倒计时场景。 function countdown(seconds, callbac…

js实现图片放大缩小

js实现图片放大缩小

实现图片放大缩小的基础方法 使用CSS的transform: scale()属性可以快速实现图片的放大缩小效果。通过JavaScript动态修改该属性值: const img = document.…

h5实现瀑布流

h5实现瀑布流

实现瀑布流布局的基本思路 瀑布流布局的核心在于动态计算每个元素的位置,使元素能够根据容器宽度和高度自动排列。通过CSS和JavaScript结合实现。 使用CSS设置容器和子元素的基本样式,确保子…

js实现百叶窗

js实现百叶窗

使用CSS和JavaScript实现百叶窗效果 通过CSS动画和JavaScript事件监听可以实现百叶窗效果。核心思路是将内容区域分割为多个条状元素,通过控制它们的展开/折叠状态来模拟百叶窗。…