zoukankan      html  css  js  c++  java
  • 【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

    具体可查看源码

  • 相关阅读:
    Android——继续深造——从安装Android Studio 2.0开始(详)
    PHP——安装wampserver丢失MSVCR110.dll
    Marza Gift for GDC 2016
    Retrieve OpenGL Context from Qt 5.5 on OSX
    Space Time Varying Color Palette
    Screen Space Depth Varying Glow based on Heat Diffusion
    Visualization of Detail Point Set by Local Algebraic Sphere Fitting
    Glass Dragon
    Jump Flood Algorithms for Centroidal Voronoi Tessellation
    京都之行
  • 原文地址:https://www.cnblogs.com/yc-755909659/p/6554232.html
Copyright © 2011-2022 走看看