当前位置:首页 > JavaScript

js实现瀑布流

2026-01-13 14:24:18JavaScript

实现瀑布流布局

瀑布流布局是一种常见的网页布局方式,常用于图片展示、商品列表等场景。以下是使用 JavaScript 实现瀑布流布局的几种方法。

纯 JavaScript 实现

通过计算元素的位置和高度动态排列元素。

function waterfall(container, box, columnCount) {
  const containerEl = document.querySelector(container);
  const boxEls = document.querySelectorAll(box);
  const containerWidth = containerEl.offsetWidth;
  const boxWidth = boxEls[0].offsetWidth;
  const gap = (containerWidth - boxWidth * columnCount) / (columnCount - 1);

  const heightArr = [];
  boxEls.forEach((el, index) => {
    if (index < columnCount) {
      el.style.position = 'absolute';
      el.style.left = index * (boxWidth + gap) + 'px';
      el.style.top = '0';
      heightArr.push(el.offsetHeight);
    } else {
      const minHeight = Math.min(...heightArr);
      const minIndex = heightArr.indexOf(minHeight);
      el.style.position = 'absolute';
      el.style.left = minIndex * (boxWidth + gap) + 'px';
      el.style.top = minHeight + gap + 'px';
      heightArr[minIndex] = minHeight + gap + el.offsetHeight;
    }
  });
}

window.onload = function() {
  waterfall('.container', '.box', 3);
};

使用 CSS Grid 和 JavaScript 结合

CSS Grid 提供更灵活的布局方式,结合 JavaScript 动态计算高度。

function waterfallGrid(container, box) {
  const containerEl = document.querySelector(container);
  const boxEls = document.querySelectorAll(box);
  const columnCount = 3;
  containerEl.style.display = 'grid';
  containerEl.style.gridTemplateColumns = `repeat(${columnCount}, 1fr)`;
  containerEl.style.gridGap = '10px';

  boxEls.forEach(el => {
    el.style.marginBottom = '10px';
  });
}

使用 Flexbox 和 JavaScript 结合

Flexbox 可以简化布局逻辑,但需要额外处理高度。

function waterfallFlex(container, box) {
  const containerEl = document.querySelector(container);
  const boxEls = document.querySelectorAll(box);
  containerEl.style.display = 'flex';
  containerEl.style.flexWrap = 'wrap';
  containerEl.style.justifyContent = 'space-between';

  boxEls.forEach(el => {
    el.style.width = '30%';
    el.style.marginBottom = '20px';
  });
}

使用现成的库(如 Masonry)

Masonry 是一个流行的瀑布流布局库,简化了实现过程。

// 引入 Masonry 库后使用
const masonry = new Masonry('.container', {
  itemSelector: '.box',
  columnWidth: 200,
  gutter: 10
});

响应式瀑布流布局

通过监听窗口大小变化动态调整布局。

function responsiveWaterfall() {
  const width = window.innerWidth;
  const columnCount = width < 768 ? 2 : width < 1024 ? 3 : 4;
  waterfall('.container', '.box', columnCount);
}

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

动态加载内容

结合 AJAX 或 Fetch API 动态加载内容并更新瀑布流。

function loadMoreContent() {
  fetch('api/content')
    .then(response => response.json())
    .then(data => {
      const container = document.querySelector('.container');
      data.forEach(item => {
        const box = document.createElement('div');
        box.className = 'box';
        box.innerHTML = `<img src="${item.image}" alt="${item.title}">`;
        container.appendChild(box);
      });
      waterfall('.container', '.box', 3);
    });
}

以上方法可以根据实际需求选择适合的实现方式。纯 JavaScript 实现灵活性高,但代码量较大;使用 CSS Grid 或 Flexbox 简化了布局逻辑;现成的库如 Masonry 提供了更多功能和优化。

js实现瀑布流

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

相关文章

js实现轮播图

js实现轮播图

基础轮播图实现 使用HTML、CSS和JavaScript实现一个简单的自动轮播图。HTML结构包含一个容器和多个图片项。 <div class="slider"> <div…

js实现倒计时

js实现倒计时

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

js实现图片预览

js实现图片预览

使用FileReader API实现图片预览 通过FileReader对象读取用户选择的图片文件并显示预览: const input = document.getElementById('image…

jquery.js

jquery.js

jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互等操作。以下是关于 jQuery.js 的核心信息和使用方法: 获取 j…

js实现换肤

js实现换肤

使用CSS变量实现换肤 通过CSS变量可以轻松实现主题切换功能。CSS变量在根元素中定义,通过JavaScript动态修改这些变量值。 :root { --primary-color: #34…