water Posted on 2016-08-21 瀑布流1瀑布流,又称瀑布流式布局。是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部。以下介绍静态页面js的瀑布流制作方法: 1234567div{ width: 200px; background-color: paleturquoise; position: absolute; font-size: 50px; transition: top 0.5s,left 0.5s;} 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788var arrH = [];var index = 1;createDiv(40);/* * createDiv 创建div函数 * n参数是 创建div的个数 */function createDiv(n){ var n = n || 1; for (var i=0; i<n; i++) { var div = document.createElement('div'); div.style.height = rndFn(100,300) + 'px'; div.innerHTML = index; index ++; document.body.appendChild(div); } changeFn(); //改变div的位置}//屏幕宽度大小改变时触发window.onresize = function () { changeFn(); //变换div位置}//滚动条滚动时触发window.onscroll = function(){ //获取滚动条位置 var sTop = document.body.scrollTop || document.documentElement.scrollTop; //获取屏幕高度 var winH = document.documentElement.clientHeight; //当屏幕下方位置到达 每列的最小宽度-50时,创建div if (sTop+winH >= arrH[findMin(arrH)-50]) { createDiv(); }}/* * changeFn 改变div的left和top */function changeFn(){ //屏幕宽度 var winW = document.documentElement.clientWidth; //获取所有Div var aDiv = document.querySelectorAll('div'); //计算一行可以排几列 var num = parseInt(winW/(aDiv[0].offsetWidth+10)); //计算剩余的宽度的一半,就是两边的间隔 var center = (winW - ((aDiv[0].offsetWidth+10)*num-10))/2; arrH = []; for (var i = 0; i <aDiv.length; i++) { if (i<num) { //第一行 aDiv[i].style.left = center+i*(aDiv[i].offsetWidth+10) + 'px'; aDiv[i].style.top = 0; arrH[i] = aDiv[i].offsetHeight + 10; //高度变化,更新数组的高度值 }else{ var min = findMin(arrH) //找到最小高度 aDiv[i].style.left = center+min*(aDiv[i].offsetWidth+10) + 'px'; aDiv[i].style.top = arrH[min] + 'px'; arrH[min] += aDiv[i].offsetHeight + 10; } }}/* * findMin 找数组中最小值的位置 * arr参数是要操作的数组 * 返回(number)数组中最小值的位置 */function findMin(arr){ var min = arr[0]; var index = 0; for (var i=1; i < arr.length; i++) { if (min > arr[i]) { min = arr[i]; index = i; } } return index;}/* * 随机函数 * min 最小值 * max 最大值 */function rndFn(min , max){ return Math.round(Math.random()*(max-min)+min);}