瀑布流式布局

今天终于搞懂了瀑布流式布局,哈哈,总结下

瀑布流式布局分为两种类型:1、每一列都限定宽度不限定高度的布局(使用浮动)2、宽度不是写死的,是根据页面的放大缩小变化的(定位布局)

瀑布流式布局的重点是:每个新加载的模块都应该显示在原有模块高度最小的下方

注意事项:

图片:接收到的数据在插入到文档的过程中,可能会因为图片的加载速度影响Li的最小高度,可以等图片加载完触发某个事件,再继续加载图片(还未研究出);可以设置图片的相对宽高;

什么时候鼠标滚动的时候继续加载数据:当最小高度的模块显示在文档可视区的时候加载后续内容(需要比较模块offsetHeight+top是否小于页面滚动的距离document.creatElement.scrollTop || document.body.scrollTop)

页码什么时候发出请求:若想一页一页的加载数据,需要设置开关,限制每次请求的只有一页

html文件:

<body>
        <ul id="list">
            <li></li>
            <li></li>
            <li></li>
            <li></li>
        </ul>
</body>

css:

<style type="text/css">
            #list{width:1050px;margin: 10px auto;}
            #list li{width:242px;float: left;margin: 10px;}
            li div{border: 1px solid #999;padding: 10px;margin-bottom: 10px;}
            li img{display: block;width: 220px;}
</style>

js:

<script type="text/javascript">
            window.onload=function(){
                var oUl=document.getElementById("list");
                var aLi=document.getElementsByTagName(‘li‘);
                var ipage=1;
                var b=true;
                getList();
                function getList(){
                    ajax(‘GET‘,‘getPics.php‘,‘cpage=‘+ipage,function(data){
                        var data=JSON.parse(data);
                        if(!data.length){
                            return;
                        }
    //                    console.log(data);
                        for(var i=0;i<data.length;i++){
                            var oDiv=document.createElement(‘div‘);
                            var oImg=document.createElement(‘img‘);
                            oImg.src=data[i].preview;
                            oImg.style.width=‘220px‘;
                            oImg.style.height=oImg.width/data[i].width*data[i].height;
                            oDiv.appendChild(oImg);
                            var oP=document.createElement(‘p‘);
                            oP.innerHTML=data[i].title;
                            oDiv.appendChild(oP);
                            aLi[getShort()].appendChild(oDiv);
                        }
                        b=true;
                    });
                }

                //获取高度最小的li
                function getShort(){
                    var index=0;
                    var oLi=aLi[index].offsetHeight;
                    for(var i=1;i<aLi.length;i++){
                        if(aLi[i].offsetHeight<oLi){
                            index=i;
                            oLi=aLi[i].offsetHeight;
                        }
                    }
                        return index;
                }
                //当鼠标滑动至最小高度的Li显示在可视区的时候,页码数发生变化,重新请求
                window.onscroll=function(){
                    var _index=getShort();
                    var oLi=aLi[_index];
                    var scrollTop=document.documentElement.scrollTop || document.body.scrollTop;
                    if(getPos(oLi).top + oLi.offsetHeight < document.documentElement.clientHeight + scrollTop){
                        if(b){
                            b=false;
                            ipage++;
                            getList();
                        }
                    }
                }
            }
        </script>

引用的js函数:

function getPos(obj) {
    var pos = {left: 0,top: 0};
    while(obj) {
        pos.left += obj.offsetLeft;
        pos.top += obj.offsetTop;
        obj = obj.offsetParent;
    }
    return pos;
}

//ajax处理过程start
function ajax(method, url, data, success) {
    var xhr = new XMLHttpRequest();
    //通过GET方式传递数据
    if(method == "GET" && data) {
        url += ‘?‘ + data;
    }
    xhr.open(method, url, true);
    //通过POST传递数据,设置请求头
    if(method == "GET") {
        xhr.send();
    } else {
        xhr.setRequestHeader(‘content-type‘, ‘application/x-www-form-urlencoded‘);
        xhr.send(data);
    }
    xhr.onreadystatechange = function() {
        if(xhr.readyState == 4) {
            if(xhr.status == 200) {
                //将获取到的字符串转换成对象
                success && success(xhr.responseText);
            } else {
                alert(‘呀,出错了‘ + xhr.status);
            }
        }
    }
}
//ajax处理过程end

效果显示:

时间: 2024-10-27 13:58:29

瀑布流式布局的相关文章

网站布局--瀑布流式布局

瀑布流式布局简介 现在越来越流行一种瀑布流式布局的页面布局方式,希望你没有对这个名字陌生,看张图相信你就知道它是什么了. 怎么样,是不是很熟悉,越来越多的网站采用这种布局,比如 Pinterest (貌似是最早使用这种布局的网站了),Mark之,蘑菇街,点点网,哇哦等等. 瀑布式流式布局,这个名字是很形象的,这种布局适合于小数据块,每个数据块内容相近且没有侧重.通常,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部.这种布局可以说是扩展了原始的格子布局,给用户更加自由,灵活的感

Android RecyclerView详解及实现瀑布流式布局

RecyclerView一个可以代替ListView和GridView的控件,那么RecyclerView到底比他们好在哪里? RecyclerView架构提供了一种插拔式的体验,所以实现了代码的高度解耦,使用起来也异常的灵活. 我们可以通过设置它的LayoutManager控制其显示的方式,通过ItemDecoration控制Item间的间隔,通过ItemAnimator控制Item的增删动画 RecyclerView.LayoutManager提供了三个实现类其中LinearLayoutMa

实现瀑布流式布局的几种方法

1.传统多列浮动 定义多个div左浮动成多列,在每个div里插入一推也是左浮动的div.于是就实现了那种参差不齐的效果. 2.直接用css3样式实现 定义一个div直接设置它的属性(column-count:列数),把那些小块div放在这个大的div中就能实现这种瀑布流效果. 但这种css3属性在一些低级浏览器可能无法实现. 3.绝对布局方式实现 实现效果最优,但最麻烦. 需要实现知道数据块高度,如果其中包含图片,需要知道图片高度: JS 动态计算数据块位置,当窗口缩放频繁,可能会狂耗性能. 具

含有过滤功能的android流式布局

FilterFlowLayout 含有过滤功能的流式布局, 参考FlowLayout 可以去除宽度不在范围(比例或真实值)内的子view 可以设置最大行数 可以添加组件间水平间距 可以添加行间距 系统要求 Android 4.0以上 快速使用 <me.codeboy.android.lib.FilterFlowLayout xmlns:cb="http://schemas.android.com/apk/res-auto" android:id="@+id/filter

Android自定义之流式布局

流式布局,好处就是父类布局可以自动的判断子孩子是不是需要换行,什么时候需要换行,可以做到网页版的标签的效果.今天就是简单的做了自定义的流式布局. 具体效果: 原理: 其实很简单,Measure  Layout.只需要这两个步骤就可以搞定了.完全的手动去Measure  Layout. 我们看一下代码. 解释就在代码里面做注释了,因为使用为知笔记写的博客,格式不符合代码格式.大家可以看具体的源码.最后又源码下载地址. 1.Measure  测量 @Override protected void o

GUI布局:边界布局、流式布局、网格布局、卡片布局

边界布局 package guiTest; //JFrame默认的是边界布局BorderLayout import java.awt.BorderLayout; import javax.swing.JButton; import javax.swing.JFrame; public class BorderLayoutDemo { public static void main(String[] args) { JFrame f = new JFrame("边界布局BorderLayout&q

c# winform panel 流式布局 panel块可自动排列

代码下载地址  http://download.csdn.net/detail/simadi/7677053 c# winform panel 流式布局 panel块可自动排列,布布扣,bubuko.com

css3流式布局

css3布局方式: 不推荐使用float,有时候使用浮动的时候,对于可适应的流氏布局,无法胜任. 推荐使用css3的display:webkit-box. 使用的html代码 <div class="warp"> <div class="one"> </div> <div class="two"></div> <div class="three"><

静态布局、自适应布局、流式布局、响应式布局、弹性布局简析

近期学习,有很多感想,有时候看似相近的概念,其实意义却不相同.所以学习要针对不同的名词有明确的区分意识. 抽空时间,打算学习下display:flex;本以为就是一个小小的知识点,正式去研究的时候,才发现display:flex;有很多内容,能实现很多效果.比如三栏布局(左右两栏固定,中间栏自适应),圣杯布局. 后来想着经常听到流式布局,自适应布局,响应式布局,他们有什么区别呢,就去搜了许多内容查看,才发现每种布局都有优缺点和不同使用场景. 静态布局:给页面元素设置固定的宽度和高度,单位用px,