热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【原创】waterfall瀑布流网页实现的设计方案一:Masonry(含load

waterfall瀑布流网页实现的设计方案一:Masonry(含loading几次后出现分页)瀑布流设计早就不是什么新鲜的东西了,现在网上基于瀑布流的网页非常常见,这种设计能给浏览器者更直接更有效率的浏览体验。那么我们可以如何从前端、后端配合去实现这种效果呢?

waterfall 瀑布流网页实现的设计方案一:Masonry(含loading几次后出现分页) 瀑布流设计早就不是什么新鲜的东西了,现在网上基于瀑布流的网页非常常见,这种设计能给浏览器者更直接更有效率的浏览体验。 那么我们可以如何从前端、后端配合去实现这种效果呢?

waterfall 瀑布流网页实现的设计方案一:Masonry(含loading几次后出现分页)

瀑布流设计早就不是什么新鲜的东西了,现在网上基于瀑布流的网页非常常见,这种设计能给浏览器者更直接更有效率的浏览体验。
那么我们可以如何从前端、后端配合去实现这种效果呢?

其实目前已有很多基于jquery或原生态Javascript的waterfall插件,我们只需要根据api进行运用,既可做到不错的瀑布流网页。
但是在这些插件中,做得兼容性好并且功能还不错的,首推下面两种:
1.Masonry
2.KISSY
下面一一解说下这两种瀑布流方式的实现方式。本文只说Masonry,KISSY将会在下一篇文章更新。

需求:瀑布流输出,loading 5 次后出现分页,每次loading 12个内容。

jquery虽然不是必须的,但是为了方便,我们还是用上jquery吧。

下面的例子基于phpcms

jquery.min.js 及 masonry.pkgd.min.js请自行下载。

一、html代码:

#content {min-height: 390px; width: 920px; }
#content a {text-decoration: none; }
#page_loading {display: none; background: #111111; opacity: 0.7; height: 60px; width: 220px;  padding: 10px;  text-align:center; }
#thumbs {position: relative; width: 895px; padding: 10px 0 20px 15px; }
#thumbs a {color: #26ADF5; }
.imgbox {opacity: 0; position: absolute; max-width: 260px; margin: 5px 5px 5px 5px; -moz-border-radius:6px; -webkit-border-radius:6px; border-radius:6px; border:1px solid #EEE; -webkit-box-shadow:0 0 6px #EEE; -moz-box-shadow:0 0 6px #EEE; padding: 1px; float: left; background: #FFF; z-index: 100; }
.imgbox img {display: block; padding: 6px; max-width: 250px; }
.imgbox .img_user {display: block; color: #26ADF5; padding: 3px 6px 2px 6px; }
.imgbox .img_time {display: block; color: #AAA; padding: 3px 6px 5px 6px; float: left; }
#page_nav {clear: both; height: 25px; width: 920px; font-size: 12pt; text-align: center; }
.page_nav {margin: 0 auto; text-align: left; overflow: hidden; }
.page_nav a {display: block; padding-top: 4px; margin-right: 10px; float: left; }
.page_nav_but {color: #26ADF5; }
.current {color: #26ADF5; margin-top: -4px; font-size: 16pt; }
#next_page {display: none; }
#stopfetch {display: none; width: 100px; height: 100px; position: fixed; top:48%; right:8%; background: url(../images/stopfetch.png) no-repeat; }
#stopfetch img {opacity: 0; }
    
        
	{loop $datas $r}	
			{$r['desc']}
			@" itemprop="datePublished">?#5
	{/loop}
    下一页  
    给力加载中……
//loading 5 次,出现分页!
var loading_times = 5;
// waterfall与 loading 几次后出现分页实现
$(function() {
 $("'.imgbox').css({display: 'none'});
	$("#thumbs .imgbox").css({ opacity: 1 });
	// 流体布局
    var $cOntainer= $('#thumbs');
    $container.imagesLoaded(function(){
      $container.masonry({
		columnWidth: 279,
        itemSelector : '.imgbox'
      });
	  $('.imgbox').show();
    });
	var request,
		nextHref = $("#next_page a").attr("href");
	$(window).bind("scroll", function(){
        if( $(document).scrollTop() + $(window).height() > $(document).height() - 10 ) {
			if( nextHref != undefined ) {
				if(request && request.readyState != 4 ) {
					request.abort();
				}
				// Ajax waterfall loading 
				request = $.ajax( {
					url: $("#next_page a").attr("href"),
					type: "POST",
					beforeSend: function(){
						$("#page_loading").show("slow");
					},
					success: function(data) {
						result = $(data).find(".imgbox");
						nextHref = $(data).find("#next_page a").attr("href");
						newNav = $(data).find("#page_nav");
						$("#next_page a").attr("href", nextHref);
						$("#page_nav").remove();
						$container.after(newNav);
						$("#thumbs").append(result);
						// 重新计算 .page_nav 的宽带,以便 margin: 0 auto 生效
						$page_navwidth = $(".page_nav").children().length * 23;
						$(".page_nav").css({ opacity: 0, width: $page_navwidth });
						$newElems = result;
						$newElems.imagesLoaded(function(){
							$container.masonry( 'appended', $newElems, true );
							// 渐显新的内容
							$newElems.animate({ opacity: 1 });
							$("#stopfetch").show("slow");
							$("#page_loading").hide("slow");							
						});
						//当前页的loading次数
						sub_page = $(data).find("#sub_page").html()-1;
						//当前页数
						current_page = $(data).find("#current_page").html();
						//总页数
						total_page = $(data).find("#total_page").html();
						if(sub_page>=loading_times || sub_page+loading_times*(current_page-1) >= total_page) {
							if($('.Pager').length==0) {
								$("#content").append(""+$(data).find("#page_str").html()+'');
							}
							$(window).unbind('scroll');
							$("#page_loading").hide();
							return;
						}
					}
				});
			} else {
				$("#page_loading span").text("木有了噢,最后一页了!");
				$("#page_loading").show("fast");
				setTimeout("$('#page_loading').hide()",1000);
				setTimeout("$('#page_loading').remove()",1100);
			}
        }
    });
});
(function ($) {
	var $backEle = $('.backToTop');
	$backEle.click(
		function () {
			$("html,body").animate({ scrollTop: 0 }, 120);
		})
	$backTOfuc = function () {
		var st = $(document).scrollTop();
		var winH = $(window).height();
		(st > 188) ? $backEle.show() : $backEle.hide();
		if (!window.XMLHttpRequest) {
			$backEle.css("top", st + winH - 166);
		}
	}
	$(window).bind("scroll.backToTop", $backTOfuc);
	$(function () { $backTOfuc(); });
})(window.jQuery)	

二、php端代码:/lists-ajax1-{$catid}-{$page}-2-12.html
这里的四个参数分别对应:$_GET['catid'],$_GET['page'],$_GET['sub_page'],$_GET['limit']

...
...
//loading 5 次,出现分页!
$loading_times = 5;
$sub_page = (int)$_GET['sub_page'];
$page_c = $sub_page;
$page = (int)$_GET['page'];
if($page==0) {
	$page = 1;
}
$sub_page = $sub_page+($page-1)*$loading_times;
$limit = (int)$_GET['limit'];
$sql = ".....";
//这里根据具体sql语句查询出结果数组,请根据自己的系统写好。
$datas = getRowset($sql,' a.id asc ', $sub_page, $limit,10,$urlrule); 
//返回的结果数组应该包含:
//1.当前页的loading page:$sub_page,2.总记录数:total_count,3.总页数:total_pages,4.结果数组 datas
$result['stat']='ok';
$result['photos']['page']=$sub_page;
$result['photos']['pages']=$datas['total_pages'];
$result['photos']['perpage']=$limit;
$result['photos']['total']=$datas['total_count'];
$result['photos']['photo']=$datas['datas'];
//这里是获取分页代码的str,请注意这里的$limit*$loading_times 这个参数
$datas_tmp = getRowset($sql,' a.id asc ', $page, $limit*$loading_times,10,$urlrule);
$result['photos']['pages_str']=$datas_tmp['pages_str'];
//下面是组装返回的字符串!供前端的js获取使用
$str='';
foreach($result['photos']['photo'] as $k=>$r) {
	$str.="	".$r['desc']."@".date('Y-m-d H:i:s',$r['inputtime'])."";
}
$page_c++;
$str.="下一页{$page_c}{$page}".$result["'photos']['pages']."".$result['photos']['pages_str']."";
echo $str;die;

完毕,可以测试了。

推荐阅读
  • mui框架offcanvas侧滑超出部分隐藏无法滚动如何解决
    web前端|js教程off-canvas,部分,超出web前端-js教程mui框架中off-canvas侧滑的一个缺点就是无法出现滚动条,因为它主要用途是设置类似于qq界面的那种格 ... [详细]
  • 本文介绍了DataTables插件的官方网站以及其基本特点和使用方法,包括分页处理、数据过滤、数据排序、数据类型检测、列宽度自动适应、CSS定制样式、隐藏列等功能。同时还介绍了其易用性、可扩展性和灵活性,以及国际化和动态创建表格的功能。此外,还提供了参数初始化和延迟加载的示例代码。 ... [详细]
  • 前言:关于跨域CORS1.没有跨域时,ajax默认是带cookie的2.跨域时,两种解决方案:1)服务器端在filter中配置详情:http:blog.csdn.netwzl002 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 本文介绍了如何使用jQuery和AJAX来实现动态更新两个div的方法。通过调用PHP文件并返回JSON字符串,可以将不同的文本分别插入到两个div中,从而实现页面的动态更新。 ... [详细]
  • 从零基础到精通的前台学习路线
    随着互联网的发展,前台开发工程师成为市场上非常抢手的人才。本文介绍了从零基础到精通前台开发的学习路线,包括学习HTML、CSS、JavaScript等基础知识和常用工具的使用。通过循序渐进的学习,可以掌握前台开发的基本技能,并有能力找到一份月薪8000以上的工作。 ... [详细]
  • 本文介绍了一种图片处理应用,通过固定容器来实现缩略图的功能。该方法可以实现等比例缩略、扩容填充和裁剪等操作。详细的实现步骤和代码示例在正文中给出。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了css回到顶部按钮相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文内容为asp.net微信公众平台开发的目录汇总,包括数据库设计、多层架构框架搭建和入口实现、微信消息封装及反射赋值、关注事件、用户记录、回复文本消息、图文消息、服务搭建(接入)、自定义菜单等。同时提供了示例代码和相关的后台管理功能。内容涵盖了多个方面,适合综合运用。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
author-avatar
乐在hhh其中
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有