所谓瀑布流就是让大小尺寸不同的图片像瀑布一样,整个页面都布满图片
而在Ajax
中,瀑布流能够说是很常见的,利用瀑布流有限加载技术,勾销了分页按钮,鼠标滑动到底部会主动加载图片
先上一下效果图:
html构造 和 css款式
<head> <style> * { margin: 0; padding: 0; box-sizing: border-box; } img { width: 250px; position: absolute; display: block; transition: 0.8s; } </style> <body> <!-- 页面一上来先加载一些图片 --> <img src="图片1" alt=""> <img src="图片2" alt=""> <img src="图片3" alt=""> <img src="图片4" alt=""> <img src="图片5" alt=""> <img src="图片6" alt=""> <img src="图片7" alt=""> <img src="图片8" alt=""> <img src="图片9" alt=""> </body></head>
Ajax
这个一个重点就是应用 imgH
这个数组来存储每一列的图片高度,高度小的先排列,就会造成瀑布流
<script src="./server1/public/js/Ajax.js"></script><script> // 页面加载实现就调用layout进行布局 window.onload = layout; // 窗口扭转也调用函数 window.onresize = function() { layout(); } function layout() { // 获取全副的图片 let getImgs = document.querySelectorAll('img'); // 获取可视区的宽度 let windowWidth = document.documentElement.clientWidth; // 计算一行显示多少张图片 let n = Math.floor(windowWidth / 350); if (n <= 0) { return } // 计算页面两侧的空白 let blankWidth = (windowWidth - n * 250) / 2 // imgH 用来记录每一列的图片高度 let imgH = [] for (let i = 0, n1 = getImgs.length; i < n1; i++) { // 用来计算是是一行中的第几个img,给数组作索引 let j = i % n; if (imgH.length === n) { // 从高度低的开始排 let min = getMin(imgH); // 左右高低定位,并给一个20px的间距 getImgs[i].style.left = blankWidth + min * 270 + 'px' getImgs[i].style.top = imgH[min] + 20 + 'px' // 批改该地位的图片的高度 imgH[min] = imgH[min] + getImgs[i].offsetHeight + 20 } else { // 这个用来排序第一行,把img的高度放进数组 imgH[i] = getImgs[i].offsetHeight + 20; // 左右定位 getImgs[i].style.left = blankWidth + j * 270 + 'px'; getImgs[i].style.top = 20 + 'px'; } } } // 找出高度最小的图片的索引 function getMin(arr) { let m = 0 for (let i = 0, n = arr.length; i < n; i++) { m = Math.min(arr[m], arr[i]) === arr[m] ? m : i; } return m; } // j 用来记录Ajax申请的次数 let j = 0 // 当滚动条滚动时触发函数 window.onscroll = function() { // 可视区高度 let windowHeight = document.documentElement.clientHeight; // 被卷去的高度 let windowScroll = document.documentElement.scrollTop || document.documentElement.scrollTop; // 图片高度 let imgsHeight = document.documentElement.scrollHeight; // 判断是否到底部了,是就通过Ajax申请发送数据 if (windowHeight + windowScroll >= imgsHeight - 20) { if (j < 4) { Ajax({ url: 'http://127.0.0.1:3000/getImg', // 将j传给服务器端 data: { num: j }, success(data) { data = JSON.parse(data) for (let key in data) { // 创立图像标签 let img = document.createElement('img'); // 绑定标签 img.src = data[key]; document.body.appendChild(img) }; // 追加新的节点之后从新布局 layout(); } }); j++ } else { layout() } }; };</script>
这里的j
其实是用来管制Ajax
申请的次数的,这里只进行4次申请(没有那么多图片),当然如果你去掉判断条件,就能够实现有限加载啦
这里的服务端比较简单,只是响应图片而已
app.get('/getImg', function(req, res) { res.setHeader('Access-Control-Allow-Origin', '*'); // 筹备了4个图片库 imgsUrl1 = {}, imgsUrl2 = {}, imgsUrl3 = {}, imgsUrl4 = {} // 每次申请发送一个图库 if (req.query.num === '0') { res.json(imgsUrl1) } else if (req.query.num === '1') { res.json(imgsUrl2) } else if (req.query.num === '2') { res.json(imgsUrl3) } else { res.json(imgsUrl4) }})
满腹经纶,只能实现这点货色(呜呜呜呜....),若有过错,还望指出,持续冲啊啊啊啊啊啊!