【Javascript Demo】圖片瀑布流實現

瀑布流就是像瀑布同樣的網站——豐富的網站內容,特別是絢美的圖片會讓你流連忘返。你在瀏覽網站的時候只須要輕輕滑動一下鼠標滾輪,一切的美妙的圖片精彩即可呈如今你面前。瀑布流網站是新興的一種網站模式——她的典型表明是pinterest、美麗說、蘑菇街這類型的網站。javascript

 

下面是效果:css

 

核心內容:html

1.先設置佈局java

主要HTML代碼以下git

<div id="container">
    <div class="box">
        <div class="content">
            <img src="../imgs/Girls/01.jpg">
        </div>
    </div>
     ...
</div>

而後設置寬度固定,高度自適應,.box 相對佈局,向左浮動:github

.box { position: relative; float: left; }
.content { padding: 2px; border: 1px solid #ccc; border-radius: 2px; }
.content img { width: 234px; height: auto; }
#container { background: #fff none repeat scroll 0 0;  margin: 0 auto; width: auto; }

 

2.圖片位置擺放ajax

由於圖片的高度不一致,先根據頁面大小獲取第一行的圖片數量,而後把第二行第一個張圖片放到第一行高度最低的圖片下面,以此類推:數組

function imgLocation() {
    var cparent = document.getElementById("container");
    //獲取全部類名爲box的元素
    var ccontent = getChildElement(cparent,"box");
    //第一張圖片的寬度
    var imgWidth = ccontent[0].offsetWidth;
    //第一列圖片數量
    var numLine = Math.floor(document.documentElement.clientWidth/imgWidth);
    //設置父容器的寬度
    cparent.style.cssText = "width:"+ imgWidth * numLine + "px";
    //獲取每一張圖片的高度
    var  boxHeightArr = [];
    for(var i=0;i<ccontent.length;i++){
        if(i<numLine){
            //把第一行元素的高度添加到數組中去
            boxHeightArr[i] = ccontent[i].offsetHeight;
        }else {
            //獲取第一行圖片高度最低的圖片,而後把第二行第一種圖片放在其下面,以此類推
            var minHeight = Math.min.apply(null,boxHeightArr);
            //獲取最低高度圖片的Index
            var minIndex = getMinHeightIndex(boxHeightArr,minHeight);
            ccontent[i].style.position = "absolute";
            ccontent[i].style.top = minHeight+"px";
            ccontent[i].style.left = ccontent[minIndex].offsetLeft+"px";
            //從新計算高度
            boxHeightArr[minIndex] += ccontent[i].offsetHeight;
        }
    }
}
function getMinHeightIndex(boxHeightArr, minHeight) {
    for(var i in boxHeightArr){
        if(boxHeightArr[i] === minHeight){
            return i;
        }
    }
}
function getChildElement(parent,className) {
    var contentArr = [];
    var allcontent = parent.getElementsByTagName("*");
    for(var i=0;i<allcontent.length;i++){
        if(allcontent[i].className === className){
            contentArr.push(allcontent[i]);
        }
    }
    return contentArr;
}

 

3.滾動加載瀏覽器

而後經過判斷鼠標是否滑動到底部,肯定是否自動加載數據。app

先判斷是否滑到頁面底部:

function isScrollBottom(){
    var cparent = document.getElementById("container");
    var ccontent = getChildElement(cparent,"box");
    //最後一張圖片出現一半時的頁面高度
    var lastContentHeight = ccontent[ccontent.length - 1].offsetTop + Math.floor(ccontent[ccontent.length - 1].offsetHeight/2);
    // 當前頁面的高度
    var pageHeight = document.documentElement.clientHeight||document.body.clientHeight;
    // 鼠標滾動的高度
    var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
    //是否容許滾動
    return (lastContentHeight < (pageHeight + scrollTop))?true:false;
}

而後監聽滾動事件,當知足加載條件時,加載圖片:

window.onscroll = function () {
    //最後一張圖片出現一半時加載
    if(isScrollBottom()){
        //加載圖片
        var cparent = document.getElementById("container");
        for(var i=0;i<dataImg.data.length;i++){
            var box = document.createElement("div");
            box.className = "box";
            cparent.appendChild(box);
            var content = document.createElement("div");
            content.className = "content";
            box.appendChild(content);
            var img = document.createElement("img");
            img.src = dataImg.data[i].src;
            content.appendChild(img);
        }
        //從新設置圖片位置
        imgLocation();
    }
}

 

PS:也能夠經過Ajax 初始化圖片HTML 代碼:

function initializeImgs() {
    var xmlhttp;
    if (window.XMLHttpRequest)
    {// code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();
    }
    else
    {// code for IE6, IE5
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.onreadystatechange = handleResponse;
    xmlhttp.open("GET",url4girls,true);
    xmlhttp.send();
}
function handleResponse(e){
    //當 onreadystatechange 事件被觸發後,瀏覽器會把一個 Event 對象傳遞給指定的處理函數,target 屬性則會被設爲與此事件關聯的XMLHttpRequest
    if(e.target.readyState == XMLHttpRequest.DONE && e.target.status == 200){ //請求成功
        addImgBox(e.target.responseText);
    }
}
function addImgBox(data) {
    //解析返回的XML文件
    var imgArr = loadXMLString(data).getElementsByTagName("string");
    var cparent = document.getElementById("container");
    for(var i=0;i<imgArr.length;i++){
        var box = document.createElement("div");
        box.className = "box";
        cparent.appendChild(box);
        var content = document.createElement("div");
        content.className = "content";
        box.appendChild(content);
        var img = document.createElement("img");
        img.src = imgArr[i].innerHTML;
        content.appendChild(img);
    }
    imgLocation();
}

 

相關文件

index_by_javascript.html
index_by_javascript.js
index_by_javascript_ajax.html
index_by_javascript_ajax.js
yctools.js
waterfall.css

具體可查看源碼

相關文章
相關標籤/搜索