window.onload,onload事件会在整个页面文档全部加载完成后执行
scrollTop、scrollHeight、clientHeight、offsetHeight、offsetTop ,这几个属性主要用来计算页面、元素、滚动区域的高度
document.body 与 document.documentElement的兼容性
var html = document.documentElement;
console.log(html == document.firstChild); // true
console.log(html == document.childNodes[0]); // true
<body>
<div id="main">
<div class="box">
<div class="pic">
<img src="images/0.jpg">
div>
div>
<div class="box">
<div class="pic">
<img src="images/1.jpg">
div>
div>
<div class="box">
<div class="pic">
<img src="images/2.jpg">
div>
div>
<div class="box">
<div class="pic">
<img src="images/3.jpg">
div>
div>
<div class="box">
<div class="pic">
<img src="images/4.jpg">
div>
div>
<div class="box">
<div class="pic">
<img src="images/5.jpg">
div>
div>
<div class="box">
<div class="pic">
<img src="images/6.jpg">
div>
div>
<div class="box">
<div class="pic">
<img src="images/7.jpg">
div>
div>
<div class="box">
<div class="pic">
<img src="images/8.jpg">
div>
div>
div>
<div class="footer">页脚div>
body>
#main {
width: 1000px;
margin: 0 auto;
position: relative;
}
.box {
padding-top: 15px;
padding-left: 15px;
padding-right: 15px;
float: left;
overflow:hidden;
background-color: #FFF;
}
.pic {
padding: 10px;
border: 1px solid #ccc;
overflow:hidden;
}
.pic img {
width: 198px;
height: auto;
}
.footer {
width: 100%;
height: 60px;
line-height: 60px;
background-color: #177cca;
color: #FFF;
font-family: "Microsoft YaHei";
font-size: 20px;
text-align: center;
}
window.onload = function(){
var oParent = document.getElementById("main");
waterfall(oParent, "box");
}
// getClassBox函数用于获取所有图片元素
function getClassBox(parent, element){
var elements = parent.getElementsByTagName("*"); // 获取所有子元素
var arrBox = []; // 创建数组,用来存储获取到的的图片元素
for(var i=0; i<elements.length; i++){ // 通过for循环遍历main下的所有子元素
if(elements[i].className == element){
arrBox.push(elements[i]); // 如果遍历的子元素中有名为“box”的,将它们保存至arrBox数组中
}
}
return arrBox;
}
function waterfall(parent, element){
var oParent = document.getElementById("main");
var oBoxs = getClassBox(oParent, "box"); // 调用getClassBox函数,将返回值(名为box的子元素)存入oBoxs中
var oBoxW = oBoxs[0].offsetWidth; // 图片元素是等宽的,所以只需要获取其中一个元素的宽度即可
var pageW = oParent.offsetWidth; // 父元素的宽度
var cols = pageW / oBoxW; // 父元素宽 / 子元素宽 = 列数
var Ahrr = []; // 创建数组Ahrr用于存储一行所有图片元素的高度
for(var i=0; i<oBoxs.length; i++){ // 遍历所有图片元素
if(i<cols){
Ahrr.push(oBoxs[i].offsetHeight); // 假如一行有4张图片,那么符合索引号i<4的元素,高度就被存入数组中,也就是一行中的所有图片的高度
} else { // 计算索引号i>4的元素该如何排列
var minH = Math.min.apply(null, Ahrr); // 找到一行元素中,高度最小的元素
var index = getminHindex(Ahrr, minH); // 调用getminHindex函数,获取高度最小的元素的索引号
oBoxs[i].style.position = "absolute"; // 为元素添加绝对定位,将它放入适合的位置
oBoxs[i].style.top = minH + "px"; // 高度为第一行图片中的最小高度
oBoxs[i].style.left = oBoxs[index].offsetLeft + "px"; // 第一行图片中高度最小图片距左侧的距离
Ahrr[index] = oBoxs[i].offsetHeight + minH; // 重新计算第一行的两张图片高度,找到高度最小
}
}
}
// 索引号
function getminHindex(arr, val){
for(var i in arr){
if(arr[i] == val){
return i;
}
}
}
oParent.style.height = getPageHeight() + "px";
// 获取高度
function getPageHeight(){
var oParent = document.getElementById("main");
var oBoxs = getClassBox(oParent, "box");
//获取最后一张图片自身高度
var lastBoxHeight = Math.floor(oBoxs[oBoxs.length - 1].offsetHeight);
//获取最后一张图片距父元素顶部的高度
var lastBoxTop = Math.floor(oBoxs[oBoxs.length - 1].offsetTop);
return lastBoxHeight + lastBoxTop;
}
// 当页面滚动到设定位置后开始加载剩余图片
function checkScrollSlide(){
var oParent = document.getElementById("main");
var oBoxs = getClassBox(oParent, "box");
//获取最后一张图片自身高度的一半距离父元素顶部的高度
var lastBoxH = Math.floor(oBoxs[oBoxs.length - 1].offsetHeight / 2) + Math.floor(oBoxs[oBoxs.length - 1].offsetTop);
//获取滚动页面的高度
var scrollHeight = document.body.scrollHeight||document.documentElement.scrollHeight;
//获取页面视图区域的高度
var clientHeight = document.body.clientHeight||document.documentElement.clientHeight;
//判断
if(lastBoxH < scrollHeight+clientHeight){
return true;
}else{
return false;
}
}
//数据
var data = [
{"src":"9.jpg"},
{"src":"10.jpg"},
{"src":"11.jpg"},
{"src":"12.jpg"},
];
//滚动条事件
window.onscroll=function(){
if(checkScrollSlide()){ // 当条件判断成立时,执行以下代码
var oParent = document.getElementById("main");
for(var i=0; i<data.length; i++){
var dataBox = document.createElement("div"); // 创建一个div元素
dataBox.className = "box"; // 给这个div赋予一个box的类名
oParent.appendChild(dataBox); // 将新创建的div插入父元素中
var dataPic = document.createElement("div");
dataBox.appendChild(dataPic);
var dataImg = document.createElement("img");
dataImg.src = "images/" + data[i].src;
dataPic.appendChild(dataImg);
}
waterfall(oParent, "box"); // 再调用一次waterfall,让后续加载的图片应用其方法
}
oParent.style.height = getPageHeight() + "px";
}
最后需要注意三个部分:
以上就是瀑布流布局用原生JS的实现方式,个人做项目时的一点小心得,虽然能实现出来,但是并不完善,欢迎大家指正;如果有需要得小伙伴可以直接下载源码!源码正在审核,通过后会将链接贴出来