瀑布流 +图片自适应+懒加载

瀑布流 +图片自适应+懒加载

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <title>index</title>
    <style type="text/css">
        *{
            margin: 0;
            padding: 0;
        }
        img{
            border:0;
        }
        ol, ul ,li{list-style: none;}
        img{
            width:200px;
            position:absolute;
            border-radius:20px;
            transition:0.4s;
            overflow:hidden;
        }
        .hehe{
            opacity:1;
            background: #fff;
            margin-top:0;
        }
    </style>
</head>
<body>
<script type="text/javascript">
     createImg();
     function createImg(){
         //创建img图片标签
        for(var i=0;i<30;i++){
            var setImg=document.createElement("img");
            var ran=Math.floor(Math.random()*(350-50+1)+50);//最大高度随机
            var ran2=Math.floor(Math.random()*(20-1+1)+1);
            var ran3=Math.floor(Math.random()*(350-50+1)+50);//最小高度随机
            var p=(setImg.style.width)/(setImg.style.height);//图片的宽高比
            var minHeight;
            var maxHeight;
            setImg.style.minHeight=ran3/p+"px";//高度除以图片宽高比得到不损坏该比例图片
            setImg.style.maxHeight=ran/p+"px";
            setImg.style.width=200/p;//宽度除以宽高比得到不损坏该比例图片
            setImg.src="picture/"+ran2+".png";
            document.body.appendChild(setImg);
        }
        change();
     }
     function change(){
        //确定图片定位
        var aImg=document.getElementsByTagName("img");//获取图片img
        var ksWidth=document.documentElement.clientWidth;//可视宽度
        var n=Math.floor(ksWidth/210);//横向上可视范围内可以放几张图片
        if(n<=0){return};
        var center=(ksWidth-n*210)/2;//(可视宽度-横向上所有图片总宽度)/2=可视宽度上除图片外的范围的中间值
        var arrH=[];//每一行图片的高度
        for(var i=0;i<aImg.length;i++){
            var j=i%n;//下标/横向上可视范围内可以放几张图片的余数  即当前行的图片个数 aImg不可能只搞一行图片 i/n=第几行......第几个
            if(arrH.length==n){//横向上所有图片的高度都在arrH数组里面了
                var min=findMin(arrH);//找到上一行里面高度最小的那张图片 是第几张 
                aImg[i].style.left=center+min*210+"px";//绝对定位的left值 整体的左侧偏移值+左侧所有图片的宽度
                aImg[i].style.top=arrH[min]+10+"px";//绝对定位的top值 上一行里面最低的高度+10 加的10是为了不与上面一行的那张图片紧贴
                arrH[min]+=aImg[i].offsetHeight+10;
            }else{
                //第一行图片的绝对定位的left值与top值;top为0,left为 可视宽度上除图片外的范围的中间值+其img左侧所有图片的宽度
                arrH[j]=aImg[i].offsetHeight;//第一行所有图片的高度
                aImg[i].style.left=center+210*j+"px";
                aImg[i].style.top=0;
            }
        }
     }
    window.onload=window.onresize=window.onscroll=function(){
        var ksHeight=document.documentElement.offsetHeight;
        var scrollT=document.documentElement.scrollTop||document.body.scrollTop;
        var scrollH=document.body.scrollHeight;
        if(ksHeight+scrollT>=(scrollH-200)){
            createImg();
        }
        var getImg=document.getElementsByTagName("Img");
        for (var i = 0; i < getImg.length; i++) {
            var imgtop = getImg[i].offsetTop;
            if(imgtop<ksHeight+scrollT+300){
                getImg[i].className="hehe";
            }
        };
     }
     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>

效果图:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伊昂呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值