最近的项目中经常会碰到以瀑布流方式布局的问题。
先从网上找了个瀑布流的图片排列插件。这里暂且用 jquery.masonry.js
废话不多说、直接上源码
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<title>masonry</title>
<style>
* {
box-sizing: border-box; /* h5 */
-moz-box-sizing: border-box; /* Firefox */
-webkit-box-sizing: border-box; /* Safari */
word-break:break-all;
}
html, body {
margin: 0;
padding: 0;
}
img {
border: 0;
display: block;
}
ul, ol,p,h1, h2, h3, h4, h5, h6{
margin: 0;
list-style: none;
padding: 0;
}
.container{
position: relative;
width: 890px;
clear: both;
display: block;
margin: 0 auto;
}
.photoList{
margin-right: -15px;
}
.photoList li{
width: 285px;
float: left;
box-shadow: 0 4px 10px rgba(0,0,0,0.1);
margin-right: 15px;
margin-bottom: 15px;
min-height: 100px;
}
.photoList li>img{
width: 100%;
}
</style>
</head>
<body>
<div class="container">
<p style="line-height: 55px">与大家一起分享您的美妙旅程~ 可将旅程照片发送到帝国假日照片墙信箱 photos@infinitytravel.com</p>
<ul class="photoList">
</ul>
</div>
<div class="photoPop" style="display: none">
<img id="bigPhoto" src="" alt="">
</div>
</body>
<script type="text/javascript" src="js/jquery-1.8.3.min.js"></script>
<script type="text/javascript" src="js/jquery.masonry.min.js"></script> <!--瀑布流插件-->
<script type="text/javascript" src="layer/layer.js"></script> <!--弹出层插件-->
<script>
//ajax请求第几页的数据
var noPage = 1;
//是否请求出AJAX的“开关”;
var onOff = true;
//瀑布流全局变量
var $grid;
$(function () {
//瀑布流初始化
$('.photoList').imagesLoaded(function() {
$grid = $('.photoList').masonry({
gutterWidth: 0,
itemSelector: '.photoList li',
isAnimated: true
});
});
//向下滑动加载更多
$(window).scroll(function(){
var scrollTop = $(this).scrollTop();
var scrollHeight = $(document).height();
var windowHeight = $(this).height();
if(scrollTop + windowHeight >= scrollHeight){
if (onOff){
onOff=false;
photoList();
}
}
});
//获取ajax数据
photoList();
});
function photoList() {
$.ajax({
type: 'GET',
url: 'http://beyondestinations.com/api/api1020?resulttype=jsonp',
data:{
CurrentPage:noPage,
PageSize:30
},
dataType:'jsonp',
success:function(json) {
var list=json.DataList;
var str="";
if(list.length>0){
var index = 0;
for(i=0;i<list.length;i++){
if (list[i].LogoUrl){
str+='<li><img οnclick="photoShow(this)" src="'+list[i].LogoUrl+'" alt=""></li>';
//这里很重要!!! 一定要判断所有图片都加载完后、在进行瀑布流初始化!!
var img = new Image();
img.src = list[i].LogoUrl;
img.onload = function () {
index++;
if (index == list.length) {
$grid.masonry("reload");
}
}
}
}
var $items = $(str);
// append items to grid
$grid.append( $items );
noPage++;
onOff=true;
}else {
onOff=false;
}
}
})
}
//视需求而定是否需要,点击图片显示原图
function photoShow(obj) {
var _w = parseInt($(window).width());//获取浏览器的宽度
var img = $(obj);
var realWidth;//真实的宽度
var realHeight;//真实的高度
var rsrc = $(img).attr("src");
//这里做下说明,$("<img/>")这里是创建一个临时的img标签,类似js创建一个new Image()对象!
$("<img/>").attr("src", rsrc).load(function() {
/*
如果要获取图片的真实的宽度和高度有三点必须注意
1、需要创建一个image对象:如这里的$("<img/>")
2、指定图片的src路径
3、一定要在图片加载完成后执行如.load()函数里执行
*/
realWidth = this.width;
realHeight = this.height;
//如果真实的宽度大于浏览器的宽度就按照100%显示
$("#bigPhoto").attr("src",rsrc);
if(realWidth>=_w){
$("#bigPhoto").css("width","100%").css("height","auto");
}
else{//如果小于浏览器的宽度按照原尺寸显示
$("#bigPhoto").css("width",realWidth+'px').css("height",realHeight+'px');
}
//弹出层插件 layer
layer.open({
type: 1,
title: false,
closeBtn: 0,
shift: 2,
shade:0.7,
area: [''+realWidth+'px', ''+realHeight+'px'],
// scrollbar: false,
shadeClose: true, //开启遮罩关闭
content: $(".photoPop")
});
});
}
</script>
</html>
自己改下ajax url,改下插件的路径,就可以用了。注释相信也写的很详细了,还有问题的朋友欢迎留言互相探讨学习。
补充一下,判断所有图片加载完毕还有另外一个方法,有兴趣的可以了解下。
isImgLoad(function () {
$grid.masonry("reload");
});
var t_img; // 定时器
var isLoad = true; // 控制变量
// 判断图片加载的函数
function isImgLoad(callback){
// 注意我的图片类名都是photoList,因为我只需要处理photoList。其它图片可以不管。
// 查找所有封面图,迭代处理
$('.photoList img').each(function(){
// 找到为0就将isLoad设为false,并退出each
if(this.height === 0){
isLoad = false;
return false;
}
});
// 为true,没有发现为0的。加载完毕
if(isLoad){
clearTimeout(t_img); // 清除定时器
// 回调函数
callback();
// 为false,因为找到了没有加载完成的图,将调用定时器递归
}else{
isLoad = true;
t_img = setTimeout(function(){
isImgLoad(callback); // 递归扫描
},500); // 我这里设置的是500毫秒就扫描一次,可以自己调整
}
}