如何用原生JS实现一个瀑布流

136 阅读1分钟

嗨~今天用js去写一个经典的案例:“瀑布流”

那么问题来了,什么是瀑布流式布局:“瀑布流,又称瀑布流式布局。是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部。最早采用此布局的网站是Pinterest,逐渐在国内流行开来。国内大多数清新站基本为这类风格。”

话不多说,开始了!

首先还是在html里创建几个盒子,然后再在css里去写一下样式,然后就走到了js里,我们需要在js里写很多数据,然后获取我们需要的数据

getImg()
//获取大盒子
var wrappers = document.querySelector('.wrapper')
// var srt = '';
// 给window一个滑动事件
window.onscroll = function () {
// console.log(isOK())
//判断是否可以加载图片
if (isOK()) {
//循环新数据
for (var i in data.dataimg) {
// console.log(data.dataimg[i])
// 写入html
wrappers.innerHTML += `

\

\ \
\
`\ }\ getImg()\ }\ }\ //封装图片排列顺序\ function getImg() {\ var wrapper = document.querySelector('.wrapper');\ //获取html的宽度\ var html_w = document.documentElement.clientWidth || document.body.clientWidth;\ var boxs = document.querySelectorAll('.box')\ console.log(boxs)\ //获取一个盒子的宽度\ var box_w = boxs[1].offsetWidth;\ console.log(box_w)\ console.log(html_w, box_w)\ //看最多能放几张图片 向下取整\ var cols = Math.floor(html_w / box_w);\ // 重新设置wrapper的宽度\ wrapper.style.width = box_w * cols + 'px';\ var arr = [];\ //循环所有图片\ for (var i = 0; i < boxs.length; i++) {\ \ if (i < cols) { //将第一排的图片的高度取出来\ arr.push(boxs[i].offsetHeight)\ } else {\ var mainH = Math.min.apply(Math, arr) //取第一排高度图片高度的最小值\ var ind = arr.indexOf(mainH) //找到最小值对应的下标\ console.log(mainH)\ // 给后面的图片定位\ boxs[i].style.cssText = `position:absolute;left:${ind * box_w}px;top:${mainH}px`;\ // 时刻更新arr数据,防止都定位到第一个高度最小的图片上面\ arr[ind] += boxs[i].offsetHeight;\ }\ }\ }\ \ \ //封装是否可以加载图片\ function isOK() {\ //html的高度\ var screen_h = document.documentElement.clientHeight || document.body.clientHeight\ //总体的高度\ var top = screen_h + (document.documentElement.scrollTop || document.body.scrollTop);\ var boxs = document.querySelectorAll('.box')\ // console.log(boxs[boxs.length-1].offsetTop); //获取最后一张图片从上面到顶部的距离\ var last_img = boxs[boxs.length - 1].offsetTop + boxs[boxs.length - 1].clientHeight/2;\ return top > last_img ? true : false; // 判断最后一张图到滚镀区域的距离\ \ \ \ }\ }\ \ 看结果把

\

image.png