js實現瀑布流佈局

window.onload = function () {    var d1 = new Waterfall();    d1.init();};//構造函數function Waterfall() {    this.oColNum =null;//顯示列數    this.oData = null;  //存儲請求數據    this.settings ={        width:300,        autoLoad:true    }}//初始化方法Waterfall.prototype.init = function (opt) {    extend(this.settings,opt);    this.requestData();    var that = this;    window.onresize = function(){        that.init();    };    //滾動無限加載    if(this.settings.autoLoad){        // var that = this;        window.onscroll = function(){            if(getScrollTop() + getWindowHeight() == getScrollHeight()){                that.recreateEle();            }        };    }};//建立itemWaterfall.prototype.createItem = function (Data) {    var owater = document.getElementById("water-content");    var html="";    this.oData = Data;    var _this = this;    // console.log(this.oData.waterfall);    this.oData.waterfall.forEach(function (item,index) {        html +='<div class="waterfall-item" style="width: '+_this.settings.width+"px"+'"><div class="waterfall-img"><img class="waterfall-images" src="'+item.src+'"></div><div class="info"><span>'+item.name+'</span></div></div>';    });    owater.innerHTML=html;};//請求獲取數據Waterfall.prototype.requestData =function () {    var xmlhttp;    var data=null;    var _this=this;    if (window.XMLHttpRequest)    {        //  IE7+, Firefox, Chrome, Opera, Safari 瀏覽器執行代碼        xmlhttp=new XMLHttpRequest();    }    else    {        // IE6, IE5 瀏覽器執行代碼        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");    }    xmlhttp.onreadystatechange=function()    {        if (xmlhttp.readyState==4 && xmlhttp.status==200)        {            data=eval('(' +xmlhttp.responseText+ ')');            //渲染數據            _this.createItem(data);            //存儲img的src            var src =document.getElementsByClassName("waterfall-images");            //循環遍歷建立 new Image;對象,保證onload事件執行,以獲取加載img的div高度            for(var i = 0; i<src.length;i++){                var img = new Image();                img.onload =function () {                    // console.log(img.src);                    //設置位置樣式                    _this.setWaterfall();                };                img.src = src[i].src;            }        }    };    xmlhttp.open("GET","waterfall.json",true);    xmlhttp.send();};//排版佈局Waterfall.prototype.setWaterfall = function () {    this.oColNum = parseInt(viewWidth()/this.settings.width);    var oColNumHeight = [];//存儲每一列的高度    for(var i = 0;i<this.oColNum;i++){        oColNumHeight.push(0);    }    var items =document.getElementsByClassName("waterfall-item");    //遍歷設置元素位置    for(var i = 0; i < items.length; i++){        var curEle = items[i],            idx = 0;//存儲最小值對應索引        var minHeight = oColNumHeight[0];//臨時存儲最小高度        //獲取最小高度,以放置元素        for(var j = 0; j < oColNumHeight.length; j++){            if( minHeight >oColNumHeight[j]){                minHeight = oColNumHeight[j];                idx = j;            }        }        //設置元素位置        curEle.style.left = curEle.offsetWidth * idx +"px";        curEle.style.top = minHeight + "px";        // //更新每列的高度數據        oColNumHeight[idx] = oColNumHeight[idx]+ curEle.offsetHeight;    }    // for (var i = 0; i<items.length ;i++){    //     items[i].className = 'waterfall-item';    // }    // items.forEach(function (item,index) {    //     var curEle = item,    //         idx =0,    //         minHeight = that.oColNumHeight[0];    //     for(var i = 0; i<that.oColNumHeight.length;i++){    //         if(minHeight>that.oColNumHeight[i]){    //             minHeight = that.oColNumHeight[i];    //             idx = i;    //         }    //     }    //     curEle.style.left = that.settings.width*idx +"px";    //     curEle.style.top = minHeight + "px";    //     that.oColNumHeight[idx] = minHeight + curEle.style.height;    //    // })};//滾動無限加載Waterfall.prototype.recreateEle = function () {    var dataSrc = {        "data":[            {                "src":"1.jpg",                "name":"重加載!"            },            {                "src":"5.jpg",                "name":"重加載!"            },            {                "src":"3.jpg",                "name":"重加載!"            },            {                "src":"6.jpg",                "name":"重加載!"            },            {                "src":"9.jpg",                "name":"重加載!"            },            {                "src":"8.jpg",                "name":"重加載!"            },            {                "src":"1.jpg",                "name":"重加載!"            },            {                "src":"5.jpg",                "name":"重加載!"            },            {                "src":"3.jpg",                "name":"重加載!"            },            {                "src":"6.jpg",                "name":"重加載!"            },            {                "src":"9.jpg",                "name":"重加載!"            },            {                "src":"8.jpg",                "name":"重加載!"            }        ]    };    var _this =this;    var oDiv = document.getElementById("water-content");// <div class="waterfall-img"><img class="waterfall-images" src="'+item.src+'"></div><div class="info"><span>'+item.name+'</span></div>    //建立加載的元素    for (var i = 0; i < dataSrc.data.length;i++){        var oItem = document.createElement("div");        oItem.className = "waterfall-item";        oItem.style.width = _this.settings.width +'px';        oDiv.appendChild(oItem);        var oItemImg = document.createElement("div");        oItemImg.className = 'waterfall-img';        oItem.appendChild(oItemImg);        var oImg = document.createElement("img");        oImg.className = 'waterfall-images';        oImg.src =dataSrc.data[i].src;        oItemImg.appendChild(oImg);        var oInfoDiv = document.createElement("div");        oInfoDiv.className = 'info';        oItem.appendChild(oInfoDiv);        var oSpan = document.createElement("span");        oSpan.innerHTML = dataSrc.data[i].name;        oInfoDiv.appendChild(oSpan);    }    //存儲img的src    var src =document.getElementsByClassName("waterfall-images");    // console.log(src);    //循環遍歷建立 new Image;對象,保證onload事件執行,以獲取加載img的div高度    for(var i = src.length - 1; i > src.length - dataSrc.data.length;i--){        var img = new Image();        img.onload =function () {            //設置位置樣式            _this.setWaterfall();            // console.log('.....')        };        img.src = src[i].src;    }};//獲取瀏覽器可視寬度function viewWidth() {    return document.documentElement.clientWidth;}//實現複製function extend(obj1,obj2) {    for(var attr in obj2){        obj1[attr] = obj2[attr];    }}//滾動條在Y軸上的滾動距離function getScrollTop(){    var scrollTop = 0, bodyScrollTop = 0, documentScrollTop = 0;    if(document.body){        bodyScrollTop = document.body.scrollTop;    }    if(document.documentElement){        documentScrollTop = document.documentElement.scrollTop;    }    scrollTop = (bodyScrollTop - documentScrollTop > 0) ? bodyScrollTop : documentScrollTop;    return scrollTop;}//文檔的總高度function getScrollHeight(){    var scrollHeight = 0, bodyScrollHeight = 0, documentScrollHeight = 0;    if(document.body){        bodyScrollHeight = document.body.scrollHeight;    }    if(document.documentElement){        documentScrollHeight = document.documentElement.scrollHeight;    }    scrollHeight = (bodyScrollHeight - documentScrollHeight > 0) ? bodyScrollHeight : documentScrollHeight;    return scrollHeight;}//瀏覽器視口的高度function getWindowHeight(){    var windowHeight = 0;    if(document.compatMode == "CSS1Compat"){        windowHeight = document.documentElement.clientHeight;    }else{        windowHeight = document.body.clientHeight;    }    return windowHeight;}
相關文章
相關標籤/搜索