实例:瀑布流 留言板
(一)瀑布流
瀑布流实现原理分析
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. Counterfeit Dollar -----判断12枚钱币中的一个假币

     Counterfeit Dollar Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u ...

  2. [LeetCode] Ugly Number II

    Write a program to find the n-th ugly number. Ugly numbers are positive numbers whose prime factors ...

  3. Oracle优化的几个简单步骤

    数据库优化的讨论可以说是一个永恒的主题.资深的Oracle优化人员通常会要求提出性能问题的人对数据库做一个statspack,贴出数据库配置等等.还有的人认为要抓出执行最慢的语句来进行优化.但实际情况 ...

  4. hdu 4031 2011成都赛区网络赛A题 线段树 ***

    就是不知道时间该怎么处理,想了好久,看了别人的题解发现原来是暴力,暴力也很巧妙啊,想不出来的那种  -_-! #include<cstdio> #include<iostream&g ...

  5. 10gRAC运行srvctl报错error while loading shared libraries:

    数据库10g才会有这个错,因为11g的grid和oracle是分开的. [oracle@news01 orcl]$ srvctl /u01/app/oracle/db_1/jdk/jre/bin/ja ...

  6. maven项目Tomcat controller 404

    今天使用tomcat7.0.54启动现有的maven项目,可以正常启动,但是自己所写的所有的@controller注解的请求都报出了404的错误,在网上查了好久也很少找到这个问题,各种方法都尝试了也没 ...

  7. ASCIIHexDecode,RunLengthDecode

    public static byte[] ASCIIHexDecode(byte[] data) { MemoryStream outResult = new MemoryStream(); bool ...

  8. 《大话》之 装饰模式 Vs 建造者模式

    一.简介: 装饰模式:     背景:小菜要见美女娇娇,感慨自己不会着装,怕给娇娇留下坏印象               内容:动态的给一个对象添加一些额外职责               图文并茂: ...

  9. 异步框架asyn4j的原理

    启动时调用init方法 public void init(){ if (!run){ run = true; //工作队列 workQueue = newPriorityBlockingQueue(m ...

  10. UVA 12232 Exclusive-OR(并查集+思想)

    题意:给你n个数,接着三种操作: I p v :告诉你 Xp = v I p q v :告诉你 Xp ^ Xq = v Q k p1 p2 … pk:问你k个数连续异或的结果 注意前两类操作可能会出现 ...