当前位置:首页 > 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实现跳转

使用 window.location 跳转 通过修改 window.location.href 或直接使用 window.location 实现页面跳转,适用于普通跳转或带参数的 URL。 // 方…

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 使用JavaScript实现拖拽功能需要监听鼠标事件,包括mousedown、mousemove和mouseup。以下是实现的基本逻辑: const draggableEleme…

js实现vue路由

js实现vue路由

Vue路由基础实现 使用Vue Router实现前端路由需要先安装并配置路由库。Vue Router是Vue.js官方的路由管理器。 安装Vue Router: npm install vue…

js实现vue

js实现vue

Vue.js 简介 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。其核心库专注于视图层,易于与其他库或现有项目整合。 实现 Vue.js 的基本步骤 安装 Vue.…

js实现跳转

js实现跳转

使用 window.location 跳转 通过修改 window.location.href 实现页面跳转,这是最常用的方法。 window.location.href = 'https://…

js实现

js实现

实现 JavaScript 功能的方法 在 JavaScript 中实现特定功能通常涉及多个步骤。以下是常见的实现方法: 基础语法和变量声明 使用 let 或 const 声明变量: let…