实例:瀑布流 留言板
(一)瀑布流
瀑布流实现原理分析
1.ajax文件内容
function ajax(method, url, data, success) {
    var xhr = null;
    try {
        xhr = new XMLHttpRequest();
    } catch (e) {
        xhr = new ActiveXObject('Microsoft.XMLHTTP');
    }
    
    if (method == 'get' && data) {
        url += '?' + data;
    }
    
    xhr.open(method,url,true);
    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('出错了,Err:' + xhr.status);
            }
        }
        
    }
}

2.HTML文件内容
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
<style>
body { margin:0; }
#ul1 { width:1080px; margin:100px auto 0;}
li { width:247px; list-style:none; float:left; margin-right:10px; }
li div { border:1px solid #000; padding:10px; margin-bottom:10px; }
li div img { width:225px; display:block; }
</style>
<script src="ajax.js"></script>
<script>
    window.onload = function(){
        var oUl = document.getElementById('ul1');
        var aLi = oUl.getElementsByTagName('li');
        var iLen = aLi.length;
        var iPage = 1;
        var b = true; //相当于门/开关(如果门是开的 才能进去,然后锁门,做自己的事情,做完,再打开门)
        
        
        getList(); //进行第一页的加载
        
        //获取初始化数据,首先,通过ajax加载数据过来
        function getList(){
            
            ajax('get','getPics.php','cpage='+iPage,function(data){
            
            var data = JSON.parse(data);
            
            //做一下处理,数据不可能无限加载下去,如果数据没了,不能再加载了
            if( !data.length){
              //后续没有数据了
              return; //return出去了,没有机会把门打开了
            
            }
            //把数据一条一条的添加到页面中
            for(var i=0;i<data.length;i++){
                
                //获取高度最短的li
                var _index = getShort();
                
                var oDiv = document.createElement('div');
                var oImg = document.createElement('img');
                oImg.src = data[i].preview;
                oDiv.appendChild(oImg); //把当前图片添加到当前div里
                oImg.style.width = '225px';
                oImg.style.height = data[i].height *(225/data[i].width) + 'px';
                var oP = document.createElement('p');
                oP.innerHTML = data[i].title;
                oDiv.appendChild(oP);
                
                //把整个div添加到最短li里
                aLi[_index].appendChild(oDiv);
            }    
            b = true; //把门打开
        });
        
        }
        //当滚动条发生滚动时,判断最短的li是否进入可视区
        window.onscroll = function(){
                var _index = getShort();
            var oLi = aLi[_index]; //获取最短的li
            var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
            
            //如果当前的li的top值+自身的高<可视区的高+滚动条滚动距离
            if( getTop(oLi)+oLi.offsetHeight < document.documentElement.clientHeight + scrollTop){
                if(b){
                    b = false; //进去以后把门关上,然后做自己的事情
                    iPage++;
                    getList();
                    }
            }
        }
        
        //找到最短一列li再那,封装一个函数
        function getShort(){
                var index = 0; //初始化
            var ih = aLi[index].offsetHeight;//当前li的高度
            for(var i=1; i<iLen; i++){ //for循环 把当前的每一个li取出来
                if(aLi[i].offsetHeight < ih){
                index = i;
                ih = aLi[i].offsetHeight;  //ih等于当前高
                }
            }
            return index;    
        }
        
        //封装一个函数,获取一个元素到页面的绝对值
        function getTop(obj){
                var iTop = 0; //初始化为0
            while(obj){  //当obj存在
                iTop += obj.offsetTop;
                obj = obj.offsetParent;
            }
            return iTop;
        }
            
    }
</script>
</head>

<body>
    <ul id="ul1">
        <li></li>
        <li></li>
        <li></li>
        <li></li>
    </ul>
</body>
</html>

瀑布流 &留言板的更多相关文章

  1. [妙味Ajax]第二课:实例:留言板、瀑布流

    知识点总结 瀑布流原理(固定布局) 总宽度大小固定 每列宽度固定,比如LI,高度自动计算,每列使用float:left来布局 计算最短的一列,将Div插到最短的一列处(li里面包div)(getSho ...

  2. RecylerView完美实现瀑布流效果

    RecylerView包含三种布局管理器,分别是LinearLayoutManager,GridLayoutManager,StaggeredGridLayoutManager,对应实现单行列表,多行 ...

  3. Android瀑布流照片墙实现,体验不规则排列的美感

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/10470797 传统界面的布局方式总是行列分明.坐落有序的,这种布局已是司空见惯,在 ...

  4. android瀑布流效果(仿蘑菇街)

    Android 转载分享(10)  我们还是来看一款示例:(蘑菇街)           看起来很像我们的gridview吧,不过又不像,因为item大小不固定的,看起来是不是别有一番风味,确实如此. ...

  5. 8款实用的Jquery瀑布流插件

    1.网友Null分享Jquery响应式瀑布流布局插件 首先非常感谢网友Null的无私分享,此作品是一款响应式瀑布流布局Jquery插件,网友Null增加了一个屏幕自适应和响应式,响应式就是支持智能手机 ...

  6. RecyclerView实现瀑布流效果(图文详解+源码奉送)

    最近有时间研究了一下RecyclerView,果然功能强大啊,能实现的效果还是比较多的,那么今天给大家介绍一个用RecyclerView实现的瀑布流效果. 先来一张效果图: 看看怎么实现吧: 整体工程 ...

  7. 利用JS实现简单的瀑布流效果

    哈哈, 我又来啦, 在这一段时间里, 我简单的学习了一下javascript(JS), 虽然不是很懂啦, 但是我也简单的尝试着做了点小东西, 就比如现在流行的瀑布流效果, 经过我的努力终于成功的完成了 ...

  8. android 瀑布流效果(仿蘑菇街)

    我们还是来看一款示例:(蘑菇街)           看起来很像我们的gridview吧,不过又不像,因为item大小不固定的,看起来是不是别有一番风味,确实如此.就如我们的方角图形,斯通见惯后也就出 ...

  9. iOS开发-UICollectionView实现瀑布流

    关于瀑布流的实现网上有很多种解法,自定义控件,TableView+ScrollView,UICollectionView是iOS6发布之后用于展示集合视图,算起来已经发布三年左右了,不过知识点是不变的 ...

随机推荐

  1. SQL分组和聚合(Grouping and Aggregates)

    这章应该是难点,也是成为SQL高手的必经之路. 注意有GROUP 语句时,WHERE和HAVING的场合. 前者用于检索前的条件过滤 . 后者用于检索出来结果之后的条件过滤. ========== ; ...

  2. poj 3278:Catch That Cow(简单一维广搜)

    Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 45648   Accepted: 14310 ...

  3. oracle检查点队列(checkpoint queue)

    buffer cache CBC链 按地址链 LRU  干净buffer LRUW  脏buffer  按照冷热 checkpoint queue:链buffer,①链脏块②按buffer第一次脏的时 ...

  4. 使用SQL语句向已有数据表添加约束

    如果向存在数据的表里添加约束,有可能会出现数据不符合检查约束而造成添加约束失败. 如: 这是一个表,为身份证号添加检查约束. USE DEmo--指向当前操作的数据库 GO ALTER TABLE E ...

  5. js判断手机端Android手机还是iPhone手机

    /*判断当前设备是平板.安卓.苹果设备*/ <script type="text/javascript"> function fBrowserRedirect(){ v ...

  6. 19条ANDROID平台设计规范(转)

    1.尺寸以及分辨率: Android的界面尺寸比较流行的有:480*800.720*1280.1080*1920,我们在做设计图的 时候建议是以 480*800的尺寸为标准; 2.界面基本组成元素: ...

  7. windbg的高级玩法

    详见附件  jpg改zip

  8. 第二篇:JMeter实现接口/性能自动化(JMeter/Ant/Jenkins)

    主要是对HTML报告的优化 如果按JMeter默认设置,生成报告如下:

  9. JQuery学习之操作CSS

    样式表: .important{ font-weight:bold; font-size:xx-large; } .blue{ color:blue; } 1.addClass():向被选元素添加一个 ...

  10. git 学习笔记3--status flow

    1.status 通过执行 git status 命令,查看输出的信息来理解文件所处的状态以及可能的动作. 1.1 nothing to commit (working directory clean ...