传统瀑布流布局ul-li,需要先设定显示几列,每列是一个li,需要左浮动并指定宽度,li里面的布局也要先布局好,主要是要定宽,高度自动;然后通过ajax异步,从数据库中得到数据,遍历后将数据插入最矮的li中

HTML中的代码:

<!--定义JS中需要的数据-->
<script type="text/javascript">
var ajaxHandle='<{:U("Index/Typeshow/ajax","","")}>'; //这个是JS提交AJAX数据的后台方法的地址
var link='<{:U("Index/Show/index","","")}>'; //这个是AJAX返回给HTML数据中链接需要用到的地址
var type=1; //定义类型:Android,iPhone,windowsphone,other
var page=1; //初始化页数
</script>

<!-- 瀑布流形式显示,使用ajax异步;每个li是一列,通过判断li的高度决定插入数据到哪个li里面-->
<div id='content'>
<ul>
<li>
<!--这里的数据都从ajax异步获取
<dl>
<dt><{$v['title']}></dt>
<dd><{$v['intro']}></dd>
</dl>
-->
</li>
<li></li>
<li></li>
</ul>
</div>

CSS中的代码

#content{
margin:10px;
}
#content li{
float:left;
width:300px;
margin:13px;
}
#content dl{
background:white;
-webkit-box-shadow: #666 0px 0px 5px;
-moz-box-shadow: #666 0px 0px 5px;
box-shadow: #666 0px 0px 5px;
margin-bottom:20px;
}
#content dt{
background:#111;
color:#eee;
font-size:16px;
line-height:30px;
height:30px;
overflow:hidden;
padding:5px;
}
#content dd{
font-size:14px;
color:#333;
padding:10px;
}
#content dl div{
height:25px;
}
#content dl div span{
margin-left:150px;
margin-bottom:10px;
font-size:14px;
color:#333;
}
#content a{
color:#eee;
}
#content a:hover{
color:yellow;
}

JS中的代码

//瀑布流效果
//初始化变量ajaxover来判断ajax发送给HTML的数据是否加载完毕;这样可以避免滚动条滚动到底部连续发送ajax请求
var ajaxover=true;

//DOM加载完成时便执行一次ajax获取数据
$(document).ready(function(){
loadMore();
});

//滚动条触发事件;scroll是JQ内置事件
$(window).bind('scroll',function () {
// 当滚动到最底部以上100像素时, 加载新内容
if ($(document).height() - $(this).scrollTop() - $(this).height()<100){
if (ajaxover) { //当ajaxover为真的时候,才执行loadMore()函数
loadMore();
}else {
return false;
}

}
});

//ajax异步读取数据;遍历后台获得的数据,每次遍历时对每个li的高度进行遍历判断,得出最矮那个,将数据插入那里面
function loadMore() {
ajaxover=false; //当执行loadMore()函数的时候,就将ajaxover改为false,这样下面的ajax没执行完的时候不会再执行loadMore
$.ajax({
url : ajaxHandle,
dataType : 'json',
type:'post',
data:{'page':page,'type':type},
success:function(content){
if(content.length>0){
//遍历返回的数据(一个二维数组)
for (var i = 0; i < content.length; i++) {
//定义变量,对li遍历时进行排序用
var $row,iHtight,iTempHeight;
// 找出当前高度最小的列, 新内容添加到该列
iHeight = -1;
$('#content li').each(function(){
iTempHeight = Number( $(this).height() );  //Number()将取出的高度转换为数值类型进行比较
if(iHeight==-1 || iHeight>iTempHeight) {
iHeight = iTempHeight;
$row = $(this);  //对高度进行排序后,将最矮的那个保存到变量中
}
});

//组装输出到HTML的数据
var item='<dl>';
//这里的a链接不能直接使用U()方法;DOM加载完成后再加进去的链接是无法解析的;link是在HTML中定义的用于解析的链接link='& lt;{:U("Index/Show/index","","")}>';这样就能获得提交方法的地址了
item+='<dt>'+'<a href="'+link+'/id/'+content[i]['id']+'">'+content[i]['title']+'</a></dt>';
item+='<dd>'+content[i]['intro']+'</dd>';
item+='<hr/>';
item+='<div><span>'+content[i]['date']+'</span></div>';
item+='</dl>';

$row.append(item); //将数据插入到最矮的那个中
}
}else {
$(window).unbind('scroll'); //移除滚动条绑定的事件;这样就会在得不到数据的时候终止滚动条事件,不会进行无意义的ajax请求了
}
ajaxover=true; //ajax返回给HTML的数据全部完成之后再将ajaxover设置为true;注意是写在success的函数里
}
});
page++; //每加载一次页数加一(原理类似分页)
}

PHP中的代码

//瀑布流的ajax异步数据传输
public function ajax(){
$page=$_POST['page']; //获取ajax发送过来的页数-第几页
$type=$_POST['type']; //获取ajax发送过来的类型-Android、iPhone、WindowsPhone、Other
//每次取出10条数据
$pagesize=15;
$m=M('article');
//limit(($page-1)*$pagesize,$pagesize);从第几条开始取,取出几条;用页数来判断从第几条开始取
$content=$m->where(array('delete'=>0,'type'=>$type))->field('id,title,intro,date')->order('date desc')->limit(($page-1)*$pagesize,$pagesize)->select();
if($content){
$this->ajaxReturn($content,'json');
}else{
$this->ajaxReturn(array('status'=>0),'json');
}
}

要点:
1、通过ajaxover=true; 这样的方式来防止连续触发事件
2、数据库返回的json数据可以是二维数组,在JS中按照数组方式对其进行遍历即可
3、可以通过bind()来绑定事件,也可以通过unbind()来移除事件
4、 在JS中返回的数据的链接不能直接使用U()方法,因为DOM已经加载完了,通过AJAX异步过来的U()不会解析,所以需要先在模版中定义var link='<{:U("Index/Show/index","","")}>'; 在JS中用这个变量来进行链接地址的拼接'<a href="'+link+'/id/'+content[i]['id']+'">'
5、瀑布流的原理其实和分页类似,通过页数来判断获取的数据

AJAX异步实现简单的瀑布流的更多相关文章

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

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

  2. WAP用户评论简单实现瀑布流加载

    wap端经常会遇到产品或者评论的加载,但是分页的体验不是很好,所以选择通过js实现瀑布流加载方式. 第一步:需要动态加载的主要内容,这里需要动态加载的是li标签的内容 <ul class=&qu ...

  3. Ajax异步请求-简单模版

    <script type="text/javascript"> window.onload = function () { document.getElementByI ...

  4. iOS之简单瀑布流的实现

    iOS之简单瀑布流的实现   前言 超简单的瀑布流实现,这里说一下笔者的思路,详细代码在这里. 实现思路 collectionView能实现各中吊炸天的布局,其精髓就在于UICollectionVie ...

  5. vuejs和webpack项目(VueComponent)初尝试——瀑布流组件

    碎碎念:     好久不见,最近自己有些懈怠没更过多少博,主要原因之一是对自己学习方式的一些思考,翻看之前的博客多是记录学习笔记这反映出了自己对于前端还停留在学习-复习知识点的阶段压根没多少实践经验啊 ...

  6. windowsphone 瀑布流&ui虚拟化

    瀑布流已经有点年代了吧,不过wp上还真是挺少资料的.今天抽空把自己之前搞过的东西写出来,避免大家重复劳动. 一.简单的瀑布流排版加入ui虚拟化. 最近看了 段博琼  ui虚拟化的一篇博文,链接:htt ...

  7. 详细分享UICollectionView的自定义布局(瀑布流, 线性, 圆形…)

    前言: 本篇文章不是分享collectionView的详细使用教程, 而是属于比较’高级’的collectionView使用技巧, 阅读之前, 我想你已经很熟悉collectionView的基本使用, ...

  8. Objectiv-c - UICollectionViewLayout自定义布局-瀑布流

    最近刚写的一个简单的瀑布流. 整体思路可能不是很完善. 不过也算是实现效果了. 高手勿喷 思路: 自定义UICollectionViewLayout实际上就是需要返回每个item的fram就可以了. ...

  9. 分别用js和css实现瀑布流

    下午查找了瀑布流的相关原理,找了一些css3实现的还有js实现的,最后总结了一些比较简单的,易懂的整理起来 1.css3实现 只要运用到    column-count分列 column-width固 ...

随机推荐

  1. JSON自定义排序

    var json=[{ Name:'张三', Addr:'重庆', Age:'20' },{ Name:'张三3', Addr:'重庆2', Age:'25' },{ Name:'张三2', Addr ...

  2. Python版本微信跳一跳,软件配置

    一.安装python3的环境: 直接从python官方网站下载python3的安装包,直接安装. 记得将python3放到PATH环境变量中,安装的过程中在该配置地方打钩就可以了. 如果安装的过程中出 ...

  3. OAF页面集成条形码或者二维码

    OAF页面集成条形码 OAF生成条形码 OAF页面集成二维码跟这个类似,生成二维码需要以下jar包,zxing-core.jar, zxing-javase.jar,可自行去maven下载. 代码如下 ...

  4. JavaScript学习总结(五)——Javascript中==和===的区别

    一.JavaScript"=="的作用 当==两边的内容是字符串时,则比较字符串的内容是否相等. 当==两边的内容是数字时,则比较数字的大小是否相等. 当==两边的内容是对象或者是 ...

  5. 深入理解MyBatis中的一级缓存与二级缓存

    http://blog.csdn.net/weixin_36380516/article/details/73194758   先说缓存,合理使用缓存是优化中最常见的,将从数据库中查询出来的数据放入缓 ...

  6. Python gui编程pyQt5安装步骤t

    Python gui编程pyQt5安装步骤         pip install PyQt5 Pip3 install PyQt5               https://riverbankco ...

  7. C#Winform窗体实现服务端和客户端通信例子(TCP/IP)

    Winform窗体实现服务端和客户端通信的例子,是参考这个地址 http://www.cnblogs.com/longwu/archive/2011/08/25/2153636.html 进行了一些异 ...

  8. 转mysql半主从同步

    MySQL半同步复制 从MySQL5.5开始,MySQL以插件的形式支持半同步复制.如何理解半同步呢?首先我们来看看异步,全同步的概念   异步复制(Asynchronous replication) ...

  9. (转载)hibernate缓存

    目的:减少访问数据库的次数 一级缓存(默认): Session级别的缓存,一个Session做了一个查询操作,它会把这个操作的结果放在一级缓存中,如果短时间内这个session(一定要同一个sessi ...

  10. Maven Spring BOM (bill of materials)

    为了防止用Maven管理Spring项目时,不同的项目依赖了不同版本的Spring,可以使用Maven BOM来解决者一问题. 在依赖管理时,引入spring-framework-bom,如: < ...