现在网页中需要翻页的列表,好多都已经改为瀑布流了。所以这个思路还是特别重要的

HTML

Css

页面

因为每个图片的高度不一样所以她的 top 和left 我们待会通过JS计算 动态生成

js部分 思路注释

<script>
// 1.获取父容器的宽度 获取子容器的宽度 算出一列放多少个,边距
// 2.通过计算盒子的高度,布局方法
// 3.瀑布流启动
//获取父容器
let itemBox=document.getElementById('itembox')
//父容器宽度
let iBoxW=itemBox.offsetWidth;
// 子容器和宽度
let item=document.getElementsByClassName('item')
let itemW=item[0].offsetWidth
//列数
const rowNum=Math.floor(iBoxW/itemW)
//间距
const distents=Math.floor((iBoxW-itemW*rowNum)/rowNum) // console.log(distents,rowNum)
// 每个图片的left=列数*(图片大小+间距)
//每个图片的top值为当前高度最低的top
//保存每列的高度、索引就是我们放的列数,值就是top
let arr=[] // 实现布局
for (let i=0;i<item.length;i++){
// 第一排top为0
if (i<rowNum){
item[i].style.left=i*(itemW+distents)+'px';
item[i].style.top='0px'
arr[i]=item[i].offsetHeight;
}
// 第二 三 四。。。。排
else {
let Minarr=MinArr(arr)
item[i].style.left=Minarr.index*(itemW+distents)+'px';
item[i].style.top=Minarr.min+'px'
console.log(item[i].offsetHeight,arr)
//更新数组高度
arr[Minarr.index]+=item[i].offsetHeight
}
} let json=['bl1.jpg','bl5.jpg','bl6.jpg','bl7.jpg','bl8.jpg','bl4.jpg','bl3.jpg','bl2.jpg','CJD2.jpg','CJD4.jpg','CJD1.jpg','CJD3.jpg']
console.log(MinArr(arr),arr)
//启动瀑布流
//滚动事件
window.onscroll=function () {
//浏览器可视高度
let toH=window.innerHeight
//浏览器滚动超出的高度
let doH=window.pageYOffset
let Minarr=MinArr(arr) //当这2个值+起来>最小列宽度时加载数据
if (toH+doH>Minarr.min){
for (let i=0;i<json.length;i++){
//创建元素
let div=document.createElement('div')
div.className='item'
let img=document.createElement('img')
img.src='images/'+json[i]
//设置TOP left
// 每个图片的left=列数*(图片大小+间距)
//每个图片的top值为当前高度最低的top
div.style.top=Minarr.min+'px'
div.style.left = Minarr.index*(itemW+distents)+'px';
//添加
div.appendChild(img)
itemBox.appendChild(div)
//保存每列的高度、索引就是我们放的列数,值就是top
arr[Minarr.index]+=div.offsetHeight
// 重新排序
Minarr=MinArr(arr)
} //后期用AJAX 改变JSOn的值
}
} //最小高度和索引
function MinArr(arr) {
let mArr={}
mArr.min=arr[0]
mArr.index=0;
for (let i=1;i<arr.length;i++){
if (mArr.min>arr[i]){
mArr.min=arr[i]
mArr.index=i;
}
}
return mArr
} </script>

  

疑问

document.body.clientWidth ==> BODY对象宽度
document.body.clientHeight ==> BODY对象高度
document.documentElement.clientWidth ==> 可见区域宽度
document.documentElement.clientHeight ==> 可见区域高度

我开始用获取body的高度时候始终都是0 原因是因为绝对定位不能将父容器撑开 产生了BFC 解决办法。。。。还不知道  留个疑惑吧

JavaScript—瀑布流的更多相关文章

  1. javascript瀑布流效果

    javascript瀑布流效果 其实javascript瀑布流 前几年都已经很流行了(特别是美丽说,蘑菇街),最近看到网上有人问这个瀑布流效果,所以自己有空的时候就研究了下,其实也是研究别人的代码,研 ...

  2. javascript瀑布流

    哇,瀑布流,是的,不错,不错,真的不错,很好玩的样子,于是自己想玩玩啊,来吧,就玩起. 循序渐进,我这里采用原生的js代码来书写.为了方便大家运行代码,我就全部样式和CSS都写在html里面了,当然还 ...

  3. JavaScript瀑布流代码

    function osCode(){ var boxWidth = parseInt($(".item").css('width')), marginTop = parseInt( ...

  4. web前端学习(四)JavaScript学习笔记部分(8)-- JavaScript瀑布流

    index.html <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type&qu ...

  5. JavaScript:实现瀑布流

    一.前言: 瀑布流现在是一个非常常用的布局方式了,尤其在购物平台上,例如蘑菇街,淘宝等等. 二.流程: 1.在html文件中写出布局的元素内容: 2.在css文件中整体对每一个必要的元素进行样式和浮动 ...

  6. 用JavaScript和jQuery实现瀑布流

    ▓▓▓▓▓▓ 大致介绍 在慕课网上学习了用原生js和jQuery实现瀑布流,在这里做个笔记 ▓▓▓▓▓▓ 用JavaScript实现 基本结构: <div id="main" ...

  7. JavaScript中作用域回顾(避免使用全局变量)(瀑布流的实现)(scroll事件)以及Django自定义模板函数回顾

    页面显示照片样式为瀑布流: 上面的div个数可以按照自己安排进行划分.img的分布可以使用模板标签以及自定义模板函数进行排布: 自定义模板函数实现可以看,最后几列:python---django中模板 ...

  8. 从零开始学习前端JAVASCRIPT — 11、JavaScript运动模型及轮播图效果、放大镜效果、自适应瀑布流

    未完待续...... 一.运动原理 通过连续不断的改变物体的位置,而发生移动变化. 使用setInterval实现. 匀速运动:速度值一直保持不变. 多物体同时运动:将定时器绑设置为对象的一个属性. ...

  9. JavaScript——原生js实现瀑布流

    瀑布流介绍及实现原理: 瀑布流是一种页面布局,页面上也有多等宽的块(块就页面内容),每一块都是绝对定位(absolute),每个块排列的方式如下:寻找现在高度最小的列,把该块定位到该列下方.需要知道, ...

随机推荐

  1. Ubuntu18.04可执行文件运行提示No such file or directory

    参考原文见 https://blog.csdn.net/sun927/article/details/46593129? 最近我也遇到一个类似问题,同一个工具在Ubuntu16.04里面运行是好的,但 ...

  2. 用cmd运行java可以javac不行(win10)

    今天发现个有趣的问题,用cmd运行java可以javac不行.(win10) java-home和classpath配置没有问题,最后发现问提出先在path,在这里看并没有异常. 在上面图片中点击编辑 ...

  3. 16 协程和www

    1.一个应用程序一般对应一个进程,一个进程一般有一个主线程,还有若干个辅助线程,线程之间是平行运行的,在线程里面可以开启协程,让程序在特定的时间内运行.2协程和线程的区别是:协程避免了无意义的调度,由 ...

  4. js基础学习之-js全局对象

    声明的三种方式: 第一种: var test; //或var test = 5; 第二种: test = 5; 第三种: window.test; //或window.test = 5; //只是使用 ...

  5. (五)selenuim和phantonJs处理网页动态加载数据的爬取

    selenuim和phantonJs处理网页动态加载数据的爬取 一 图片懒加载 自己理解------就是在打开一个页面的时候,图片数量特别多,图片加载会增加服务器的压力,所以我们在这个时候,就会用到- ...

  6. Markdown工具推荐

    Markdown 因语法简单,应用广泛,在近几年被很多开发者所喜爱.常用的语法不多,也就十来种吧.本人自从2017年接触就一发不可收拾. 在这几年里,用过了很多写Markdown的工具.接下来就以现在 ...

  7. 【Android】家庭记账本手机版开发报告二

    一.说在前面 昨天 完成了对记账本的账单的增删 今天 完善昨天的框架结构( 1.引入ViewModel管理数据.使MainActive 只管理界面.不再管数据了 2.引入AsyncTask.后台执行. ...

  8. jvm 优化

    1.jvm 运行参数 1.1 jvm 参数类型 1.1.1 标准参数 -help -version 1.1.2 -X参数(非标准参数) -Xint -Xcomp 1.1.3-XX参数(使用率高) -X ...

  9. 每日一linux命令

    每日一linux命令 http://www.cnblogs.com/peida/tag/每日一linux命令/

  10. 下页小希学MVC5+EF6.2 学习记录三

      目的:1 学习mvc+ef 2  写下日记也是对自己的督促 期待已久的EF终于来了. 学完本篇文章,你将会掌握基于EF数据模型的完整开发流程. 本次将会完成EF数据模型的搭建和使用. 基于这个模型 ...