Masonry + Ajax 实现无限刷新瀑布流
效果就如我的个人站yooao.cc,把我实现的思路分享给大家。
Masonry渲染页面如果有图片时需要imagesLoaded辅助,不然有可能会造成布局重叠。
一个大体的思路:前端取得最后一篇文章的id,下拉时进行Ajax请求添加文章进布局,并同时更新最后一篇文章的id,这样就可往复循环实现无限瀑布流刷新。
下面说说具体的实现:
一、前端
对于Masonry 的基本布局,可以看它的文档。
在页面第一次渲染时,我在容器底部设计一个添加按钮:
<a id="add-button" href="<?php echo Url::to(['post/site/addpost','type_id'=>$type_id,'last_id' => $last_id]) ?>" class="btn btn-danger">加载更多</a>
因为我用的Yii2框架,所以Yii2提供的方法生成href,生成的href就像这样:http://yooao.cc/index.php?r=post/site/addpost&last_id=71
,type_id是对指定类别的文章添加时需要的,last_id就是最后一篇文章的id。
下面是具体的js代码:
$(function(){
var add_href = $('#add-button').attr('href');
var patt = /\d+$/g;
var last_id = patt.exec(add_href)[0];//取得last_id的值
$('#add-button').hide(); //如果不想显示这个添加按钮,可以将它隐藏
var add_ajax_count = 0; //定义一个计数器,避免下拉到底时短时间内进行多次Ajax请求
$(window).on('scroll',function(){
//计数器为0并且滚动条离底部小于10px时,才会进行Ajax请求
if( $(document).scrollTop() + $(window).height() > $(document).height() - 10 && add_ajax_count == 0 ) {
add_ajax_count++; //请求一次则将计数器+1
$.ajax({
type: "post",
url: $('#add-button').attr('href'),
dataType: "json",
async: true,
data: {'last_id' : last_id}, //提供给控制器last_id
beforeSend: function(){
$('#ajax-loader').show(); //加载时显示的图片
},
complete: function(){
$('#ajax-loader').hide();
},
success: function (posts) {
var count_post = posts.length;
if(count_post == 0 ){
return false;
}
//将last_id变更为此次请求的最后一篇文章的id
last_id = posts[posts.length-1].id;
(function(){
var i = 0;
// 这里设置每0.9秒添加一个小块。如果不用计时器而用for,我测试结果是会造成重叠。
setInterval(function(){
if(i >= count_post){
return false;
}
//$elem是每个小块的模版
var $elem = $('<div class="grid-item" >' + posts[i].title + '</div>');
$grid.append($elem);
//等图片加载完后才渲染新添加的小块
$elem.imagesLoaded( function() {
$grid.masonry('appended', $elem );
});
i++;
},900);
})()
//8是我设置的每次添加的文章数,如果此次得到的文章数小于8说明已经到最后,count_post 的值将会为1,之后再下拉不会触发Ajax请求。
if(count_post < 8 ){
return false;
}else{
add_ajax_count--;
}
}
});
}
});
});
二、后端
用Yii2举例,控制器代码:
public function actionAddpost($type_id=null)
{
$model = new Post();
$posts = $model->addPost($type_id);
return json_encode($posts); }
post模型的addPost方法:
public function addPost($type_id=null)
{
if($_POST['last_id'] !== null){
$last = $_POST['last_id'];
}
if($type_id == null){
$posts = Post::find()->where('status = 1 AND id < :id',[':id' => $last])->orderBy('id DESC')->limit(POST::PRE_PAGE_POST)->asArray()->all();
}else{
$posts = Post::find()->where('id < :id AND type_id = :type_id AND status = 1',[':id' => $last,':type_id'=>$type_id])->orderBy('id DESC')->limit(POST::PRE_PAGE_POST)->asArray()->all(); } return $posts;
}
Masonry + Ajax 实现无限刷新瀑布流的更多相关文章
- jquery实现无限滚动瀑布流实现原理
现在类似于pinterest这类的表现效果很火,其实我比较中意的是他的布局效果,而不是那种瀑布流. 虽然我不是特别喜欢这种瀑布流的表现样式,但是还是写了几篇关于无限滚动瀑布流效果的文章,Infinit ...
- jQuery无限载入瀑布流 【转载】
转载至 http://wuyuans.com/2013/08/jquery-masonry-infinite-scroll/ jQuery无限载入瀑布流 好久没更新日志了,一来我比较懒,二来最近也比较 ...
- 玩转Masonry JS库来实现瀑布流Web效果
工作项目中需要制作个Mobile上的Web App的展示,方便快捷访问和评价反馈.在展示页面能看到应用展示图,点击进入Web应用.我不是前端开发者,对HTML, CSS, JS这三剑客仅仅是略知一二. ...
- js中masonry与infinitescroll结合 形成瀑布流
后台:(有点问题 page应该从1开始 而不是从0开始) public function actionExperts() { $top=5; $page=em ...
- Masonry与AmazeUI结合实现瀑布流
做一个图片列表展示,由于照片数量太多,决定用瀑布流来实现 由于之前没有接触过瀑布流,不知从何下手 百度一下大家都在用Masonry 官网 https://masonry.desandro.com/ 这 ...
- django的ajax对应前端的瀑布流方法
html {% load xx %} <!DOCTYPE html> <html lang="en"> <head> <meta char ...
- bootstrap+masonry.js写瀑布流
最近在用bootstrap写一个网站,其中有个图文展示的页面要用到瀑布流的效果.因为项目要求,项目要以bootstrap为基准,不准私自添加内联样式.内部样式,所以,自己写瀑布流就不行了,所以,根据要 ...
- PSCollectionView瀑布流实现
[-] 一基本原理 二具体实现 相关数据结构 视图更新方式 relayoutViews方法 removeAndAddCellsIfNecessary方法 select方法 重用数据块视图机制 三使用方 ...
- ios开发瀑布流框架的应用
一:瀑布流框架的应用:将封装好的瀑布流框架导入,遵守协议 二:代码: #import "HMShopsViewController.h" #import "HMShopC ...
随机推荐
- css透明度的一些兼容测试
前言 网站丢给了外包公司来弄,但是老外写css的时候似乎没有考虑到国内的浏览器市场,于是只用了opacity这个属性来写,当IE8-的浏览器访问的时候,浮动层就像一块大黑斑药膏贴在哪里.很显然,婀娜多 ...
- mysql for python,银行转账模拟
学习中, 本人为初学者.勿喷. #-*- coding:utf-8 -*- import MySQLdb class Tranferaccount(object): def __init__(self ...
- python学习第九天 -- 列表生产式
说说python特有的列表生成式.python的列表的生成式主要用法是什么? 用法就是可以使用简洁的代码生成出list集合. 直接用代码举了例子: 利用列表生成式生成列表[1x2,3x4,5x6,7x ...
- 【南阳OJ分类之语言入门】80题题目+AC代码汇总
小技巧:本文之前由csdn自动生成了一个目录,不必下拉一个一个去找,可通过目录标题直接定位. 本文转载自本人的csdn博客,复制过来的,排版就不弄了,欢迎转载. 声明: 题目部分皆为南阳OJ题目. 代 ...
- 封装JDBC事务操作,执行存储过程测试
Oracle数据库端测试环境见:http://www.cnblogs.com/yshyee/p/4392328.html package com.mw.utils; import java.sql.C ...
- #if defined 的意思?
在读s3c2440a的test程序,其中option.h文件中有段语句为: #define LCD_N35 //#define LCD_L80 //#define LCD_T35 //#define ...
- C#进程间通信--API传递参数(SendMessage)
原文 C#进程间通信--API传递参数(SendMessage) 我们不仅可以传递系统已经定义好的消息,还可以传递自定义的消息(只需要发送消息端和接收消息端对自定义的消息值统一即可).下面的发送和接 ...
- j2ee开源项目——IT学习者博客(itxxzblog v1.0)
大家好,我是IT学习者-螃蟹,已经有近一周的时间没有更新文章了,作为回报,今天起将更新一个大件,也就是螃蟹还在进行中的IT学习者博客. IT学习者博客的初期设计已经完成,功能也已经完成了大半,具备了当 ...
- MVC 部分视图
ASP.NET MVC 里的部分视图,相当于 Web Form 里的 User Control.我们的页面往往会有许多重用的地方,可以进行封装重用. 使用部分视图有以下优点: 1. 可以简写代码. ...
- VC++ CopyFile函数使用方法
BOOL CopyFile( LPCTSTR lpExistingFileName, // pointer to name of an existing file LPCTSTR lpNewFileN ...