瀑布流

1. 定位后确定浏览器显示区域内,一行能放多少列图片盒子。

  1. 获取页面的宽度获取图片盒子的宽度

  2. 获取页面的宽度获取图片盒子的宽度

  3. 显示的列数=页面宽度/图片盒子宽度

  4. column = pageWidth / itemWidth

2. 确定列数之后,排列第一行

  • 下面还有很多图片盒子,我们先要排列第1行,所以在for循环里就要判断一下,当i(所有图片盒子的索引)<column(显示列数)的时候,说明在第1行;

  • 知道在第1行之后,动态设置每个图片盒子的left值就能排好第1行。

  • left = i * ( itemWidth + gap );

3. 第1行排列好之后,获取第1行所有图片盒子的高度

  • 需要定义一个数组arr,将获取到的高度存在数组中,因为第2行排列的时候需要考虑top值,此时只能根据第1行图片盒子的高度来设置;
    获取图片高度的时候要注意,程序必须写在入口函数onload里面,因为图片的加载特性是︰等页面都加载完之后才去请求加载,所以不写在入口函数里可能会出现高度获取不到的情况。

4. 排列第二行

  • 获取到刚刚数组中,高度最小的那一列,将第2行的第1个图片盒子放置在它的下方;
  • 此时的left值就是高度最小列的offsetLeft;top值就是∶第1行高度最小列的高度(为了布局美观可以加上上下间隙gap)。
  • 记录下高度最小列的索引index,后面计算会用到;
  • 设置完成之后,会发现后面所有的图片都叠在这个高度最小列的下面,原因就是此时的最小列高度没有改变,应该加上下面图片的高度,得出一个新高度。

5. 改变最小列当前高度

  • 此时的这一列高度其实已经发生改变了,所以需要将新高度赋值给数组

  • 当前高度最小列的高度=当前高度最小列的高度+间隙+下面图片盒子的高度

6. 触发resize事件

  • 将整个设置样式的部分封装成一个函数,在onload里面注册一个resize事件,只要页面一发生改变,就触发样式部分的代码。

  • 实时改变pageWidth的宽度,这样瀑布流就会是一个响应式的效果了

7. 懒加载事件

  • 通过页面可视区高度+滚动条卷去的高度 = 最后一张图片图片的offsetTop的时候加载下面的图片

8. 代码示例:

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/html">
<head><meta charset="UTF-8"><title>瀑布流</title><style>* {margin: 0;padding: 0;position: relative;}img {width: 220px;display: block;}.item {box-shadow: 2px 2px 2px #999;position: absolute;}</style><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js"></script>
</head>
<body>
<!-- html 部分 -->
<div id="box"><!--<div class="item"><img src="../image/瀑布流/001.jpg" alt=""></div><div class="item"><img src="../image/瀑布流/030.jpg" alt=""></div>-->
</div><script>let imgList = ["https://s5.mogucdn.com/mlcdn/c45406/210123_80fb475jaa3c85a2b533ake67c5jb_5000x6660.jpg_500x9999.v1c7E.81.webp","https://s5.mogucdn.com/mlcdn/55cf19/201007_5ef1begkc3k33254fca8kcjk26703_640x960.jpg_500x9999.v1c7E.81.webp","https://s5.mogucdn.com/mlcdn/c45406/210504_2bgkjaekcgl7al11fllk576k19g2d_6157x9236.jpg_500x9999.v1c7E.81.webp","https://s5.mogucdn.com/mlcdn/c45406/201005_3747744121i53l20gl7e5df72f101_4999x7499.jpg_500x9999.v1c7E.81.webp","https://s5.mogucdn.com/mlcdn/c45406/210713_19h2fa2ff2i7leb0iib0h1hacbc0f_750x750.jpg_500x9999.v1c7E.81.webp","https://s5.mogucdn.com/mlcdn/c45406/200911_60age6f2k4ekic0ii8j550699a394_715x751.jpg_500x9999.v1c7E.81.webp","https://s5.mogucdn.com/mlcdn/c45406/210803_3eekh543e8ak9k1j4g4c8l0h74gd7_800x1200.jpg_500x9999.v1c7E.81.webp","https://s5.mogucdn.com/mlcdn/55cf19/210401_2ihd8726caji6llkjf9j5fhjja49c_640x960.jpg_500x9999.v1c7E.81.webp","https://s5.mogucdn.com/mlcdn/c45406/210806_8c362g6jeab3i660l4e4fidbe4fd4_1080x1440.jpg_500x9999.v1c7E.81.webp","https://s5.mogucdn.com/mlcdn/55cf19/210511_3245e1i1569k16396h8k6d26gehh8_640x960.jpg_500x9999.v1c7E.81.webp","https://s5.mogucdn.com/mlcdn/c45406/210306_69ilei699h450bd84cb4cha9b31jj_5732x8599.jpg_500x9999.v1c7E.81.webp","https://s5.mogucdn.com/mlcdn/55cf19/210421_602kie0e85e16ie38fd7jab9g488j_750x1000.jpg_500x9999.v1c7E.81.webp","https://s5.mogucdn.com/mlcdn/c45406/210522_34igd3eabfal5e9i4cdlch3i2767k_640x960.jpg_500x9999.v1c7E.81.webp","https://s5.mogucdn.com/mlcdn/55cf19/210122_1ge4g5l19jij5af218c6h9ig9abh7_640x960.jpg_500x9999.v1c7E.81.webp","https://s5.mogucdn.com/mlcdn/c45406/201007_754i59abjh334k7ccd1klifc82hjj_4464x5999.jpg_500x9999.v1c7E.81.webp","https://s5.mogucdn.com/mlcdn/c45406/210319_2ck168b51342db5k6772ljhf7lgl4_3800x5000.jpg_500x9999.v1c7E.81.webp","https://s5.mogucdn.com/mlcdn/c45406/200501_1iacl56kkel7e98flhg8h510gkdhb_640x961.jpg_500x9999.v1c7E.81.webp","https://s5.mogucdn.com/mlcdn/c45406/210710_07bbcac5443i981l5alh45ilab6a4_640x960.jpg_500x9999.v1c7E.81.webp"]//创建图片元素for (let i = 0; i < imgList.length; i++) {let img = $(` <div class="item"><img src=${imgList[i]} alt=""></div>`)$("#box").append(img)}// 定义每一列之间的间隙 为10像素const gap = 10;window.onload = function () {waterfall()function waterfall() {const items = $("#box").children()const pageWidth = getClient().width;const itemWidth = items[0].offsetWidth;// 1- 确定列数  = 页面的宽度 / 图片的宽度const columns = parseInt(pageWidth / (itemWidth + gap));const arr = [];$.each(items, (index, element) => {if (index < columns) {$(element).css({top: 0,left: (itemWidth + gap) * index})arr.push(element.offsetHeight)} else {//其他行// 3- 找到数组中最小高度  和 它的索引let minHeight = arr[0];let minIndex = 0;for (let j = 0; j < arr.length; j++) {if (minHeight > arr[j]) {minHeight = arr[j];minIndex = j;}}// 4- 设置下一行的第一个盒子位置// top值就是最小列的高度 + gap$(element).css({top: arr[minIndex] + gap,left: items[minIndex].offsetLeft})// 5- 修改最小列的高度// 最小列的高度 = 当前自己的高度 + 拼接过来的高度 + 间隙的高度arr[minIndex] = arr[minIndex] + items[index].offsetHeight + gap;}})}window.onresize = () => {waterfall()}//当加载到最后一张的时候,加载更多图片window.onscroll = () => {const items = $("#box").children()if (getClient().height + getScrollTop() >= items[items.length - 1].offsetTop) {console.log("aaa")//模拟从后台请求的数据const data = ["https://s5.mogucdn.com/mlcdn/c45406/210123_80fb475jaa3c85a2b533ake67c5jb_5000x6660.jpg_500x9999.v1c7E.81.webp","https://s5.mogucdn.com/mlcdn/55cf19/201007_5ef1begkc3k33254fca8kcjk26703_640x960.jpg_500x9999.v1c7E.81.webp","https://s5.mogucdn.com/mlcdn/c45406/210504_2bgkjaekcgl7al11fllk576k19g2d_6157x9236.jpg_500x9999.v1c7E.81.webp","https://s5.mogucdn.com/mlcdn/c45406/201005_3747744121i53l20gl7e5df72f101_4999x7499.jpg_500x9999.v1c7E.81.webp","https://s5.mogucdn.com/mlcdn/c45406/210713_19h2fa2ff2i7leb0iib0h1hacbc0f_750x750.jpg_500x9999.v1c7E.81.webp","https://s5.mogucdn.com/mlcdn/c45406/200911_60age6f2k4ekic0ii8j550699a394_715x751.jpg_500x9999.v1c7E.81.webp","https://s5.mogucdn.com/mlcdn/c45406/210803_3eekh543e8ak9k1j4g4c8l0h74gd7_800x1200.jpg_500x9999.v1c7E.81.webp","https://s5.mogucdn.com/mlcdn/55cf19/210401_2ihd8726caji6llkjf9j5fhjja49c_640x960.jpg_500x9999.v1c7E.81.webp","https://s5.mogucdn.com/mlcdn/c45406/210806_8c362g6jeab3i660l4e4fidbe4fd4_1080x1440.jpg_500x9999.v1c7E.81.webp","https://s5.mogucdn.com/mlcdn/55cf19/210511_3245e1i1569k16396h8k6d26gehh8_640x960.jpg_500x9999.v1c7E.81.webp","https://s5.mogucdn.com/mlcdn/c45406/210306_69ilei699h450bd84cb4cha9b31jj_5732x8599.jpg_500x9999.v1c7E.81.webp","https://s5.mogucdn.com/mlcdn/55cf19/210421_602kie0e85e16ie38fd7jab9g488j_750x1000.jpg_500x9999.v1c7E.81.webp","https://s5.mogucdn.com/mlcdn/c45406/210522_34igd3eabfal5e9i4cdlch3i2767k_640x960.jpg_500x9999.v1c7E.81.webp","https://s5.mogucdn.com/mlcdn/55cf19/210122_1ge4g5l19jij5af218c6h9ig9abh7_640x960.jpg_500x9999.v1c7E.81.webp","https://s5.mogucdn.com/mlcdn/c45406/201007_754i59abjh334k7ccd1klifc82hjj_4464x5999.jpg_500x9999.v1c7E.81.webp","https://s5.mogucdn.com/mlcdn/c45406/210319_2ck168b51342db5k6772ljhf7lgl4_3800x5000.jpg_500x9999.v1c7E.81.webp","https://s5.mogucdn.com/mlcdn/c45406/200501_1iacl56kkel7e98flhg8h510gkdhb_640x961.jpg_500x9999.v1c7E.81.webp","https://s5.mogucdn.com/mlcdn/c45406/210710_07bbcac5443i981l5alh45ilab6a4_640x960.jpg_500x9999.v1c7E.81.webp"]for (let i = 0; i < data.length; i++) {let element = $(`<div class="item"><img src=${data[i]} alt=""></div>`)$("#box").append(element)}waterfall()}}}//兼容性处理function getClient() {return {width: window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth,height: window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight}}function getScrollTop() {return window.pageYOffset || document.documentElement.scrollTop;}
</script>
</body>
</html>

ES6+JQuery实现瀑布流效果相关推荐

  1. 利用jquery实现瀑布流效果

    前言: 现在很多内容型网站都会采用瀑布流布局来实现内容展示,包括文章类及图片类,我们可以自己动手来编写属于我们自己的瀑布流插件. 效果: CSS部分: *{margin: 0;padding: 0;} ...

  2. 30个创意出色的非常实用的jquery框架插件-(视觉大背景,瀑布流效果)

    jQuery是在网页设计师和开发者最近的热门话题之一.人们使用它的广泛范围从个人博客到企业网站,目前流行的视觉大背景滚动效果,瀑布流图片阴影效果,图片缩放,动态标签复制,html5音频播放,视频播放等 ...

  3. jQuery实现响应式瀑布流效果(jQuery+flex)

            瀑布流原理:是一种常见的网页布局方式,它的特点是将内容以多列的形式呈现,每一列的内容高度不固定,根据内容的大小自适应调整,从而形成了像瀑布一样的流动效果. 瀑布流的实现原理涉及到数据加 ...

  4. 瀑布流效果Demo总结(5)之基于jquery+blocksit.min.js的实现

    1.综述 最近研究了时下流行的瀑布流展示效果. 当前共计尝试的方法及其优缺点如下: (1)基于JQuery框架及blocksit.min.js实现的瀑布流不连续,每列中多多少少都会有一些位置出现空白. ...

  5. jQuery图片瀑布流demo效果示例(整理)jQuery瀑布流效果

    效果图: <!DOCTYPE html> <html lang="zh"><head><meta charset="UTF-8& ...

  6. jquery版瀑布流

    一个月前用jquery实现了瀑布流效果,看着当时的代码有点难过--今天抽时间稍微修改了一下.额,现在看起来不是那么难受了,就来和大家分享一下.废话不多说,开始正题~ 一.演示效果 二.html代码 & ...

  7. masonry ajax瀑布流,jquery.masonry瀑布流插件的4个使用步骤

    解释:很简单,就是把下载之后的脚本文件嵌入到你想使用2.瀑布流布局样式代码 .container-fluid { padding: 20px; } .box { margin-bottom: 20px ...

  8. css浮动+应用(瀑布流效果的实现)

    首先是index.html文件: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"& ...

  9. 网页瀑布流效果实现的几种方式

    前言 like a mountain that is in our path,wo cannot complain that it is there,we simply have to climb i ...

最新文章

  1. 必要时调整应用程序每个辅助进程的线程数
  2. [置顶] 决策树绘图(二)
  3. 解决 aka com.chaozh.iReader:style/Theme.AppCompat.Light.NoActionBar) not found.
  4. [YTU]_2433( C++习题 对象数组求最大值)
  5. mysql sql 字符串字段保留数字_sql中取字符串中的数字语句_MySQL
  6. android4.4.2fragment不显示,Android应用中使用Fragment组件的一些问题及解决方案总结...
  7. Spring的bean管理注解和配置文件混合使用
  8. JUC系列(十) | ForkJoin框架 并行处理任务
  9. tf.nn.embedding_lookup
  10. oracle下lag和lead分析函数
  11. matlab偶极矩电场强度分布图_课程设计用MATLAB模拟偶极子的电场分布.doc
  12. 如何同时配置GitHub和gitlab的SSH
  13. JVM内存模型及垃圾回收算法
  14. 使用运放构建电压跟随器
  15. HTML5全局属性汇总
  16. 【这很AI】斯坦福新人工智能系统曝光:用算法优化难民工作分配
  17. Hexo+腾讯云+Icarus主题 搭建自定义个人博客
  18. 老宇哥带你玩转ESP32,12篇基础教程已经更新完毕,接下来是进阶教程
  19. win10 桌面(Windows 资源管理器)卡死的根本解决办法
  20. sql server升级打补丁

热门文章

  1. 用Python做的小游戏合集——飞机大战
  2. Linux系统配置服务器ip
  3. 不用登陆密码也能进路由器,适用于TP、磊科、腾达
  4. 年薪50万是一条线,年薪100万又是一条线…...
  5. Linux云计算之云计算概述
  6. 【精品推荐】像极百度传课iOS版,非常赞的教育类应用
  7. unity实现物品或技能图标的拖拽功能
  8. Jitsi Meet Electron Desktop 在树莓派4中的编译
  9. Linux驱动面试题集锦
  10. Python的层级结构