封装函数部分
var Utils=(function () {
return {
//SSS
loadImg:function (srcList,callBack) {
var img=new Image();
img.num=0;
img.imgList=[];
img.srcList=srcList;
img.callBack=callBack;
img.addEventListener("load",this.loadHandler);
img.src="./img/"+srcList[img.num];
},
loadHandler:function (e) {
// console.log(this.num);
// console.log(this.imgList);
// console.log(this.callBack);
this.imgList.push(this.cloneNode(false));
this.num++;
if(this.num>=this.srcList.length){
this.callBack(this.imgList);
return;
}
//事件侦听没有被删除,只需更改src,加载后仍然触发了该事件,进入该函数
this.src="./img/"+this.srcList[this.num];
},
ce:function (type,style) {
var elem=document.createElement(type);
Object.assign(elem.style,style);
return elem;
},
randomColor:function () {
var col="#";
for(var i=0;i<6;i++){
col+=Math.floor(Math.random()*16).toString(16);
}
return col;
}
}
})();
瀑布流
mian代码部分
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="js/Utils.js"></script>
</head>
<body>
<script>
/*
*
* 1\创建ul,创建li,创建指定数量的li,并且做浮动,设置各li的宽度
* 2\创建一个数组,这个数组里面是统计每个li的当前高度
* 3\创建图片,加载图片,设置图片宽度,获取图片高度
* 4\寻找数组中最小高度的索引值,在li中找到这个索引值对应的列,
* 5\将加载进来图片放入在这个列中并且累加高度存储在数组中对应的元素中
* 6\继续加载新的图片,直到图片加载完成
*
* */
var bodyWidth,colWidth,ul;//定义页面宽度,列宽,ul
let {ce}=Utils;//解构赋值
var minHeight=[],//定义最小高度为一数组
position=3;//图片开始的名称为3
const COL=5,//定义常量列的数量 为5
MARGIN=10;//定义常量margin值为10
init();//执行初始化函数
function init() {//定义初始化函数
document.body.style.margin="0px";//给body设置margin为0
bodyWidth=document.documentElement.clientWidth;//body的宽度是自适应的宽度
colWidth=(bodyWidth-MARGIN*(COL-1))/COL;//列宽是(body宽度-margin*(列减一))/列数
createUl();//执行createUl创建ul
loadImage();//执行加载图片
}
function createUl() {//定义createUl函数,创建ul添加样式
ul=ce("ul",{
listStyle:"none",
margin:"0px",
padding:"0px"
});
for(var i=0;i<COL;i++){//创建li添加样式
var li=ce("li",{
marginLeft:i===0?"0px":MARGIN+"px",
width:colWidth+"px",
float:"left"
});
minHeight.push(0);//给最小高度添加0
ul.appendChild(li);//在ul中添加li
}
document.body.appendChild(ul);//将ul添加到body中
window.addEventListener("resize",resizeUl);//给window添加resize监听事件
}
function loadImage() {//定义loadImage函数
var img=new Image();//定义图片
img.addEventListener("load",loadHandler);//给img添加load(加载)监听事件
img.src="./img/"+position+"-.jpg";
// img.src=`./img/${position}-.jpg`//ES6字符串模板写法
}
function loadHandler(e) {//img加载事件函数
var img=this.cloneNode(false);//复制子节点
var scale=img.width/img.height;//宽高比
// 图片有两个宽高,一个是样式宽高(放在body中以后才可以获取),另一个是图片宽高,不放在页面中也可以获取
img.width=colWidth;//img宽=列宽
img.height=colWidth/scale;//img高=列宽/宽高比
var min=Math.min.apply(null,minHeight);//定义最小值
var index=minHeight.indexOf(min);//在minHeight数组中查找最小值,赋给index
ul.children[index].appendChild(img);//将img放进li的每一项
minHeight[index]+=img.height;//
resizeUl();//执行resizeUl重置ul
position++;
if (position>79){
return;
}
this.src="./img/"+position+"-.jpg";
}
function resizeUl() {//定义resizeUl函数
if (bodyWidth===document.documentElement.clientWidth) return;//如果body宽=页面内容宽度 跳出
bodyWidth=document.documentElement.clientWidth;
colWidth=(bodyWidth-MARGIN*(COL-1))/COL;
for (var i=0;i<ul.children.length;i++){//获取li
var li=ul.children[i];//定义li
li.style.width=colWidth+"px";//li的宽就是列宽
var sum=0;//和为0
for (var j=0;j<li.children.length;j++){//获取img
var img=li.children[j];
var scale=img.width/img.height;//定义img的宽高比
img.width=colWidth;//img宽度=列宽
img.height=colWidth/scale;//img高度=列宽/宽高比
sum+=img.height;//img高度之和
}
minHeight[i]=sum;//记录每个li的高度
}
}
</script>
</body>
</html>
懒加载是建立在瀑布流的基础上来实现的
main代码部分
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="js/Utils.js"></script>
</head>
<body>
<script>
/*
*
* 1\创建ul,创建li,创建指定数量的li,并且做浮动,设置各li的宽度
* 2\创建一个数组,这个数组里面是统计每个li的当前高度
* 3\创建图片,加载图片,设置图片宽度,获取图片高度
* 4\寻找数组中最小高度的索引值,在li中找到这个索引值对应的列,
* 5\将加载进来图片放入在这个列中并且累加高度存储在数组中对应的元素中
* 6\继续加载新的图片,加载图片数量都完成后,让数值归3
*
* */
var bodyWidth,colWidth,ul,img;//定义页面宽度,列宽,ul,img
let {ce}=Utils;//解构赋值
var minHeight=[],//定义最小高度为一数组
position=3;//图片开始的名称为3
const COL=5,//定义常量列的数量 为5
MARGIN=10;//定义常量margin值为10
init();//执行初始化函数
function init() {//定义初始化函数
document.body.style.margin="0px";//给body设置margin为0
bodyWidth=document.documentElement.clientWidth;//body的宽度是自适应的宽度
colWidth=(bodyWidth-MARGIN*(COL-1))/COL;//列宽是(body宽度-margin*(列减一))/列数
createUl();//执行createUl创建ul
loadImage();//执行加载图片
}
function scrollHandler() {//滑动事件
//(页面内容高度-滚动隐藏到内容高度)<2*可视化窗口宽度
if(document.documentElement.scrollHeight-document.documentElement.scrollTop<2*document.documentElement.clientHeight){
// console.log("继续");
window.removeEventListener("scroll",scrollHandler);//移除监听滚动
addImage();//滚动到(页面内容高度-滚动隐藏到内容高度)<2*可视化窗口宽度 加图
}
}
function createUl() {//定义createUl函数,创建ul添加样式
ul=ce("ul",{
listStyle:"none",
margin:"0px",
padding:"0px"
});
for(var i=0;i<COL;i++){//创建li添加样式
var li=ce("li",{
marginLeft:i===0?"0px":MARGIN+"px",
width:colWidth+"px",
float:"left"
});
minHeight.push(0);//给最小高度添加0
ul.appendChild(li);//在ul中添加li
}
document.body.appendChild(ul);//将ul添加到body中
window.addEventListener("resize",resizeUl);//给window添加resize监听事件
}
function loadImage() {//定义loadImage函数
img=new Image();//定义图片
img.addEventListener("load",loadHandler);//给img添加load(加载)监听事件
img.src="./img/"+position+"-.jpg";
// img.src=`./img/${position}-.jpg`//ES6字符串模板写法
}
function loadHandler(e) {//img加载事件函数
var img=this.cloneNode(false);//复制子节点
var scale=img.width/img.height;//宽高比
// 图片有两个宽高,一个是样式宽高(放在body中以后才可以获取),另一个是图片宽高,不放在页面中也可以获取
img.width=colWidth;//img宽=列宽
img.height=colWidth/scale;//img高=列宽/宽高比
var min=Math.min.apply(null,minHeight);//定义最小值
var index=minHeight.indexOf(min);//在minHeight数组中查找最小值,赋给index
ul.children[index].appendChild(img);//将img放进li的每一项
minHeight[index]+=img.height;//
resizeUl();//执行resizeUl重置ul
//(页面内容高度-滚动隐藏到内容高度)/可视化窗口高度 设置图片加载到 下方3倍自身可视化窗口的高度
if((document.documentElement.scrollHeight-document.documentElement.scrollTop)/document.documentElement.clientHeight>=3){
window.addEventListener("scroll",scrollHandler);//添加滚动监听事件
return;
}
addImage();//正常加图 设置图片加载到 下方3倍自身可视化窗口的高度
}
function addImage() {
position++;
if (position>79){
position=3;//加载图片数量都完成后,让数值归3
}
img.src="./img/"+position+"-.jpg";
}
function resizeUl() {//定义resizeUl函数
if (bodyWidth===document.documentElement.clientWidth) return;//如果body宽=页面内容宽度 跳出
bodyWidth=document.documentElement.clientWidth;
colWidth=(bodyWidth-MARGIN*(COL-1))/COL;
for (var i=0;i<ul.children.length;i++){//获取li
var li=ul.children[i];//定义li
li.style.width=colWidth+"px";//li的宽就是列宽
var sum=0;//和为0
for (var j=0;j<li.children.length;j++){//获取img
var img=li.children[j];
var scale=img.width/img.height;//定义img的宽高比
img.width=colWidth;//img宽度=列宽
img.height=colWidth/scale;//img高度=列宽/宽高比
sum+=img.height;//img高度之和
}
minHeight[i]=sum;//和赋给最小高度
}
}
</script>
</body>
</html>