3种方法实现图片瀑布流的效果(纯JS,Jquery,CSS)
最近在慕课网上听如何实现瀑布流的效果:介绍了3种方法。

1.纯JS代码实现:
HTML代码部分:
<!DOCTYPE html>
<html>
<head>
<title>watefall layout</title>
<link rel="stylesheet" type="text/css" href="css/style.css">
<script src="js/waterfall.js"></script>
</head>
<body>
<div id="main">
<div class="box">
<div class="pic">
<img src="data:images/0.jpg">
</div>
</div>
<div class="box">
<div class="pic">
<img src="data:images/1.jpg">
</div>
</div>
<div class="box">
<div class="pic">
<img src="data:images/2.jpg">
</div>
</div>
<div class="box">
<div class="pic">
<img src="data:images/3.jpg">
</div>
</div>
<div class="box">
<div class="pic">
<img src="data:images/4.jpg">
</div>
</div>
<div class="box">
<div class="pic">
<img src="data:images/5.jpg">
</div>
</div>
<div class="box">
<div class="pic">
<img src="data:images/6.jpg">
</div>
</div>
<div class="box">
<div class="pic">
<img src="data:images/7.jpg">
</div>
</div>
<div class="box">
<div class="pic">
<img src="data:images/8.jpg">
</div>
</div>
<div class="box">
<div class="pic">
<img src="data:images/9.jpg">
</div>
</div>
<div class="box">
<div class="pic">
<img src="data:images/10.jpg">
</div>
</div>
<div class="box">
<div class="pic">
<img src="data:images/11.jpg">
</div>
</div>
<div class="box">
<div class="pic">
<img src="data:images/12.jpg">
</div>
</div> <div class="box">
<div class="pic">
<img src="data:images/0.jpg">
</div>
</div>
<div class="box">
<div class="pic">
<img src="data:images/1.jpg">
</div>
</div>
<div class="box">
<div class="pic">
<img src="data:images/2.jpg">
</div>
</div>
<div class="box">
<div class="pic">
<img src="data:images/3.jpg">
</div>
</div>
<div class="box">
<div class="pic">
<img src="data:images/4.jpg">
</div>
</div>
<div class="box">
<div class="pic">
<img src="data:images/5.jpg">
</div>
</div>
<div class="box">
<div class="pic">
<img src="data:images/6.jpg">
</div>
</div>
<div class="box">
<div class="pic">
<img src="data:images/7.jpg">
</div>
</div>
<div class="box">
<div class="pic">
<img src="data:images/0.jpg">
</div>
</div>
<div class="box">
<div class="pic">
<img src="data:images/1.jpg">
</div>
</div>
<div class="box">
<div class="pic">
<img src="data:images/2.jpg">
</div>
</div>
</div> </body>
</html>
HTML部分
*{
margin: 0;padding:0;
}
#main{position: relative;}
.box{padding: 15px 0 0 15px;float: left;}
.pic{
padding:10px;border:1px solid #ccc;border-radius: 5px;box-shadow: 0 0 5px #ccc:
}
.pic img{width: 165px;}
CSS部分
window.onload=function(){
waterfall('main','box');
var dataInt={"data":[{"src":'30.jpg'},{"src":'31.jpg'},{"src":'32.jpg'},{"src":'33.jpg'},{"src":'34.jpg'}]};
window.onscroll=function(){
if(checkScrollSlide()){
var oParent=document.getElementById('main');
// 将数据块渲染到当前页面的尾部
for(var i=0;i<dataInt.data.length;i++){
var oBox=document.createElement('div');
oBox.className='box';
oParent.appendChild(oBox);
var oPic=document.createElement('div');
oPic.className="pic";
oBox.appendChild(oPic);
var oImg=document.createElement('img');
oImg.src="data:images/"+dataInt.data[i].src;
oPic.appendChild(oImg);
}
waterfall('main','box');
}
// checkScrollSlide();
}
}
function waterfall(parent,box){
//将main下的所有class为box的元素取出来
var oParent=document.getElementById(parent);
var oBoxs=getByClass(oParent,box);
// console.log(oBoxs.length);
//计算整个页面显示的列数(页面宽度/box的宽度)x.offsetWidth获取一个div的宽度,document.documentElement.clientWidth获取页面的宽度
var oBoxW=oBoxs[0].offsetWidth;
var cols= Math.floor(document.documentElement.clientWidth/oBoxW);
// console.log(cols);
//设置main的宽度
oParent.style.cssText='width:'+oBoxW*cols+'px;margin:auto';
var hArr=[]; //存放每一行图片高度的数组
for (var i=0;i<oBoxs.length;i++){
if(i<cols){
hArr.push(oBoxs[i].offsetHeight);
}else{
var minH=Math.min.apply(null,hArr);
var minindex=getMinhIndex(hArr,minH);
oBoxs[i].style.position='absolute';
oBoxs[i].style.top=minH+'px';
//获取盒子的left值
oBoxs[i].style.left=oBoxs[minindex].offsetLeft+'px';
// oBoxs[i].style.left=oBoxW*minindex+'px';
hArr[minindex]+=oBoxs[i].offsetHeight;
}
}
// console.log(hArr);
}
//根据class获取元素
function getByClass(parent,clsName){
var boxArr=new Array(),//用来存储class为box的所有元素
oElements=parent.getElementsByTagName('*');
for(var i=0;i<oElements.length;i++){
if (oElements[i].className==clsName) {
boxArr.push(oElements[i]);
}
}
return boxArr;
}
//获取高度为最小值在数组中的索引
function getMinhIndex(arr,val){
for (var i in arr) {
if (arr[i]==val) {
return i;
}
}
}
//检测是否具备了滚动条加载数据库的条件
function checkScrollSlide() {
var oParent=document.getElementById('main');
var oBoxs=getByClass(oParent,'box');
var lastBoxH=oBoxs[oBoxs.length-1].offsetTop+Math.floor(oBoxs[oBoxs.length-1].offsetHeight/2);
var scrollTop=document.body.scrollTop||document.documentElement.scrollTop;
// console.log(scrollTop);
var height=document.body.clientHeight||document.documentElement.clientHeight;
return (lastBoxH<scrollTop+height)?true:false;
}
JavaScript部分
2.其他的不用动,只用替换js代码为jquery代码即可
$(window).on('load',function(){
waterfall();
var dataInt={"data":[{"src":'30.jpg'},{"src":'31.jpg'},{"src":'32.jpg'},{"src":'33.jpg'},{"src":'34.jpg'}]};
$(window).on('scroll',function(){
if(checkScrollSlide){
$.each(dataInt.data,function(key,value){
// console.log(key);
// console.log($(value).attr('src'));
var oBox =$('<div>').addClass('box').appendTo($('#main'));
var oPic=$('<div>').addClass('pic').appendTo($(oBox));
var oImg=$('<img>').attr('src','images/'+$(value).attr('src'));
oImg.appendTo($(oPic));
})
waterfall();
}
})
})
function waterfall(){
var oboxs=$('#main>div');
var w=oboxs.eq(0).outerWidth();
var cols=Math.floor($(window).width()/w);
$('#main').width(w*cols).css('margin','0 auto');
// console.log(w);
var hArr=[];
oboxs.each(function(index,value){
// console.log(index);
// console.log(value);
var h=oboxs.eq(index).outerHeight();//获取第一行的图片的高度
if(index<cols){
hArr[index]=h;//把前cols列的高度放在hArr数组中
}else{
var minH=Math.min.apply(null,hArr);
var minHIndex=$.inArray(minH,hArr);//求出minH在hArr中的索引值
// 把value的dom对象转换成jquery对象
$(value).css({
'position':'absolute',
'top':minH+'px',
'left':minHIndex*w+'px'
})
hArr[minHIndex]+=oboxs.eq(index).outerHeight();
}
})
}
function checkScrollSlide(){
var lastBox=$('#main>div').last();
var lastBoxDis=lastBox.offset().top+Math.floor(lastBox.outerHeight()/2);
var scollTop=$(window).scrollTop;
var documentH=$(window).height;
return (lastBoxDis<scrollTop+documentH)?true:false;
}
Jquery部分
3.使用CSS3的多栏布局可以实现把图片平铺到桌面上,并结合js加载图片,监测鼠标滑动的,进行图片的加载
#main{
-webkit-column-width:202px; /*每一列的列宽*/
-moz-column-width:202px;
-webkit-column-gap:5px;
-moz-column-gap:5px;
}
/*数据块 砖块*/
.box{padding:10px 0 0 15px;}
.pic{width:165px;
margin:10px 0;border:1px solid #ccc;
border-radius: 5px;padding:10px;box-shadow: 0 0 5px #ccc}
.pic img{width:165px;display: block;}
使用CSS3实现瀑布流,性能好,但是用户体验不好,需要结合JS代码实现拖动滚动条加载的功能。
3种方法实现图片瀑布流的效果(纯JS,Jquery,CSS)的更多相关文章
- 代码: 两列图片瀑布流(一次后台取数据,图片懒加载。下拉后分批显示图片。图片高度未知,当图片onload后才显示容器)
代码: 两列图片瀑布流(一次后台取数据,无ajax,图片懒加载.下拉后分批显示图片.图片高度未知,当图片onload后才显示容器) [思路]: 图片瀑布流,网上代码有多种实现方式,也有各类插件.没找到 ...
- 利用LruCache载入网络图片实现图片瀑布流效果(改进版)
PS: 2015年1月20日21:37:27 关于LoadImageAsyncTask和checkAllImageViewVisibility可能有点小bug 改动后的代码请參见升级版本号的代码 ht ...
- 图片瀑布流,so easy!
什么是图片瀑布流 用一张花瓣网页的图片布局可以很清楚看出图片瀑布流的样子: 简单来说,就是有很多图片平铺在页面上,每张图片的宽度相同,但是高度不同,这样错落有致的排列出 n 列的样子很像瀑布,于是就有 ...
- 基于.NetCore开发博客项目 StarBlog - (10) 图片瀑布流
系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...
- 用原生JavaScript实现图片瀑布流的浏览效果
学习JS,活跃思维,灵活运用的一个较为典型的学习案例.同一个瀑布流的效果但实现方式却很多,利用递归.冒泡等等手法都可以达到你想要的目的.这次要说的就是利用类似递归来实现此效果的原创方案.此方案个人认为 ...
- Jquery实现图片瀑布流思路-简单版
目录 Jquery实现图片瀑布流思路-简单版 1.预备 2.开始 1.声明 2.主体 3.窗体大小改变事件 Jquery实现图片瀑布流思路-简单版 注意:本篇文章基于知道每张图片的实际尺寸的情况下 特 ...
- js图片瀑布流效果
要实现图片瀑布流效果,首先得准备几张图片. html的部分比较简单就是将图片加载到浏览器就可以了 代码如下(注意放的图片多一点要不然之后无法滑动鼠标就无法达到瀑布流效果): <!DOCTYPE ...
- js 实现图片瀑布流效果,可更改配置参数 带完整版解析代码[waterFall.js]
前言: 本人纯小白一个,有很多地方理解的没有各位大牛那么透彻,如有错误,请各位大牛指出斧正!小弟感激不尽. 本篇文章为您分析一下原生JS实现图片瀑布流效果 页面需求 1 ...
- android实现超酷的腾讯视频首页和垂直水平网格瀑布流一揽子效果
代码地址如下:http://www.demodashi.com/demo/13381.html 先来一波demo截图 实现ListView.GridView.瀑布流 1.导入RecyclerView的 ...
- 前端之masonry(图片瀑布流插件)
加载代码: 1 2 <script src="http://libs.baidu.com/jquery/1.8.3/jquery.min.js"></script ...
随机推荐
- Linux内核数据管理利器--红黑树
目录 写在前面 1. 红黑树的原理 2. 红黑树操作 2.1 红黑树的节点插入 2.2 红黑树的节点删除 2.3 红黑树的查询操作 3. 红黑树操作实验 附录A: 实验代码 写在前面 本文通过两个方面 ...
- Final Countdown 题解
Problem Link 简要题意 把一个数不断减一直到变成零,每个数位变化一次需要一秒. 比如 \(300\) 变成 \(299\) 需要 \(3\) 秒. 求把一个数变成零要多少秒. 思路 对于每 ...
- Vim 速查表 做记录 便于记忆
Vim 命令速查表 简体中文 • English 简介:Vim 命令速查表,注释化 vimrc 配置文件,经典 Vim 键盘图,实用 Vim 书籍,Markdown 格式,目录化检索,系统化学习,体系 ...
- #莫比乌斯反演,整除分块#洛谷 6222 「P6156 简单题」加强版
题目 多组询问,给出\(n,k\) 求 \[\sum_{i=1}^n\sum_{j=1}^n(i+j)^kgcd(i,j)\mu^2(gcd(i,j)) \] 对\(\text{unsigned}\) ...
- #高精度,模拟,vector#C 前缀
From 2020牛客NOIP赛前集训营-提高组(第二场) 传送门 分析 像我这么菜就只会模拟呀(考场CE全部爆零QWQ) 题意就是不断跳到下一个字母问总共跳的长度有多长, 首先用一个变量存下初始位置 ...
- 网络协议之:haproxy的Proxy Protocol代理协议
目录 简介 Proxy Protocol的实现细节 版本1 版本2 Proxy Protocol的使用情况 总结 简介 代理大家应该都很熟悉了,比较出名的像是nginx,apache HTTPD,st ...
- 成长计划校园极客秀|基于OpenHarmony的智能阳台
前言 本文由OpenAtom OpenHarmony(以下简称"OpenHarmony")开源开发者成长计划活动的参与者李建涛提供,详细阐述了由搭载OpenHarmony系统的拓维 ...
- Numpy广播功能
广播(Broadcast)是对不同形状(shape)的数组进行数值计算的方式. 广播规则: 如果两个数组的维度数不相同,那么小维度数组的形状将会在最左边补1: 如果两个数组的形状在任何一个维度都不匹配 ...
- std::thread 二:互斥量(带超时的互斥量 timed_mutex())
timed_mutex . try_lock_for . try_lock_until #include <iostream> #include <thread> #inclu ...
- vue element序号翻页连续排序
type="index" :index="indexMethod" // 序号翻页连续排序 indexMethod(index) { return (this. ...