jQuery向下滚动即时加载内容实现的瀑布流效果


Posted in PHP onJanuary 07, 2016

下拉滚动条或鼠标滚轮滚动到页面底部时, 动态即时加载新内容。

后台用 json 传输数据, 示例程序中只写了示例数组。数据也只设置了两个属性, 需根据实际应用改写。

页面用了 ul li 做为容器, 每个 li 表示一列

<ul id="stage"> 
 <li></li> 
 <li></li> 
 <li></li> PHP和Jquery和ajax实现下拉淡出瀑布流效果(无需插件) 
 <li></li> 
</ul>

JS代码

/* 
@版本日期: 版本日期: 2012年4月11日 
@著作权所有: 1024 intelligence ( http://www.1024i.com ) 
获得使用本类库的许可, 您必须保留著作权声明信息. 
报告漏洞,意见或建议, 请联系 Lou Barnes(iua1024@gmail.com) 
*/ 
$(document).ready(function(){ 
 loadMore(); 
}); 
$(window).scroll(function(){ 
 // 当滚动到最底部以上100像素时, 加载新内容 
 if ($(document).height() - $(this).scrollTop() - $(this).height()<100) loadMore(); 
}); 
function loadMore() 
{ 
 $.ajax({ 
  url : 'data.php', 
  dataType : 'json', 
  success : function(json) 
  { 
   if(typeof json == 'object') 
   { 
    var oProduct, $row, iHeight, iTempHeight; 
    for(var i=0, l=json.length; i<l; i++) 
    { 
     oProduct = json[i]; 
     // 找出当前高度最小的列, 新内容添加到该列 
     iHeight = -1; 
     $('#stage li').each(function(){ 
      iTempHeight = Number( $(this).height() ); 
      if(iHeight==-1 || iHeight>iTempHeight) 
      { 
       iHeight = iTempHeight; 
       $row = $(this); 
      } 
     }); 
     $item = $('<div><img src="'+oProduct.image+'" border="0" ><br />'+oProduct.title+'</div>').hide(); 
     $row.append($item); 
     $item.fadeIn(); 
    } 
   } 
  } 
 }); 
}

下面再给大家分享一段代码:PHP Jquery和ajax相结合实现下拉淡出瀑布流效果

我的风格,废话不多说,感兴趣的朋友直接看下文代码: 

前台:

<br><?php <br>$category=$this->getMyVal('category',$_GET);<br>$xiaohuaList=Xiaohua::model()->getXiaohao($category); //打开页面默认显示的数据<br>?><br><br><div id="waterfall">
<?php foreach ($xiaohuaList as $xiaohua):?>
<?php $q_id=$xiaohua->id;?>
<div class="cell m-bg item-h border_h">
<div class="border-solid-b padding-b-5 text-center"><span class="g-bg glyphicon glyphicon-sunglasses margin-r-5" aria-hidden="true"></span><strong class="color-5 fx_t_<?php echo $q_id;?>"><?php echo CHtml::encode($xiaohua->title);?></strong></div>
<div class="padding-t-5 fx_c_<?php echo $q_id;?>"><?php echo $xiaohua->content;?></div>
<div class="padding-t-5 text-right"><span onclick="fx(<?php echo $q_id;?>);" class="fx cursor_p" data-id="<?php echo $q_id;?>"><span class="g-bg glyphicon glyphicon-share-alt margin-r-5" aria-hidden="true"></span>分享</span></div>
</div>
<?php endforeach;?>
</div>
<script>
var opt={
getResource:function(index,render){//index为已加载次数,render为渲染接口函数,接受一个dom集合或jquery对象作为参数。通过ajax等异步方法得到的数据可以传入该接口进行渲染,如 render(elem)
var html='';
var _url='<?php echo $this->createUrl('listXiaohua');?>';
$.ajax({
type: "get",
url: _url,
dataType : "json",
async:false,
success: function(data){
for( var i in data){
var q_id=data[i].id;
html+='<div class="cell m-bg item-h border_h"><div class="border-solid-b padding-b-5 text-center"><span class="g-bg glyphicon glyphicon-sunglasses margin-r-5" aria-hidden="true"></span><strong class="color-5 fx_t_'+q_id+'">'+data[i].title+'</strong></div><div class="padding-t-5 fx_c_'+q_id+'">'+data[i].content+'</div>'
+'<div class="padding-t-5 text-right"><span onclick="fx('+q_id+');" class="fx cursor_p" data-id="'+q_id+'"><span class="g-bg glyphicon glyphicon-share-alt margin-r-5" aria-hidden="true"></span>分享</span></div></div>';
}
}});
return $(html);
},
column_width:376,
column_space:10,
auto_imgHeight:true,
insert_type:1
}
$('#waterfall').waterfall(opt);
</script>

后台:

public function actionListXiaohua() {
$xiaohuaList=Xiaohua::model()->getXiaohua();//获取笑话信息
echo CJSON::encode($xiaohuaList);
}

js:

;(function($){
var
//参数
setting={
column_width:240,//列宽
column_className:'waterfall_column',//列的类名
column_space:2,//列间距
cell_selector:'.cell',//要排列的砖块的选择器,context为整个外部容器
img_selector:'img',//要加载的图片的选择器
auto_imgHeight:true,//是否需要自动计算图片的高度
fadein:true,//是否渐显载入
fadein_speed:600,//渐显速率,单位毫秒
insert_type:1, //单元格插入方式,1为插入最短那列,2为按序轮流插入
getResource:function(index){ } //获取动态资源函数,必须返回一个砖块元素集合,传入参数为加载的次数
},
//
waterfall=$.waterfall={},//对外信息对象
$waterfall=null;//容器
waterfall.load_index=0, //加载次数
$.fn.extend({
waterfall:function(opt){
opt=opt||{};
setting=$.extend(setting,opt);
$waterfall=waterfall.$waterfall=$(this);
waterfall.$columns=creatColumn();
render($(this).find(setting.cell_selector).detach(),false); //重排已存在元素时强制不渐显
waterfall._scrollTimer2=null;
$(window).bind('scroll',function(){
clearTimeout(waterfall._scrollTimer2);
waterfall._scrollTimer2=setTimeout(onScroll,300);
});
waterfall._scrollTimer3=null;
$(window).bind('resize',function(){
clearTimeout(waterfall._scrollTimer3);
waterfall._scrollTimer3=setTimeout(onResize,300);
});
}
});
function creatColumn(){//创建列
waterfall.column_num=calculateColumns();//列数
//循环创建列
var html='';
for(var i=0;i<waterfall.column_num;i++){
html+='<div class="'+setting.column_className+'" style="width:'+setting.column_width+'px; display:inline-block; *display:inline;zoom:1; margin-left:'+setting.column_space/2+'px;margin-right:'+setting.column_space/2+'px; vertical-align:top; overflow:hidden"></div>';
}
$waterfall.prepend(html);//插入列
return $('.'+setting.column_className,$waterfall);//列集合
}
function calculateColumns(){//计算需要的列数
var num=Math.floor(($waterfall.innerWidth())/(setting.column_width+setting.column_space));
if(num<1){ num=1; } //保证至少有一列
return num;
}
function render(elements,fadein){//渲染元素
if(!$(elements).length) return;//没有元素
var $columns = waterfall.$columns;
$(elements).each(function(i){
if(!setting.auto_imgHeight||setting.insert_type==2){//如果给出了图片高度,或者是按顺序插入,则不必等图片加载完就能计算列的高度了
if(setting.insert_type==1){
insert($(elements).eq(i),setting.fadein&&fadein);//插入元素
}else if(setting.insert_type==2){
insert2($(elements).eq(i),i,setting.fadein&&fadein);//插入元素
}
return true;//continue
}
if($(this)[0].nodeName.toLowerCase()=='img'||$(this).find(setting.img_selector).length>0){//本身是图片或含有图片
var image=new Image;
var src=$(this)[0].nodeName.toLowerCase()=='img'?$(this).attr('src'):$(this).find(setting.img_selector).attr('src');
image.onload=function(){//图片加载后才能自动计算出尺寸
image.onreadystatechange=null;
if(setting.insert_type==1){
insert($(elements).eq(i),setting.fadein&&fadein);//插入元素
}else if(setting.insert_type==2){
insert2($(elements).eq(i),i,setting.fadein&&fadein);//插入元素
}
image=null;
}
image.onreadystatechange=function(){//处理IE等浏览器的缓存问题:图片缓存后不会再触发onload事件
if(image.readyState == "complete"){
image.onload=null;
if(setting.insert_type==1){
insert($(elements).eq(i),setting.fadein&&fadein);//插入元素
}else if(setting.insert_type==2){
insert2($(elements).eq(i),i,setting.fadein&&fadein);//插入元素
}
image=null;
}
}
image.src=src;
}else{//不用考虑图片加载
if(setting.insert_type==1){
insert($(elements).eq(i),setting.fadein&&fadein);//插入元素
}else if(setting.insert_type==2){
insert2($(elements).eq(i),i,setting.fadein&&fadein);//插入元素
}
}
});
}
function public_render(elems){//ajax得到元素的渲染接口
render(elems,true);
}
function insert($element,fadein){//把元素插入最短列
if(fadein){//渐显
$element.css('opacity',0).appendTo(waterfall.$columns.eq(calculateLowest())).fadeTo(setting.fadein_speed,1);
}else{//不渐显
$element.appendTo(waterfall.$columns.eq(calculateLowest()));
}
}
function insert2($element,i,fadein){//按序轮流插入元素
if(fadein){//渐显
$element.css('opacity',0).appendTo(waterfall.$columns.eq(i%waterfall.column_num)).fadeTo(setting.fadein_speed,1);
}else{//不渐显
$element.appendTo(waterfall.$columns.eq(i%waterfall.column_num));
}
}
function calculateLowest(){//计算最短的那列的索引
var min=waterfall.$columns.eq(0).outerHeight(),min_key=0;
waterfall.$columns.each(function(i){
if($(this).outerHeight()<min){
min=$(this).outerHeight();
min_key=i;
}
});
return min_key;
}
function getElements(){//获取资源
$.waterfall.load_index++;
return setting.getResource($.waterfall.load_index,public_render);
}
waterfall._scrollTimer=null;//延迟滚动加载计时器
function onScroll(){//滚动加载
clearTimeout(waterfall._scrollTimer);
waterfall._scrollTimer=setTimeout(function(){
var $lowest_column=waterfall.$columns.eq(calculateLowest());//最短列
var bottom=$lowest_column.offset().top+$lowest_column.outerHeight();//最短列底部距离浏览器窗口顶部的距离
var scrollTop=document.documentElement.scrollTop||document.body.scrollTop||0;//滚动条距离
var windowHeight=document.documentElement.clientHeight||document.body.clientHeight||0;//窗口高度
if(scrollTop>=bottom-windowHeight){
render(getElements(),true);
}
},100);
}
function onResize(){//窗口缩放时重新排列
if(calculateColumns()==waterfall.column_num) return; //列数未改变,不需要重排
var $cells=waterfall.$waterfall.find(setting.cell_selector);
waterfall.$columns.remove();
waterfall.$columns=creatColumn();
render($cells,false); //重排已有元素时强制不渐显
}
})(jQuery);

以上代码分为两部分给大家介绍了PHP和Jquery和ajax实现下拉淡出瀑布流效果,代码比较简单,附有注释,如有bug欢迎提出,三水点靠木小编会在第一时间和大家联系的。谢谢!

PHP 相关文章推荐
PHP.MVC的模板标签系统(二)
Sep 05 PHP
ThinkPHP访问不存在的模块跳转到404页面的方法
Jun 19 PHP
PHP获取数组的键与值方法小结
Jun 13 PHP
PHP类的声明与实例化及构造方法与析构方法详解
Jan 26 PHP
Zend Framework教程之响应对象的封装Zend_Controller_Response实例详解
Mar 07 PHP
详解php中反射的应用
Mar 15 PHP
Thinkphp和onethink实现微信支付插件
Apr 13 PHP
PHP简单判断iPhone、iPad、Android及PC设备的方法
Oct 11 PHP
PHP 类与构造函数解析
Feb 06 PHP
PHP基于socket实现客户端和服务端通讯功能
Jul 13 PHP
PHP实现十进制数字与二十六进制字母串相互转换操作示例
Aug 10 PHP
Yii2框架配置文件(Application属性)与调试技巧实例分析
May 27 PHP
PHP使用trim函数去除字符串左右空格及特殊字符实例
Jan 07 #PHP
PHP结合Jquery和ajax实现瀑布流特效
Jan 07 #PHP
我整理的PHP 7.0主要新特性
Jan 07 #PHP
php上传图片生成缩略图(GD库)
Jan 06 #PHP
joomla数据库操作示例代码
Jan 06 #PHP
Yii清理缓存的方法
Jan 06 #PHP
yii实现model添加默认值的方法(2种方法)
Jan 06 #PHP
You might like
php检测图片木马多进制编程实践
2013/04/11 PHP
详解php中 === 的使用
2016/10/24 PHP
Thinkphp结合ajaxFileUpload实现异步图片传输示例
2017/03/13 PHP
PHP生成zip压缩包的常用方法示例
2019/08/22 PHP
用jQuery实现检测浏览器及版本的脚本代码
2008/01/22 Javascript
javascript Keycode对照表
2009/10/24 Javascript
jQuery简单实现日历的方法
2015/05/04 Javascript
轻量级jQuery插件slideBox实现带底栏轮播(焦点图)代码
2016/03/28 Javascript
JS实现将Asp.Net的DateTime Json类型转换为标准时间的方法
2016/08/02 Javascript
详谈Angular 2+ 的表单(一)之模板驱动型表单
2017/04/25 Javascript
jQuery实现的点击标题文字切换字体效果示例【测试可用】
2018/04/26 jQuery
深入浅析js原型链和vue构造函数
2018/10/25 Javascript
详解vue移动端项目代码拆分记录
2019/03/15 Javascript
vue项目首屏打开速度慢的解决方法
2019/03/31 Javascript
使用vue2.6实现抖音【时间轮盘】屏保效果附源码
2019/04/24 Javascript
js+html实现周岁年龄计算器
2019/06/25 Javascript
解决vue打包后vendor.js文件过大问题
2019/07/03 Javascript
JavaScript定时器常见用法实例分析
2019/11/15 Javascript
python文本数据相似度的度量
2018/03/12 Python
对numpy数据写入文件的方法讲解
2018/07/09 Python
python多线程分块读取文件
2019/08/29 Python
python matplotlib拟合直线的实现
2019/11/19 Python
Python绘制二维曲线的日常应用详解
2019/12/04 Python
Django-Scrapy生成后端json接口的方法示例
2020/10/06 Python
详解快速开发基于 HTML5 网络拓扑图应用
2018/01/08 HTML / CSS
VELTRA台湾:世界自由行专家
2017/08/15 全球购物
物业管理专业个人的自我评价
2013/11/19 职场文书
大学生党员自我批评
2014/02/14 职场文书
贯彻学习两会心得体会范文
2014/03/17 职场文书
护士感人事迹
2014/05/01 职场文书
安全目标责任书
2014/07/22 职场文书
在校大学生自我评价范文
2014/09/12 职场文书
2015年毕业生自我鉴定模板
2014/09/19 职场文书
2015年学校保卫部工作总结
2015/05/11 职场文书
2015年语文教师工作总结
2015/05/25 职场文书
小学英语教师研修感悟
2015/11/18 职场文书