最近在慕课网上听如何实现瀑布流的效果:介绍了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)的更多相关文章

  1. 代码: 两列图片瀑布流(一次后台取数据,图片懒加载。下拉后分批显示图片。图片高度未知,当图片onload后才显示容器)

    代码: 两列图片瀑布流(一次后台取数据,无ajax,图片懒加载.下拉后分批显示图片.图片高度未知,当图片onload后才显示容器) [思路]: 图片瀑布流,网上代码有多种实现方式,也有各类插件.没找到 ...

  2. 利用LruCache载入网络图片实现图片瀑布流效果(改进版)

    PS: 2015年1月20日21:37:27 关于LoadImageAsyncTask和checkAllImageViewVisibility可能有点小bug 改动后的代码请參见升级版本号的代码 ht ...

  3. 图片瀑布流,so easy!

    什么是图片瀑布流 用一张花瓣网页的图片布局可以很清楚看出图片瀑布流的样子: 简单来说,就是有很多图片平铺在页面上,每张图片的宽度相同,但是高度不同,这样错落有致的排列出 n 列的样子很像瀑布,于是就有 ...

  4. 基于.NetCore开发博客项目 StarBlog - (10) 图片瀑布流

    系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...

  5. 用原生JavaScript实现图片瀑布流的浏览效果

    学习JS,活跃思维,灵活运用的一个较为典型的学习案例.同一个瀑布流的效果但实现方式却很多,利用递归.冒泡等等手法都可以达到你想要的目的.这次要说的就是利用类似递归来实现此效果的原创方案.此方案个人认为 ...

  6. Jquery实现图片瀑布流思路-简单版

    目录 Jquery实现图片瀑布流思路-简单版 1.预备 2.开始 1.声明 2.主体 3.窗体大小改变事件 Jquery实现图片瀑布流思路-简单版 注意:本篇文章基于知道每张图片的实际尺寸的情况下 特 ...

  7. js图片瀑布流效果

    要实现图片瀑布流效果,首先得准备几张图片. html的部分比较简单就是将图片加载到浏览器就可以了 代码如下(注意放的图片多一点要不然之后无法滑动鼠标就无法达到瀑布流效果): <!DOCTYPE ...

  8. js 实现图片瀑布流效果,可更改配置参数 带完整版解析代码[waterFall.js]

    前言:         本人纯小白一个,有很多地方理解的没有各位大牛那么透彻,如有错误,请各位大牛指出斧正!小弟感激不尽.         本篇文章为您分析一下原生JS实现图片瀑布流效果 页面需求 1 ...

  9. android实现超酷的腾讯视频首页和垂直水平网格瀑布流一揽子效果

    代码地址如下:http://www.demodashi.com/demo/13381.html 先来一波demo截图 实现ListView.GridView.瀑布流 1.导入RecyclerView的 ...

  10. 前端之masonry(图片瀑布流插件)

    加载代码: 1 2 <script src="http://libs.baidu.com/jquery/1.8.3/jquery.min.js"></script ...

随机推荐

  1. #Tarjan#洛谷 4819 [中山市选]杀人游戏

    题目 分析 缩点后显然只考虑入度为0的点的个数, 但是问题是如果有一个入度为0的点缩点前只有1个点 且它的出边上的所有点都可以被其它入度为0的点遍历, 那么可以将其它点全部排除后剩下的这个点就是凶手, ...

  2. 使用OHOS SDK构建zziplib

    参照OHOS IDE和SDK的安装方法配置好开发环境. 从gitee下载源码,当前最新的提交记录ID为6699e0fe8a0307b16dcc055eda04452e13abe63a. 执行如下命令: ...

  3. 微服务集成Spring Cloud Zipkin实现链路追踪并集成Dubbo

    1.什么是ZipKin Zipkin 是一个根据 Google 发表的论文" Dapper" 进行开源实现的分布式跟踪系统. Dapper是Google 公司内部的分布式追踪系统, ...

  4. 深入浅出 C 语言:学变量、掌控流程、玩指针,全方位掌握 C 编程技能

    C 语言简介 C 语言介绍 C 语言的特性 C 语言相对于其他语言的优势 C 程序的编译 C 中的 Hello World 程序 参考文章: C 语言入门:如何编写 Hello World C 语言函 ...

  5. Linux系统奇安信浏览器报错跨域:the resource is in more-private address space 'local'

    报错: Access to XMLHttpRequest at "123" from origin "456" has been blocked by CORS ...

  6. Linux 编译 libjpeg-9e

    jpeg的库有两个:一个是官方的 libjpeg  还有一个是 libjpeg-turbo JPEG库(libjpeg-turbo):https://libjpeg-turbo.org/ Libjpe ...

  7. 从 Oracle 到 MySQL 数据库的迁移之旅

    目录 引言 一.前期准备工作 1.搭建新的MySQL数据库 2 .建立相应的数据表 2.1 数据库兼容性分析 2.1.1 字段类型兼容性分析 2.1.2 函数兼容性分析 2.1.3 是否使用存储过程? ...

  8. 定了!12支队伍进入HarmonyOS极客马拉松2023决赛

      12支队伍将在8月初,华为开发者大会(HDC.Togerther)上展开巅峰对决!

  9. Android 开发入门(2)

    0x04 简单控件 (1)文本显示 a. 添加文本 设置文本内容主要有两种方式: XML:通过属性android:text设置 在 layout 目录下新建 activity_text_view.xm ...

  10. 常用注解使用总结系列: @Order 注解

    @Order 注解 @Order注解主要用来控制配置类的加载顺序示例代码: package com.runlion.tms.admin.constant; public class AService ...