您的位置:首页 > Web前端 > JQuery

jquery瀑布流的制作

2016-08-18 17:52 295 查看

首先,还是来看一下炫酷的页面:

今天就边做边说了:

一。准备工作

新建css,js,img文件夹存放相应文件,并在demo.html文件中引入外部文件(注意要把jquery文件引入),这里就不过多描述了。

二。图片展示

<div id="main">
<div class="pic">
<img src="img/1.jpg" />
</div>

<div class="pic">
<img src="img/2.jpg" />
</div>

<div class="pic">
<img src="img/3.jpg" />
</div>

<div class="pic">
<img src="img/4.jpg" />
</div>

<div class="pic">
<img src="img/5.jpg" />
</div>

<div class="pic">
<img src="img/6.jpg" />
</div>

<div class="pic">
<img src="img/7.jpg" />
</div>

<div class="pic">
<img src="img/8.jpg" />
</div>

<div class="pic">
<img src="img/9.jpg" />
</div>

<div class="pic">
<img src="img/10.jpg" />
</div>

<div class="pic">
<img src="img/1.jpg" />
</div>

<div class="pic">
<img src="img/2.jpg" />
</div>

<div class="pic">
<img src="img/3.jpg" />
</div>

<div class="pic">
<img src="img/4.jpg" />
</div>
<div class="pic">
<img src="img/5.jpg" />
</div>

<div class="pic">
<img src="img/6.jpg" />
</div>

<div class="pic">
<img src="img/7.jpg" />
</div>
</div>

一个大div包裹全局,小的div包裹图片,这里为什么要这么多图片呢,是因为刚开始的时候图片要占满屏幕,否则会不美观。而且jq中用的是监听滚动条的方法加载图片,图片太少的话滚动条都不会出现,自然不能执行滚动条的事件。

分析一下图片的显示效果:

1.图片有白色的边框,阴影

2.图片是平铺的

*{
padding:0;
margin:0;
}
#main{
position:relative;
}
#main .pic{
width:170px;
box-shadow: 0 0 6px #CCCCCC;
float:left;
margin:5px;
}
#main .pic img{
width:160px;
height:auto;
border: 5px #FFFFFF solid;
}

相信上面的代码是很好理解的,到此为止图片已经平铺了。

三。让图片顺序依次排列

虽然执行完上面的代码以后图片是平铺了,但效果却是很不好的,它没有像图片展示的那样高低排列。

如何实现高低排列:

1.第一行肯定是没有问题的,因为第一行的每张图上面没有图片,也就是说是平的;

2.第二行就可以取第一行中高度最小的图片,然后把第二行的第一张图片放在下面(这里用绝对定位控制图片位置);

3.以此类推,把第二行第一张图片插入以后,在选择这时候第一行中最短的,并把图片放在下面。

function waterFall(){
var divWidth = $("#main .pic").eq(0).width()+10; //获取页面中包裹图片的div宽度,这里的+10是因为在css中设置的margin是5px,左右加起来就是10(相当于这个div的实际宽度比预设多10px)
var num = Math.floor($(window).width()/divWidth); // Math.floor是向下取整,获取整个浏览器的宽度除以"图片的占宽"可以获得图片可以排放多少列,这也就是向下取整的原因了

$("#main").css({  //设置整个div的宽度,并让其居中显示
"width":divWidth*num,
"margin": "0 auto"
});
var picArr = []; //定义一个数组
$("#main .pic").each(function(index){ //遍历所有.pic的div
var picHeight = $("#main .pic").eq(index).height();//获取每个div的高度
if(index<num){ //如果是第一行
picArr[index] = picHeight;//把高度存储进数组
}else{ //如果数组不是第一行的数据了
var minH = Math.min.apply(null,picArr); //获取数组中最小的高度
var minIndex = $.inArray(minH,picArr); //获取最小高度的index(位置)
$(this).css({ //设置这个div的位置
"position":"absolute",
"top":minH+10, //设置它距离上方的距离,这里加10是因为在css中设置的margin是5px,上下加起来是10px
"left":$("#main .pic").eq(minIndex).position().left     //获取最小高度距离左边的距离
});
picArr[minIndex]+=$("#main .pic").eq(index).height()+10; //把最小的高度存入数组中
}
});
}

在页面加载完后执行waterFall()方法,这个句子就不写啦。到此为止就可以看到图片依次有序排列啦

四。瀑布流的实现

思路:这里是监听浏览器的滚动条,当滚动条到达底部时就加载预定数组中的图片

$(window).on("load",function(){
waterFall();
var pics = ["1.jpg","2.jpg","3.jpg","4.jpg","5.jpg"];
window.onscroll = function(){
if ($(document).scrollTop() >= $(document).height() - $(window).height()) {
$.each(pics,function(index,value){
$(".pic").eq(0).clone().appendTo("#main").find("img").attr("src","img/"+value);
});
waterFall();
}
}
});

appendTo() 方法在被选元素的结尾(仍然在内部)插入指定内容。

当然这里是当浏览器的滚动条到达底部的时候才会加载图片,如果觉得这样用户体验不好的话,可以在if里面设置,例如:if ($(document).scrollTop()+100 >= $(document).height() - $(window).height()) 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: