• 【Javascript Demo】图片瀑布流实现


    瀑布流就是像瀑布一样的网站——丰富的网站内容,特别是绚美的图片会让你流连忘返。你在浏览网站的时候只需要轻轻滑动一下鼠标滚轮,一切的美妙的图片精彩便可呈现在你面前。瀑布流网站是新兴的一种网站模式——她的典型代表是pinterest、美丽说、蘑菇街这类型的网站。

    下面是效果:

    核心内容:

    1.先设置布局

    主要HTML代码如下

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

    然后设置宽度固定,高度自适应,.box 相对布局,向左浮动:

    .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.图片位置摆放

    因为图片的高度不一致,先根据页面大小获取第一行的图片数量,然后把第二行第一个张图片放到第一行高度最低的图片下面,以此类推:

    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 = ""+ 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.滚动加载

    然后通过判断鼠标是否滑动到底部,确定是否自动加载数据。

    先判断是否滑到页面底部:

    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

    具体可查看源码

  • 相关阅读:
    浅谈Static关键字
    iOS安装CocoaPods详细过程
    解决最新版 mac os sierra usb网卡不能使用的问题
    pyCharm最新2017激活码
    开发中所使用的渠道(统计分析、分享、第三方登录、短信等)
    oc中文首字母排序
    UIFont 设置字体
    iOS运用runtime全局修改UILabel的默认字体
    OC录制小视频
    OC
  • 原文地址:https://www.cnblogs.com/yc-755909659/p/6554232.html
Copyright © 2020-2023  润新知