瀑布流JS插件

jerry thinkphp 2016年01月18日 收藏
自己编写的一个JS瀑布流插件,里面有详细调用方法,代码易懂,新手学习,高手可路过。
  1. /**
     *waterfall.js文件
     * 瀑布流插件
     * @author    Gardenia <fooying@qq.com>
     * window.onload = function(){
     *        waterfallinit({:''})//配置参数
     *        function success(data){}//添加节点函数,返回true 
     *    }
     *只需为瀑布流初始化函数 waterfallinit
     *配置一下函数
     *父类ID:                parent:'main',
     *子类ID:                 pin:'pin',
     *判断ajax是否返回成功:    successFn:success,
     *loading显示的图片地址     loadImgSrc:'./pic/load.gif',
     *没有更多数据显示的图片地址    endImg:'./pic/end.gif',
     *数据请求地址                requestUrl:'request.php',
     *每次请求的图片数,默认15           requestNum:15,
     *选择显示时风格,可以不设置默认为1                style:4,
     *设置loading图片的ID     loadImgId:loadImg,
     *
     *
     *添加数据到html successFn函数
        function success(data){
            var oParent = document.getElementById('main'); //获取父节点
            for(i in data){
                    var oPin = document.createElement('div');
                    oPin.className = 'pin';
                    oParent.appendChild(oPin);
                    var oBox = document.createElement('div');
                    oBox.className = 'box';
                    oPin.appendChild(oBox);
                    var oImg = document.createElement('img');
                    oImg.src = './pic/'+data[i].src;
                    oBox.appendChild(oImg);
            }

            return true;
        }
    }
     *
     *
     **/
    function waterfallinit(json){
        var parent = json.parent;
        var pin = json.pin;
        var successFn = json.successFn;
        var loadImgSrc = json.loadImgSrc;
        var endImgSrc = json.endImgSrc;
        var requestUrl = json.requestUrl;
        var requestNum = json.requestNum ? json.requestNum:10;
        var style = json.style;
        var loadImgId = json.loadImgId;
        var endImgId = json.endImgId;
        var oParent = document.getElementById(parent); //获取父节点
    /*最初加载*/
        ajaxRequest();

    /*触动滚动条循环加载*/
        var ajaxState = true;
        var page = 0;
        var endData = true;             
        window.onscroll = function(){
            if(checkScrollSite() && ajaxState && endData){ 
                page++;
                ajaxState = false;
                ajaxRequest();
            }
        }
    /*判断数据库数据返回数据是否为空*/
        function checkData(data){
            var oParent = document.getElementById(parent); //获取父节点
            var bool = false;
            if(data[0] != undefined){
                bool = true;
            }else{
                bool = false;
            }
            return bool;
        }
    /*ajax请求*/
        function ajaxRequest(){
                $.ajax({
                    type:'GET',
                    url:requestUrl,
                    data:'page='+ page +'&requestNum=' + requestNum,
                    dataType:'json',

                    beforeSend:function(){
                        if(page){

                            var aPin = getClassObj(oParent,pin); //父节点下的class子节点数组
                            var lastPinH = aPin[aPin.length-1].offsetTop+
                                Math.floor(aPin[aPin.length-1].offsetHeight);
                            
                            addImg(loadImgSrc,loadImgId);
                        }
                    },
                    success:function(data){
                        if(successFn(data)){
                            waterfall(parent,pin,style);
                            endData = checkData(data);
                            if(!endData){
                                addImg(endImgSrc,endImgId);
                            }
                        }

                    },
                    complete:function(data){
                        if(page){
                            oParent.removeChild(document.getElementById(loadImgId));
                        }    
                        ajaxState = true;

                    }
                })
        }

    /*校验滚动条位置*/
        function checkScrollSite(){
            //var aPin = getClassObj(oParent,pin); //父节点下的class子节点数组
            var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
            var documentH = document.documentElement.clientHeight; 
            return getLastH()<scrollTop+documentH ? true:false;
        }

    /*获取最末尾最短高度*/
        function getLastH(){
            var aPin = getClassObj(oParent,pin); //父节点下的class子节点数组
            var lastPinH = aPin[aPin.length-1].offsetTop+Math.floor(aPin[aPin.length-1].offsetHeight);
            return lastPinH;
        }    

        /*增加图片标签,如:loading图标*/
        function addImg(src,id){
            var loadImg = document.createElement('img');
            loadImg.src = src;
            loadImg.id  = id;
            oParent.appendChild(loadImg);
            loadImg.style.position = 'absolute';
            loadImg.style.top = getLastH() + 'px';
            loadImg.style.left = Math.floor(oParent.offsetWidth - loadImg.offsetWidth)/2 + 'px';
                
        }
    }

    /*
    *瀑布流排列
    *
    */
    function  waterfall(parent,pin,style){
        var oParent = document.getElementById(parent); //获取父节点
        var aPin = getClassObj(oParent,pin); //父节点下的class子节点数组
        //alert(aPin.length);
        var iPinW = aPin[0].offsetWidth; //获取固定宽度
        var num = Math.floor(oParent.offsetWidth/iPinW); //获取横向组数
        oParent.style.cssText = 'width:' + num*iPinW +'px;margin:0px auto;position:relative'; //父类具体宽度
        
        var compareAarr = [];
        var copareAll =[];
        //alert(aPin.length);
        for(var i=0;i<aPin.length;i++){ //根据子节点长度
            if(i<num){
                compareAarr[i] = aPin[i].offsetHeight;//获取每个子节点的高度
            }else{
                var minH = Math.min.apply('',compareAarr);//获取最小值
                var minKey = getMinKey(compareAarr,minH);//获取最小值的键值
                compareAarr[minKey] += aPin[i].offsetHeight;
                setmoveStyle(aPin[i],minH,aPin[minKey].offsetLeft,i,style);

            }
        }


    }

    /*
    *通过class选择元素 
    */
    function getClassObj(parent,className){
        var obj = parent.getElementsByTagName('*');
        var result = [];
        for (var i = 0; i < obj.length; i++) {
            if (obj[i].className == className) {
                result.push(obj[i]);
            }
        }
        return result;
    }


    /**设置运动风格
    *setmoveStyle
    *@param  obj 对象
    *@param  top 飞入布局 
    *@param  left 飞入布局
    *@param  index 
    *@param  style 飞入形势选择
    *1、从底下中间飞入
    *2、透明度渐现
    *3、从左右两边飞入
    *4、从各组下渐现飞入
    **/

    var startNum = 0;
    function setmoveStyle(obj,top,left,index,style){
        /*if(index <= startNum){
            return;
        }*/
        obj.style.position = 'absolute';
        switch(style){
            case 1: //从底下中间飞入
            obj.style.top = getTotalH() + 'px';
            obj.style.left = Math.floor((document.documentElement.clientWidth-obj.offsetWidth)/2) + 'px';
            $(obj).stop().animate({
                top:top,
                left:left
            },600);
            break;
            case 2://渐现
            obj.style.top = top + 'px';
            obj.style.left = left + 'px';
            obj.style.apacity = 0;
            obj.style.filter = 'alpha(opacity=0)';
            $(obj).stop().animate({
                opacity:1,
            },1000);
            break;
            case 3:
            obj.style.top = getTotalH() + 'px';

            if(index % 2){
                obj.style.left = -obj.offsetWidth + 'px';
            }else{
                obj.style.left = document.documentElement.clientWidth + 'px';
            
            }
            $(obj).stop().animate({
                top:top,
                left:left
            },1000);
            break;
            case 4:
            obj.style.top = getTotalH() + 'px';
            obj.style.left = left +'px';
            $(obj).stop().animate({
                top:top,
                left:left
            },1600);
            break;


        }
        //更新索引
        startNum = index;
    }


    /*获取滚动条的高度,总高度*/
    function getTotalH(){
        return document.documentElement.scrollHeight || document.body.scrollHeight; 
        
    }
    /** 
    *获取图片数组最小值的键值
    *
    */
    function getMinKey(arr,minH){
        for (key in arr) {
            if(arr[key] == minH){
                return key;
            }
        }
    }

    /*先图片返回数据从而固定布局,一般不用*/
    function callBack(w,h,imgObj){
        //alert(w+':'+h);
        imgObj.style.width = 205 + 'px';
        var scale =  w/205;
        imgObj.style.height = Math.floor(h/scale)+ 'px';
    }
    /*先返回数据固定好布局后,图像加载*/
    function loadImg(url,fn,imgObj){ 
        var img = new Image();
        img.src = url;
        if(img.complete){
            //alert(img.width);
            fn(img.width,img.height,imgObj);
        }else{
            img.onload = function(){
                fn(img.width,img.height,imgObj);
            }
        }
    }
主页文件:index.html
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <script type="text/javascript" src="./jquery-1.7.2.min.js"></script>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
    <title>瀑布流第一课</title>
    <style type="text/css">
        #maina {
            width: 1100px;
        }
        #maina .pina{
            width: 225px;
            height: auto;
            padding: 15px 0px 0px 15px;
            float: left;
        }
        #maina .pina .box{
            width: 205px;
            height: auto;
            padding: 10px;
            background: #fff;
            border: 1px solid #ccc;
            box-shadow: 0px 0px 6px #ccc;
            border-radius: 5px;
        }
        #maina .pina .box img{
            width: 205px;
        }

    </style>

    <script type="text/javascript" src="./waterfall.js"></script>
    <script type="text/javascript">
    window.onload = function(){
        waterfallinit({
            parent:'maina',
            pin:'pina',
            successFn:success,
            loadImgSrc:'./pic/load.gif',
            endImgSrc:'./pic/end.jpg',
            requestUrl:'request.php',
            requestNum:5,
            style:2,
            loadImgId:'loadImg',
            endImgId:'endImg',

        })

        function success(data){
            var oParent = document.getElementById('maina'); //获取父节点
            for(i in data){
                    var oPin = document.createElement('div');
                    oPin.className = 'pina';
                    oParent.appendChild(oPin);
                    var oBox = document.createElement('div');
                    oBox.className = 'box';
                    oPin.appendChild(oBox);
                    var oImg = document.createElement('img');
                    oImg.src = './pic/'+data[i].src;
                    oBox.appendChild(oImg);
            }

            return true;
        }
    }

    </script>
    </head>
    <body>
    <div id="maina">
        
    </div>

    </body>
    </html>
请求文件:request.php
  1. <?php
    header('Content-type:text/html;charset=utf-8');
    $mysql = mysql_connect('localhost','root','');
    mysql_query('set names utf8',$mysql);
    mysql_select_db('waterfall',$mysql);
    $page = isset($_GET['page'])?(int)$_GET['page']:0;
    $num = isset($_GET['requestNum'])?(int)$_GET['requestNum']:5;
    $startNum = $page*$num;
    $rows = mysql_query('select * from demo limit '.$startNum.','.$num.'');
    $data = array();
    while($row = mysql_fetch_assoc($rows)){
        $data[] = $row;
    }
    echo json_encode($data);
    ?>

数据库waterfall创建代码:

--
-- 表的结构 `demo`
--
  1. CREATE TABLE IF NOT EXISTS `demo` (
      `id` int(10) NOT NULL AUTO_INCREMENT,
      `title` char(15) COLLATE utf8_bin NOT NULL,
      `src` char(13) COLLATE utf8_bin NOT NULL,
      `time` int(13) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1;