【Web前端-布局|瀑布流图片布局】自pinterest网站爆红以来,国内一度掀起“仿PIN”狂潮,诸如花瓣、蘑菇街等等。正是如此,“瀑布流”式布局受到广大网民的青睐。众多知名JS库,也相继出现“瀑布流”布局插件,譬如jQuery的Masonry插件、KISSY的waterfall插件等。今天闲来无聊,我也自己动手弄了段原生JS代码,实现了简单的“瀑布流”布局效果,并且图片可以无线加载,当然肯定不能和以上那些优秀插件相提并论,有兴趣的朋友,可以去看看,希望能带给你或多或少的收获。
代码片段(1)[全屏查看所有代码]
1. [代码][JavaScript]代码
(1)html代码
瀑布流图片布局 - 锐客网
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
文章图片
( 2 )css代码
*{
margin: 0;
padding: 0;
}#main{
position: relative;
}.box{
padding: 15px 0 0 15px;
float: left;
}.pic{
padding: 10px;
border: 1px solid #ccc;
border-radius: 5px;
box-shadow: 0 0 5px #ccc;
}
.pic img{
width: 165px;
height: auto;
}
(3)js原生代码
window.onload = function() {
waterfall('main', 'box');
var dataInt = {
"data": [{
"src": '0.jpg'
}, {
"src": '5.jpg'
}, {
"src": '3.jpg'
}, {
"src": '8.jpg'
}]
}
window.onscroll = function() {
if(checkScrollSlide) {var pHali = document.getElementById('main');
for(var i = 0;
i < dataInt.data.length;
i++) {
var obox = document.createElement('div');
obox.className = 'box';
pHali.appendChild(obox);
var opic = document.createElement('div');
opic.className = 'pic';
obox.appendChild(opic);
var oimg = document.createElement('img');
oimg.src = "https://www.it610.com/article/images/" + dataInt.data[i].src;
opic.appendChild(oimg);
}
waterfall('main', 'box');
}
}
}function waterfall(hali, box) {
var pHali = document.getElementById(hali);
var oboxs = getByClass(pHali, box);
var oboxW = oboxs[0].offsetWidth;
var cols = Math.floor(document.documentElement.clientWidth / oboxW);
pHali.style.cssText = 'width:' + oboxW * cols + 'px;
margin:0 auto';
var hArr = [];
for(var i = 0;
i < oboxs.length;
i++) {
if(i < cols) {
hArr.push(oboxs[i].offsetHeight);
} else {
var minH = Math.min.apply(null, hArr);
var index = getMinhIndex(hArr, minH);
oboxs[i].style.position = 'absolute';
oboxs[i].style.top = minH + 'px';
oboxs[i].style.left = oboxs[index].offsetLeft + 'px';
hArr[index] += oboxs[i].offsetHeight;
}
}
}function getByClass(hali, clsName) {
var boxArr = new Array(),
oElements = hali.getElementsByTagName('*');
for(var i = 0;
i < oElements.length;
i++) {
if(oElements[i].className == clsName) {
boxArr.push(oElements[i]);
}
}
return boxArr;
}function getMinhIndex(arr, val) {
for(var i in arr) {
if(arr[i] == val) {
return i;
}
}
}function checkScrollSlide() {
var pHali = document.getElementById('main');
var oboxs = getByClass(pHali, 'box');
var lastboxH = oboxs[oboxs.length - 1].offsetTop + Math.floor(oboxs[oboxs.length - 1].offsetHeight / 2);
var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
var height = document.body.clientHeight || document.documentElement.clientHeight;
return(lastboxH < scrollTop + height) ? true : false;
}
2.效果图
文章图片
推荐阅读
- JavaScript深拷贝的几种方法
- 11种最佳JavaScript单元测试框架和工具
- JavaScript错误的5个常见原因(以及如何避免)
- 事件循环(Event Loop)在JavaScript中是如何工作的()
- 3个用于前端开发的最佳JavaScript框架/库
- 你应该知道的10个最佳JavaScript框架
- app保存图片
- 【原创】JS文件替换神器--Chrome ReRes插件