首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

js原生代码写瀑布流

瀑布流布局是一种流行的网页布局方式,它允许页面元素(通常是图片或卡片)按照不同的高度排列,形成类似瀑布的视觉效果。这种布局方式在展示大量内容时非常有效,因为它可以充分利用屏幕空间,提高用户的浏览体验。

基础概念

瀑布流布局的核心思想是将页面分成多列,然后将内容动态地填充到这些列中,使得每列的高度尽可能接近,从而形成瀑布状的视觉效果。

优势

  1. 空间利用率高:能够更好地利用屏幕空间,尤其是在移动设备上。
  2. 视觉效果好:自然流畅的布局给人以美观的感觉。
  3. 加载性能优化:可以实现按需加载,即当用户滚动到页面底部时再加载更多内容。

类型

  • 固定列数瀑布流:页面固定分为几列,内容填充到各列中。
  • 自适应列数瀑布流:根据屏幕宽度动态调整列数。

应用场景

  • 图片画廊:如摄影作品展示、商品列表等。
  • 新闻资讯:文章摘要的展示。
  • 社交媒体:用户动态、帖子等。

实现方法

以下是一个简单的JavaScript原生代码实现瀑布流布局的例子:

代码语言:txt
复制
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>瀑布流布局示例</title>
<style>
  .masonry {
    display: flex;
    flex-direction: column;
    flex-wrap: wrap;
    height: 100vh; /* 视口高度 */
  }
  .item {
    width: calc(25% - 10px); /* 假设四列布局,减去间距 */
    margin: 5px;
    background: #ccc;
    box-sizing: border-box;
  }
</style>
</head>
<body>
<div class="masonry" id="masonry">
  <!-- 内容将通过JavaScript动态添加到这里 -->
</div>

<script>
function createMasonryLayout(containerId, items) {
  const container = document.getElementById(containerId);
  let columns = [];
  let columnHeights = new Array(4).fill(0); // 假设四列布局

  items.forEach((item, index) => {
    const columnIndex = columnHeights.indexOf(Math.min(...columnHeights));
    const div = document.createElement('div');
    div.className = 'item';
    div.style.height = `${Math.floor(Math.random() * 200 + 100)}px`; // 随机高度
    div.textContent = `Item ${index + 1}`;
    container.appendChild(div);

    columns[columnIndex] = columns[columnIndex] || [];
    columns[columnIndex].push(div);
    columnHeights[columnIndex] += parseInt(div.style.height) + 10; // 加上间距
  });

  // 调整容器高度以适应最长的列
  container.style.height = `${Math.max(...columnHeights)}px`;
}

// 示例数据
const items = Array.from({ length: 20 }, (_, i) => ({ id: i }));
createMasonryLayout('masonry', items);
</script>
</body>
</html>

可能遇到的问题及解决方法

  1. 布局错乱:可能是由于CSS样式设置不当或JavaScript逻辑错误导致。检查元素的宽度和高度设置,确保它们正确应用。
  2. 性能问题:如果页面中有大量元素,可能会导致页面渲染缓慢。可以考虑使用虚拟滚动技术,只渲染可视区域内的元素。
  3. 响应式设计:在不同设备和屏幕尺寸上保持布局的一致性。使用媒体查询和flexbox等技术来实现响应式设计。

通过上述方法,你可以创建一个基本的瀑布流布局,并根据需要进行调整和优化。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

分享 1个原生 JS 瀑布流案例

瀑布流布局中的图片有一个核心特点 —— 等宽不定等高,瀑布流布局在国内网网站都有一定规模的使用,比如pinterest、花瓣网等等。那么接下来就基于这个特点开始瀑布流探索之旅。...10px; } 至此完成了瀑布流的基本布局,效果图如下: scroll、resize 事件监听的实现 实现了初始化函数 init 以后,下一步就要实现对 scroll 滚动事件进行监听,从而实现当滚到父节点的底部有源源不断的图片被加载出来的效果...联想到业务场景中瀑布流中下拉加载的图片一般都来自 Ajax 异步获取,那么加载的数据必然不能写死在库里,期望能实现如下调用(此处借鉴了 waterfall 的使用方式), const waterfall...waterfall.on("load", function () { // 此处进行 ajax 同步/异步添加图片 }) 观察调用方式,不难联想到使用发布/订阅模式来实现它,关于发布/订阅模式,之前在Node.js...Waterfall.prototype.constructor = Waterfall 继承方式的写法吸收了基于构造函数继承和基于原型链继承两种写法的优点,以及使用 Object.create 隔离了子类和父类,关于继承更多方面的细节,可以另写一篇文章了

1.9K20

原生 JS 实现一个瀑布流插件

瀑布流布局中的图片有一个核心特点 —— 等宽不定等高,瀑布流布局在国内外网站都有一定规模的使用,比如pinterest、花瓣网等等。那么接下来就基于这个特点开始瀑布流探索之旅。...; } 至此完成了瀑布流的基本布局,效果图如下: scroll、resize 事件监听的实现 实现了初始化函数 init 以后,下一步就要实现对 scroll 滚动事件进行监听,从而实现当滚到父节点的底部有源源不断的图片被加载出来的效果...联想到业务场景中瀑布流中下拉加载的图片一般都来自 Ajax 异步获取,那么加载的数据必然不能写死在库里,期望能实现如下调用(此处借鉴了 waterfall 的使用方式), const waterfall...waterfall.on("load", function () { // 此处进行 ajax 同步/异步添加图片 }) 观察调用方式,不难联想到使用发布/订阅模式来实现它,关于发布/订阅模式,之前在 Node.js...Waterfall.prototype.constructor = Waterfall 继承方式的写法吸收了基于构造函数继承和基于原型链继承两种写法的优点,以及使用 Object.create 隔离了子类和父类,关于继承更多方面的细节,可以另写一篇文章了

2.4K40
  • 原生javascript 实现瀑布流

    前言 刚用 jquery 实现了瀑布流效果。但是其实现方法,我并不满意,所以我还在思考,如何更加简单明了的实现瀑布流效果。...与其缠绕在 jquery 里,不如直接跳到 javascript 原生方法里。 让我们抛开 jquery,忘掉各种高级方法,用最原始的方法去实现 瀑布流效果。...javascript版本的瀑布流 代码原理已经写在注释里了。不再重复 /* 瀑布流原生 javascript 实现方法 之前已经用 jquery 方法已经实现了瀑布流。...于是,我真的实现了 *^0^* -------------- 无论是 jquery 还是原生 js for 循环都是一个非常重要的用法 只要打开脑洞,就会有更加异想天开的解决方法...但是,在原生JS中,我用默认最小值为无穷大,var _minH = +Infinity 然后拿数组中的数字来和这个无穷大进行对比,如果这个数字比无穷大小,则将_minH赋值为当前数组的值,然后再拿下一个数组中的数字来进行对比

    1.4K20

    分享:纯 css 瀑布流 和 js 瀑布流

    博客地址:https://ainyi.com/60 分享一次纯 css 瀑布流  和 js 瀑布流 纯 css 写瀑布流 1.multi-columns 方式: 通过 Multi-columns 相关的属性...看到这里,我们可以发现,使用纯 css 写瀑布流,每一块 item 都是从上往下排列,不能做到从左往右排列: ? 这样子若是动态加载图片的瀑布流,体验就会很不好 我们想要的是这样: ?...这样做只能通过 js 来写瀑布流 js 写瀑布流: html 结构与上面类似,这里我用图片来做示例: 1 2 瀑布流实现方式: css 的绝对定位方式:根据每张图片的位置设置 top 和 left 值: 1 //瀑布流效果 2 //这里有一个坑(已经修复): 3 //因为是动态加载远程图片,在未加载完全无法获取图片宽高...这实现了横向排列的瀑布流效果 欢迎浏览 GitHub:https://github.com/Krryxa 博客地址:https://ainyi.com/60

    8.9K40

    分享一次纯 css 瀑布流 和 js 瀑布流

    博客地址:https://ainyi.com/60 现在百度图片,360 图片搜索,都是以一种瀑布流的形式展示,那么接下来,分享一波纯 css 瀑布流 和 js 瀑布流 纯 css 写瀑布流 multi-columns...max-width: 500px) { .masonry { column-count: 1; /* two columns on larger phones */ } } 那么以上代码产生的效果是...) { .masonry { height: 1600px; } } 那么所产生的效果是: [0ledbff8sh.jpeg] 问题来了 看到这里,我们可以发现,使用纯 css 写瀑布流...要实现如上,只能通过 js 来写瀑布流 js 写瀑布流 html 结构与上面类似,但这里我用图片来做示例 ...瀑布流实现方式 css 的绝对定位方式:根据每张图片的位置设置 top 和 left 值 // 瀑布流效果 // 这里有一个坑(已经修复): // 因为是动态加载远程图片,在未加载完全无法获取图片宽高

    2.4K40

    多栏布局与JS实现瀑布流

    css3属性之多栏布局与JS实现瀑布流    背景:之前打算自己总结一下flex布局的知识点,发现自己无从下手,原因在何处:我反思了一下,其实原因很简单,使用的次数少,更多的时间使用了百分比,浮动和定位解决...有的时候甚至出现了这样的笔记: 我打算坚持写博客,不论自己总结有多么差劲,也要坚持写,哪怕几年后我看到以前的笔记,自己会偷偷笑出声。想想原来大一时的技术还是那样的稚嫩啊。...实现瀑布流  给自己安利一波吧,看到网上很多瀑布流的效果,哇,简直棒极了有没有;于是我迫不及待的打开V**,打开了pinterest的官网。...自己也梳理梳理逻辑:写js代码之前,一定要先搞清逻辑,再动手写代码> 我们都不陌生瀑布流是同宽的,但是高度不一,js主要的工作就是根据高度来进行布局, 1)当一行排满后,准备排第二行的时候,...梳理完逻辑,让我们动手写代码吧: html比较简单,这里图片我用了placehold的图片占位符,如果你没有很好的素材,这也许是个不错的选择 <div class="main

    3K90

    两行css代码实现瀑布流,html,css最简单的瀑布流实现方式且没有缺点!

    但可以一链代码解决 这个列表显示顺序是 左边 123右边456,不符合正常展示逻辑;然后可以使用js对数据进行预处理; 大致逻辑如下: const oldList = [1, 2, 3, 4, 5, 6...] 这样处理一下就可以 让列表展示顺序变为 左边 1, 3, 5, 7 右边 2, 4, 6 2019年1月12日 我用的chrome 版本 70.0.3538.102(正式版本) (64 位) 以上代码没有问题...moz-column-gap:40px; /* Firefox */ -webkit-column-gap:40px; /* Safari 和 Chrome */ column-gap:40px; 以此类推 html代码大致如下...实现方式如下: 一行里面两列,可以控制每列数量相等, 每列里面各自循环,下面伪代码 但是有个坑,如果左边都很高,右边比较矮,就会出现右边空很多的内容, 在找解决办法 下面的 指的是 css

    2K30

    用原生js写一个多动症的简历

    用原生js写一个"多动症"的简历 预览地址 源码地址 最近在知乎上看到@方应杭用vue写了一个会动的简历,觉得挺好玩的,研究一下其实现思路,决定试试用原生js来实现。...color: blue; background: red; } 项目搭建 在这个项目中我们 使用webpack2来完成项目的构建 使用yarn来处理依赖包的管理 使用es6的写法 使用部分原生...dom操作api standard.js(代码风格约束利器) 目录结构如下 最重要的几个模块分别是resumeEditor(简历编辑模块) 、 stylesEditor(简历样式编辑模块) 、 以及vQuery...(封装的dom操作模块) 最后app.js(入口模块)再将几个模块的功能结合起来完成整个项目。...,可读性差,代码呈横向发展趋势...伟大的程序员们开疆扩土发明了promise的解决方案。

    6.9K70

    【js】如何正确的写代码注释?

    */ function formTime(time,isyear){ } 简单的变量声明之类的内容可以进行简单注释,但是函数就不能这样做了,要知道注释的作用是一种为了让代码更易读...formTime(time,isyear){ } 是不是比之前的注释多了很多,内容详细了很多,当然,不只是单单的内容多了,如果只是内容多了那么/* */段落注释同样也可以写,...普通注释 文档注释 这种提示就像嵌代码在里面一样,而不是浮于表面了,在我们书写npm包的时候,用户使用我们的包,就能看到这种提示,对使用者特别友好。...npm install jsdoc -g 基本使用 jsdoc 文件名 其他的使用方式可以去官网查看 jsdoc 33.js 执行完此命令,会生成一个out文件夹,查看里面的index页面即可,右边侧边栏会显示函数的使用

    20920

    用原生js写一个多动症的简历

    用原生js写一个"多动症"的简历 预览地址 源码地址 最近在知乎上看到@方应杭用vue写了一个会动的简历,觉得挺好玩的,研究一下其实现思路,决定试试用原生js来实现。...color: blue; background: red; } 项目搭建 在这个项目中我们 使用webpack2来完成项目的构建 使用yarn来处理依赖包的管理 使用es6的写法 使用部分原生...dom操作api standard.js(代码风格约束利器) 最重要的几个模块分别是resumeEditor(简历编辑模块) 、 stylesEditor(简历样式编辑模块) 、 以及vQuery(...封装的dom操作模块) 最后app.js(入口模块)再将几个模块的功能结合起来完成整个项目。...,可读性差,代码呈横向发展趋势...伟大的程序员们开疆扩土发明了promise的解决方案。

    5.3K20

    实战 | 用原生js写一个多动症的简历

    2、使用yarn来处理依赖包的管理 3、使用es6的写法 4、使用部分原生dom操作api 5、standard.js(代码风格约束利器) 目录结构如下 最重要的几个模块分别是resumeEditor...(简历编辑模块) 、 stylesEditor(简历样式编辑模块) 、 以及vQuery(封装的dom操作模块) 最后app.js(入口模块)再将几个模块的功能结合起来完成整个项目。...app(入口模块) 最后由app入口模块将以上几个模块整合完成项目的功能,我们找出其中的核心代码来, ,你没看错,传说中的回调地狱,亮瞎了我的狗眼啊。...想必大家和我一样都是不愿意看到这坨恶心的代码的,但对于处理异步问题,回调又的确是一直以来的解决方案之一。...,可读性差,代码呈横向发展趋势...伟大的程序员们开疆扩土发明了promise的解决方案。

    4K10

    只写代码?太浪费了,直接云原生渲染!

    腾讯现在针对云原生构建又有了一个新产品cnb——Cloud Native Build,官网在cnb.cool,每个月有1600免费核时的云原生开发额度,够爽吧。...只拿来写代码那太浪费了,cnb的云原生开发基于docker那样的模式,那很自由了,前几天我看到cnb在部署Deepseek,也验证了这一想法。...重要的是这东西跑了7小时,连免费额度的5%都没用到,这不是爽飞了云原生开发使用跟喝水一样简单构建Blender我这里已经做了一个仓库,可以直接按照说明使用https://cnb.cool/arsrna/...构建逻辑docker.ide/Dockerfile,即为运行云原生开发所用到的环境。...加入WebUI,现在通过命令行有点鸡肋,不熟悉代码的操作起来不方便已知问题初代毕竟是初代,还是有很多问题需要完善,前面也提到了,mmd渲染会因为插件问题,丢失摄像机数据,导致原本是透视的摄像机变成了正交

    27421
    领券