前端程序猿Web前端之路

原生js实现瀑布流

2017-04-24  本文已影响120人  蘩蕐皆成空

        浏览网页的时候经常会遇到瀑布流布局的网站。也许有些读者不了解瀑布流。瀑布流,又称瀑布流式布局。是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部。比如下面图片的效果,就是一个典型的瀑布流。

网上有很多JQ的瀑布流插件,而且都写好了兼容,都可以尝试去使用,这里只是跟大家分享一下原生js实现瀑布流的效果,一起学习。

```<!doctype html>

<html lang = "en">

<head>

             <meta charset  = "UTF-8">

             <title>原生js瀑布流</title>

<style type="text/css">

            div{
                     background:#ccc;

                     width:200px;

                     position: absolute;

                    transition:0.5s;

                }

</style>

</head>

<body>

<script type="text/javascript">

function createDiv(){

for(var i =0; i<20; i++){

var div =document.createElemnet("div");

var rnd = Math.floor(Math.random()*300+50)  // div的高度在50到350之间

div.style.height = rnd+"px";

div.innerHTML = i;

document.body.appendChild(div);

}

change()

}

function change(){

var aDiv = document.getElementsByTagName('div');

var windowCw = document.documentElement.clientWidth;  //窗口可视的宽度

var n  = Math.floor(windowCw/210);   /一行可以容纳几个div,并向下取整

if (i<=0){

return}

var t =0;

var center = (windowCw-n*210)/2;         //居中

var arrH = []; //定义一个空数组,存放div的高度

for(var i= 0;i<arrH.length;i++){
var j = i%n;

if (arrH.length==n) {                    //一行排满n个后到下一行

var min = findMin(arrH);              //从最“矮”的排起,可以从下图的序号中看得出来,下一行中序号是从矮到高排列的

aDiv[i].style.left =center + min*210 + "px";

aDiv[i].style.top = arrH[min]+10 + "px";

arrH[min] += aDiv[i].offsetHeight + 10;

// alert(min);

}else{

arrH[j] = aDiv[i].offsetHeight;

aDiv[i].style.left =center + 200*j+10*j + "px";

aDiv[i].style.top = 0;

}

};

}

window.onresize = function(){      //窗口改变也调用函数

change();

}

window.onscroll= function  () {

// 页面总高度

var bodyHeight = document.documentElement.offsetHeight;

// 可视区高度

var windowHeight = document.documentElement.clientHeight;

//滚动条的高度

var srcollTop = document.documentElement.scrollTop || document.body.scrollTop;

var srcollH = document.body.scrollHeight;

// alert(srcollH);

if (srcollTop+windowHeight  >= srcollH-20) {

createDiv();

};

}

function findMin(arr) {

var m = 0;

for (var i = 0; i < arr.length; i++) {

m = Math.min(arr[m], arr[i]) == arr[m] ? m : i;

}

return m;

}

</script>

</body>

</html>

```

上一篇下一篇

猜你喜欢

热点阅读