Ajax实例-固定列数的瀑布流

瀑布分页数据去重问题 1. 问题描述将分页、降序数据用瀑布展示的时候,因为数据总量是不断变化的,导致之前第一页的数据可能变成第二页,第三页,这样客户查看的时候可能出现重复数据展示。(最新的数据会插到列表的最前端)。 典型的是活动参与人列表页,因为这部分数据对于业务方来说可能非常重要,不能出现任何的重复或者顺序显示的不对。2. 实际场景用户按照分页降序请求瀑布数据的时候,请求完第一页,在该页停留了 5 分钟,这段时间内 阅读详情

前端页面:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            *{
                margin: 0;
                padding: 0;
            }
            body{
                background: #EDEDED;
            }
            #ul1{
                width: 1000px;
                margin: 0 auto;
                list-style: none;
                overflow: hidden;
                background: #fff;
            }
            #ul1 li{
                width: 240px;
                float: left;
                margin: 0 5px;
                padding: 20px 0;
            }
            #ul1 li div{
                width: 220px;
                padding: 9px;
                border: 1px solid #999;
                margin-bottom: 10px;
            }
            #ul1 li div img{
                width: 220px;
                display: block;
            }
        </style>
        <script src="ajax.js" type="text/javascript" charset="utf-8"></script>
        <script type="text/javascript">
            window.onload=function(){
                var oUl=document.getElementById("ul1");
                var aLi=oUl.getElementsByTagName('li');
                var iLen=aLi.length;
                var ipage=1;
                var flag=true;//定义一个开关,用于控制页面数据的加载

                getList();  //初始加载第一页(cpage=1)的数据

                function getList(){
                    ajax('get','getPics.php','cpage='+ipage,function(data){
                        var data=JSON.parse(data);//字符串转对象

                        if (!data.length) {
                            //数据加载完成
                            return;
                        }

                        var leng=data.length;

                        for (var i=0; i<leng; i++) {//循环每个数据,每次都往最短的li里添加数据
                            var _index=getShort();//最短li的索引

                            var oDiv=document.createElement('div');
                            var oImg=document.createElement('img');
                            oImg.src=data[i].preview;//预览图
                            oImg.style.height=220*data[i].height/data[i].width+'px'; //换算后的预览图高度
                            oDiv.appendChild(oImg);
                            var oP=document.createElement('p');
                            oP.innerHTML=data[i].title;
                            oDiv.appendChild(oP);

                            aLi[_index].appendChild(oDiv);  //往最短的li里面添加数据
                        }
                        //循环结束之后(本页所有数据加载完成之后)才能打开开关,才可加载下一页
                        flag=true;

                    })
                }

                //滚动鼠标触发
                window.onscroll=function(){
                    var _index=getShort();
                    var oLi=aLi[_index];
                    var scrollTop=document.documentElement.scrollTop || document.body.scrollTop;

                    //当 最短li的高度加上到页面的距离 小于 滚动条高度加上屏幕的高度 时加载第二页(cpage=1)的数据
                    if (getTop(oLi)+oLi.offsetHeight < document.documentElement.clientHeight+scrollTop) {
                        if (flag) {
                            flag=false;//关上开关,防止在当前页面加载完成前继续加载其他页面
                            ipage++;//加载下一页数据
                            getList();
                        }
                    }
                }

                //获取最短li的索引值
                function getShort(){
                    var index=0; 
                    var ih=aLi[index].offsetHeight;
                    for (var i=1; i<iLen; i++) {
                        if (aLi[i].offsetHeight<ih) {
                            index=i;
                            ih=aLi[i].offsetHeight;
                        }
                    }
                    return index;
                }

                //获取元素到页面最顶端的距离
                function getTop(obj){
                    var iTop=0;
                    while(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>

php代码:

<?php
header('Content-type:text/html; charset="utf-8"');

/*
API:
    getPics.php
    参数
        cpage : 获取数据的页数
*/
$cpage = isset($_GET['cpage']) ? $_GET['cpage'] : 1;

$url = 'http://www.wookmark.com/api/json/popular?page=' . $cpage;

$content = file_get_contents($url);
$content = iconv('gbk', 'utf-8', $content);

echo $content;

?>

返回数据:

[
    {"id":"630642",
    "referer":"https:\/\/www.behance.net\/gallery\/10983193\/Clara-Daniel",
    "url":"http:\/\/www.wookmark.com\/image\/630642\/clara-daniel-on",
    "width":"600",
    "height":"513",
    "image":"http:\/\/www.wookmark.com\/images\/original\/630642_wookmark.jpg",
    "preview":"http:\/\/www.wookmark.com\/images\/thumbs\/630642_wookmark.jpg"},
    …
]

Ajax.js:

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);
            }
        }

    }
}
jQuery实现瀑布加载与AJAX分页实战 一个典型的 JSON 数据结构如下所示:"data": ["id": 1,"title": "文章标题1","author": "张三",},"id": 2,"title": "文章标题2","author": "李四",字段说明:status: 表示请求结果状态,通常为success或error。data: 实际返回的数据,这里是一个包含文章对象的数组。每个文章对象包含idtitleauthor和thumbnail等字段。 阅读详情

相关推荐

SpringBoot瀑布布局分页

普通分页(物理分页) SpringBoot 需要分页时采用 使用 Mybatis的pagehelper插件来进行分页 // 当前页 private int pageNum; // 每页个数 private int pageSize; // 当期页的数量 private int size; // 第几条开始 private int startRow; // 第几条结束 private int endRow; // 总页数 private int pages; // 上一页 private

qq_40846397的博客 1898

ajax瀑布,Ajax实现的图片瀑布(超详细的哦)

所谓瀑布就是让大小尺寸不同的图片像瀑布一样,整个页面都布满图片而在Ajax中,瀑布可以说是很常见的,利用瀑布无限加载技术,取消了分页按钮,鼠标滑动到底部会自动加载图片先上一下效果图:html结构 和 css样式* {margin: 0;padding: 0;box-sizing: border-box;}img {width: 250px;position: absolute;display...

weixin_36095974的博客 503

瀑布无限加载数据分页案例

瀑布无限加载数据分页案例 效果 项目结构图 实体类 /* 新闻实体类 */ public class News { private Integer id; //主键id private String title; //新闻标题 public News() { } public News(Integer id, String title) { this.id = id; this.title = titl

walker_0312的博客 1502

如何实现瀑布ajax,AJAX实现瀑布触发分页与分页触发瀑布的方法

所谓的瀑布效果就正如轻图床首页效果那样,多个内容相近的栏目紧密排列,尽量使到栏目间的间隙最小(即体布局),并且随着页面滚动条向下滚动,新的数据会追加至当前页面的尾部直到所有数据加载完毕(滚动触发的 Ajax 翻页)。瀑布触发分页这里说一下思路,虽然下面的实例中不能全都用到:1.当进入屏幕时,判断内容是否为空,如果不为空,开始初始化数据。2.当往屏幕下拉时,判断数据的最底部与屏幕高度+滚动的高...

weixin_35255536的博客 469

ajax实现瀑布(如花瓣网的效果)

一、什么是瀑布瀑布,是一种比较行的网站页面布局方式,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部。这种布局方式常见于一些图片为主的网站,就比如说一些常见的网站(如花瓣网) 二、为什么要用瀑布? 1、用户体验好 当用户在浏览网页的时候,用户会产生一种错觉,就是信息是不停的在更新的,这会激发用户的好奇心,使用户不停的往下滑动,带来良好的视...

weixin_41258179的博客 710

JS学习日记--固定列数瀑布

使图片保持固定宽度并利用ajax实现动态无限加载 index.html: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>固定列数瀑布</title> <script src="./ajax.js" type="text/javasc...

weixin_42149770的博客 283

ajax瀑布实例

ajax瀑布实例瀑布:效果分为两类:第一种是固定列数(蘑菇街效果)、第二种:随着窗口的大小,列数发生改变(百度图片、花瓣网)接下来我们主要针对第一种固定列数的情况进行详细的说明接下来我主要介绍的是第一种方式原理:通过ajax从后台获取数据,然后利用dom操作添加到页面中。并且每次添加图片的时候将图片添加到li高度最小的上面,当滚动条滚动的距离与页面可视区距离之和大于li高度最小的高度与其顶部到...

冰雪为融的博客 507

两列瀑布_IT学堂:纯CSS的瀑布布局方法总结

瀑布布局出来好多年了,刚出来时,一般都采用js来实现,涌现了很多比较好的js插件,例如:masonry.js、gridify.js等等。这里就不再详说如何使用了,网上都能找到。今天讨论的是纯CSS实现瀑布布局。一、多个列表并列的瀑布布局法:这种布局方法非常简单,就是将多个列表横向排列,每个列表拥有的项都差不多。图片宽度固定,高度自动撑起来。html:css:.wrap{display:fle...

weixin_35715402的博客 2868

ajax学习笔记之瀑布

蔻蔻 604

AJAX——瀑布布局

瀑布案例 封装jQuery瀑布插件 //特点分析: //1. 跟以前的瀑布不一样的是,这次的瀑布固定版心为1200px //2. 瀑布固定摆放5列,每一列的宽度固定为232px。 //思路分析: //1. 计算每一列之间的缝隙 //2. 初始化一个数组,用户存储每一列的高度 [0,0,0,0,0] //3. 查找数组的最小列,每次都把图片定位到最小列的位置 //4. 更新数组最小...

云中自有锦书 445

java瀑布_jquery实现简单的瀑布布局

是开头都会说的原理瀑布布局有两种,一种是固定列,一种是非固定列。在此主要记述第一种的实现。固定列的特征是:无论页面如何缩放,每行的总列数都一致。一行4列的瀑布从布局的角度来说,就是4个li标签。通过一定的事件(比如滚动条滚动多少px),然后读取之,再把数据动态地添加到页面中。添加数据原则,不是根据li索引值来加,而是根据各列中高度最短的的那列动态添加。否则可能导致页面很难看(左右高度不统一)。...

weixin_34546240的博客 220

瀑布原理

瀑布效果分为两类:蘑菇街效果(第一种:固定列数)、百度图片/花瓣网(第二种:随着窗口的大小列数发生变化 ) 涉及到的问题: 1.数据问题(应用的技术:ajax/jsonp) 2.数据加载之后如何显示在页面上 ,展现出效果。 第一种:蘑菇街式的固定列数 原理: 一个ul,如果有四列,就是有四个li(浮动定位,宽度提前定义,但是高度没有定义),如果一次性的加载10条数据,那么一...

aizhanqian5077的博客 146

网络-16【获取远程图片渲染瀑布

一.瀑布实现原理 先固定排列第一行,将图片的高度存储到数组当中 判断第二行开始(i%5)?=1,寻找数组中最小(Math.min)的一个高度,获取该元素的高度+间距+第一行固定高度/offsetleft+间距 通过绝对定位实现瀑布,再将该元素的高度+=间距放到数组里 二.瀑布计算公式 每一个盒子的宽度 总宽度-(列数-1)*间距/列数 盒子距左间距 (循环数i+1)%列数 ==1 ? ‘0’ : (盒子宽度+间距)*循环数 盒子高度 图片高度*盒子宽度/图片宽度 第一行上间距

Yesterday_Tomorrow的博客 237

js原生瀑布

  背景:     1、在移动端开发,jq文件是显得非常庞大的,所以所有效果尽量用HTML5和原生js实现。     2、本次瀑布固定列数,采用非浮动的另外一种瀑布思想实现的。     3、本次数据来源是json接口     4、考虑到一次性奖json加载到页面数据比较臃肿,所以本demo是当点击加载更多时再重新发出数据请求(非ajax)   先上完整demo代码    ...

weixin_30662109的博客 94

Javascript 瀑布实现的两种方式:固定列数的浮动布局与绝对定位自适应宽度...

瀑布已经火了一段时间了,自己最近研究了一下,网上关于瀑布的帖子也很多,网上一般是说三种方式,固定列数的浮动布局,CSS3列布局,绝对定位布局 推荐两个关于瀑布的帖子,写得比我详细多了: 迅雷的:http://cued.xunlei.com/log031 张鑫旭的:网址太长点我 这里主要是记录一下我的实现方式,用数组模拟的数据,也可以用AJAX实现读取数据,底部提供DEMO代码下载! ...

weixin_30586085的博客 228

Django --图片瀑布布局+动态的渲染

1. 瀑布布局原理 在前端页面布局中,图片放置时存在图片宽度、长度大小不一的情况,在不调整图片大小成一致的情况下,选择瀑布布局是很好的解决图片能紧致放置的一种办法。瀑布如何解决这个问题呢? 设置页面div宽度为固定宽度; 将页面根据图片排列多少列分成相应的div个数,同时设置div的宽度为固定宽度,可以一样,也可以设置为不同。 从后台数据库中拿到图片链接,然后图片的索引下标求余图片列数(i...

hl120841的博客 1011
上一篇: Ajax-跨域
下一篇: 原生js实现带运动的分页效果
della_uii
博客等级 码龄10年 3粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值