HTml+js+css 实现浏览器图片的瀑布流

可以将照片文件放入images里实现功能,也可以通过遍历字典或者函数递归的方法将所有图片导入做成网页版的相册!
实现文件结构:
HTml+js+css 实现浏览器图片的瀑布流_第1张图片
htmlL部分:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<link rel="stylesheet" href="css/style.css">
<body>
<div id="main">
    <div class="box">
        <div class="pic"><img src="images/1.jpg" alt=""></div>
    </div>
    <div class="box">
        <div class="pic"><img src="images/2.jpg" alt=""></div>
    </div>
    <div class="box">
        <div class="pic"><img src="images/3.jpg" alt=""></div>
    </div>
    <div class="box">
        <div class="pic"><img src="images/4.jpg" alt=""></div>
    </div>
    <div class="box">
        <div class="pic"><img src="images/5.jpg" alt=""></div>
    </div>
    <div class="box">
        <div class="pic"><img src="images/6.jpg" alt=""></div>
    </div>
    <div class="box">
        <div class="pic"><img src="images/7.jpg" alt=""></div>
    </div>
    <div class="box">
        <div class="pic"><img src="images/8.jpg" alt=""></div>
    </div>

    <div class="box">
        <div class="pic"><img src="images/9.jpg" alt=""></div>
    </div>

    <div class="box">
        <div class="pic"><img src="images/10.jpg" alt=""></div>
    </div>

    <div class="box">
        <div class="pic"><img src="images/11.jpg" alt=""></div>
    </div>

    <div class="box">
        <div class="pic"><img src="images/12.jpg" alt=""></div>
    </div>

    <div class="box">
        <div class="pic"><img src="images/13.jpg" alt=""></div>
    </div>

    <div class="box">
        <div class="pic"><img src="images/14.jpg" alt=""></div>
    </div>

    <div class="box">
        <div class="pic"><img src="images/15.jpg" alt=""></div>
    </div>
    <div class="box">
        <div class="pic"><img src="images/16.jpg" alt=""></div>
    </div>
    <div class="box">
        <div class="pic"><img src="images/17.jpg" alt=""></div>
    </div>
    <div class="box">
        <div class="pic"><img src="images/18.jpg" alt=""></div>
    </div>
    <div class="box">
        <div class="pic"><img src="images/19.jpg" alt=""></div>
    </div>
    <div class="box">
        <div class="pic"><img src="images/20.jpg" alt=""></div>
    </div>
    <div class="box">
</div>
<script src="js/waterfall.js"></script>
</body>
</html>

JS模块代码:

//1》写入waterfall函数,为了实现2次调用, a)刷新页面加载一次 b)拖动滚动条的时候加载一次
//2》拖动滚动条的时候,开始加载图片====》事件
window.onload = function(){

    waterfall("main","box");

    var dataImg = {

        arr:[
            {"src":"1.jpg"},
            {"src":"2.jpg"},
            {"src":"3.jpg"},
            {"src":"4.jpg"},
            {"src":"5.jpg"},
            {"src":"6.jpg"}
        ]

    }

    window.onscroll = function(){

        if(scrollTop()){
            for(var i=0;i<dataImg.arr.length;i++){
                var main = document.getElementById("main");

                var oDiv = document.createElement("div");
                oDiv.className = "box";

                var oPic = document.createElement("div");
                oPic.className = "pic";

                var imgs = document.createElement("img");
                imgs.src = "images/"+dataImg.arr[i].src+"";

                main.appendChild(oDiv);
                oDiv.appendChild(oPic);
                oPic.appendChild(imgs);
            }
        }

        waterfall("main","box");

    }
}
function scrollTop(){

    var oBox = getClass("box");
    var oBoxlast = oBox[oBox.length-1];
    var top = document.body.scrollTop || document.documentElement.scrollTop;
    var height = document.body.clientHeight || document.documentElement.clientHeight;

    if(oBoxlast.offsetHeight/2+oBoxlast.offsetTop < top+height){
          return true;
    }else{
          return false;
    }
}

function waterfall(parent,box){

    var oParent = document.getElementById(parent);
    //获取到父节点
    var oBox = getClass(box);
    //获取到box子节点

    var width = document.documentElement.clientWidth || document.body.clientWidth;
    //可视区域的宽度值

    var oBoxWidth = oBox[0].offsetWidth;
    //获取图片的宽度

    var num = Math.floor(width/oBoxWidth);
    //获取可视区域,一行能放入几张图片

    oParent.style.width = num*oBoxWidth+"px";
    //设置父节点的宽度

    var hrr= [];
    for(var i=0;i<oBox.length;i++){

        if(i<num){

            hrr.push(oBox[i].offsetHeight);

        }else{


            var min=Math.min.apply(null,hrr);
            var index = inArray(hrr,min);

            oBox[i].style.position = "absolute";
            oBox[i].style.left =  index*oBoxWidth+"px";
            //设置图片摆放left值  = 最小高度的下标*图片的宽度
            oBox[i].style.top = min+"px";
            //设置图片摆放的top值  = 最小值(上面)图片的高度;

            hrr[index] += oBox[i].offsetHeight;

        }


    }

    console.log(hrr);

}

function inArray(hrr,min){

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

        if(hrr[i] == min){

            return i;
        }
    }
}


function getClass(box){  //获取class名称节点的函数

    //1》把页面上所有的节点获取到
    //2》循环遍历所有节点,进行条件判断,
    //3》符合要求的节点放入到数组中

    var doms = document.getElementsByTagName("*");
    var reg = new RegExp("\\b"+box+"\\b");
    var arr = [];
    for(var i=0;i<doms.length;i++){

        if( reg.test( doms[i].className  ) ){

            arr.push(doms[i]);

        }

    }

    return arr;
}

CSS模块代码:

*{margin:0;padding:0}

#main{
    margin:15px auto;
    position: relative;
}
.box{
    padding:15px 0 0 15px;
    float:left;
}
.pic{
    padding:15px;
    border:1px solid #ccc;
    box-shadow: 0 0 5px #ccc;
    border-radius: 5%;
}
.pic img{
    width:168px;
}

加载实现效果

你可能感兴趣的:(前端JS)