AJAX固定列瀑布流布局及实现

AJAX固定列瀑布流布局及实现

注意问题:1,滑动滚动条加载多次翻页效果,影响加载速度;
2,数据加载未完成,从而未撑开元素,影响计算获取到高度最低的元素,从而使布局不均匀
静态布局
html

css

形式如图所示,最开始4个li里面都没有东西,我们的工作就是往li里面放入东西,因为放入的东西的高度不一定一致,所以并不是从左至右一次放入,应该是给高度最低的li中加入东西。

<script type="text/javascript">
            window.onload=function(){

                //获取ul以及li元素

                var oUl=document.getElementById('ul1');
                var oLi=document.getElementsByTagName('li')
                var iPage=1;//为后面滑动滚轮申明的变量
                getList();

                //初始化页面
                function getList(){
                    //创建一个ajax对象(适用于ie7及以上)
                    var xhr=new XMLHttpRequest();
                    //open()方法,第一个参数:打开方式;第二个参数:地址;第三个参数:是否异步
                    xhr.open('get','getPics.php?cpage='+'iPage',true);
                    //提交发送请求
                    xhr.send();
                    //数据的获取
                    xhr.onreadystatechange=function(){
                        //当响应内容解析完成,可以在客户端调用了
                        if(xhr.readyState==4){
                            //获取到的数据
                                var date=xhr.responseText;
                                //将获取到的数据转化为数组格式
                                var date1=JSON.parse(date);
                                //当获取到的数据没有了的时候,停止
                                if(!date1.length){
                                    return;
                                }
                                //循环往li中加入获取到的数据
                                for(var i=0;i<date1.length;i++){

                                    var _index=getshort();//获取到高度最低的Li元素,方法见下
                                    var oDiv=document.createElement('div');//创建div元素
                                    var opic=document.createElement('img');//创建img元素
                                    var oP=document.createElement('p');//创建p元素

                                    //将img与p元素加入div中
                                    oDiv.appendChild(opic);
                                    oDiv.appendChild(oP);
                                    opic.src=date1[i].preview;//将图片的地址设置为获取到的数据中的地址
                                    opic.style.width='228px';
                                    opic.style.height=date[i].height*(228/date1[i].width)+'px';//防止图片未加载完成,导致获取到的最低的li元素不准确,影响布局,所以将img的大小固定撑开;
                                    oP.innerHTML=date1[i].title;
                                    oLi[_index].appendChild(oDiv);//将创建好的div元素添加入高度最低的li中
                                }
                                b=true;//实现一次加载后,将b设置为true,实现下文的翻页效果

                        }

                    }

                }

                //滚轮触发事件,实现流的效果
                window.onscroll=function(){

                    var _index=getshort();
                    var aLi=oLi[_index];

                    var scrollTop=document.documentElement.scrollTop || document.body.scrollTop;
                    if(getTop(aLi)+aLi.offsetHeight<document.documentElement.clientHeight+scrollTop){
                        //当元素占位高度与元素到body的高度之和小于可视区高度与滚轮高度的时候触发翻页(流)的效果
![这里写图片描述](http://img.blog.csdn.net/20161023175507867)
                        if(b){
                            b=false;//***防止拉动滚动条触发多次翻页效果,影响加载速度***,当b为True时,触发翻页,然后将b设置为false;当一次加载完成后,将b设置为true。再触发翻页效果,一次循环
                            iPage++;//翻页,实现流的效果
                            getList();//往高度最低的li中加入东西
                        }

                    }
                }

                //得到高度最低的li元素
                function getshort(){

                    var index=0;
                    var ih=oLi[index].offsetHeight;
                    //使第一个li元素与其余的li元素相比较,将高度低的元素赋值给ih,高度低的li元素的索引赋值给index
                    for(var i=1;i<oLi.length;i++){

                        if(oLi[i].offsetHeight<ih){

                            ih=oLi[i].offsetHeight;
                            index=i;
                        }
                    }
                    return index;//返回最低的Li元素的索引值
                }
                //获取元素到Body的距离
                function getTop(obj){

                    var iTop=0;
                    while(obj){
                        iTop+=obj.offsetTop;
                        obj=obj.offsetParent;
                    }
                    return iTop;
                }
            }
        </script>
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
淘宝瀑布布局是一种布局,它的特点是每个元素的宽度相等,但高度不定,可以根据内容自适应。在淘宝中,瀑布布局常用于商品表的展示。 实现淘宝瀑布布局的方式有很多,其中一种比较简单的方法是使用CSS3中的布局(column layout)。具体步骤如下: 1. 设置样式 首先,我们需要设置一个容器(例如 div),并为其设置数、间距、元素间距等样式: ``` .container{ column-count: 3; /* 数 */ column-gap: 10px; /* 间距 */ padding: 10px; /* 内边距 */ } .item{ margin-bottom: 10px; /* 元素间距 */ } ``` 2. 加载数据 接下来,我们通过 AJAX 或其他方式加载商品数据,并将其动态地插入到容器中。为了实现瀑布效果,需要按照以下步骤进行操作: - 计算每个元素的高度 - 将元素插入到高度最小的中 - 更新该的高度 代码示例: ``` $.ajax({ url: 'data.php', success: function(data){ var items = JSON.parse(data); // 商品数据 var container = $('.container'); var colHeight = [0, 0, 0]; // 高度 for(var i=0; i<items.length; i++){ var item = $('<div class="item"></div>').html(items[i].title); container.append(item); var minHeight = Math.min.apply(null, colHeight); // 最小高度 var minIndex = colHeight.indexOf(minHeight); // 最小索引 item.css({ left: minIndex * (item.outerWidth() + 10), // 宽度 + 间距 top: minHeight }); colHeight[minIndex] += item.outerHeight() + 10; // 元素高度 + 元素间距 } } }); ``` 这样,我们就完成了淘宝瀑布布局实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值