用JavaScript和jQuery实现瀑布流
▓▓▓▓▓▓ 大致介绍
在慕课网上学习了用原生js和jQuery实现瀑布流,在这里做个笔记
▓▓▓▓▓▓ 用JavaScript实现
基本结构:
<div id="main">
<div class="box">
<div class="pic"><img src="data:images/1.jpg" alt=""></div>
</div>
<div class="box">
<div class="pic"><img src="data:images/2.jpg" alt=""></div>
</div>
...
...
...
</div>
基本样式:
*{
margin: 0px;
padding: 0px;
}
#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;
}
思路:
1、获取#main下的所有.box
2、计算页面中图片有几列,并设置页面的宽度
3、找出这几列中高度最小的列
4、从第二行开始,设置图片为相对定位,把一张图片放到高度最小列的下面
5、更新列的高度,重复3、4、5步骤,直至图片加载完
6、根据最后一张图片的位置确定是否继续加载图片(懒加载)
实现:
1、获取#main下的所有.box
//将main下的所有class为box的元素取出来
var oParent = document.getElementById(parent);
var oBox = getByClass(oParent,box);
// 根据class获取元素
function getByClass(parent,clsname){
var arr = [];//用来存储获取到的所有class为box的元素
var oElement = parent.getElementsByTagName('*');
for(var i=0;i<oElement.length;i++){
if(oElement[i].className == clsname){
arr.push(oElement[i]);
}
}
return arr;
}
2、计算页面中图片有几列,并设置页面的宽度
//计算整个页面显示的列数(页面宽/box的宽)
var oBoxW = oBox[0].offsetWidth;
var cols = Math.floor(document.documentElement.clientWidth/oBoxW); //设置main的宽
oParent.style.cssText = 'width:' + oBoxW*cols + 'px;margin:0 auto;';
3、找出这几列中高度最小的列
4、从第二行开始,设置图片为相对定位,把一张图片放到高度最小列的下面
5、更新列的高度,重复3、4、5步骤,直至图片加载完
//存储每列的高度
var hArr = []; for(var i=0;i<oBox.length;i++){
if(i<cols){
//第一行图片的高度
hArr.push(oBox[i].offsetHeight);
}else{
var minH = Math.min.apply(null,hArr);
var index = getMinIndex(hArr,minH);
oBox[i].style.position = "absolute";
oBox[i].style.top = minH + 'px';
//oBox[i].style.left = oBoxW*index+'px';
oBox[i].style.left = oBox[index].offsetLeft + 'px';
//更新每列的高度
hArr[index] += oBox[i].offsetHeight;
}
}
//获取每列高度最小的索引值
function getMinIndex(arr,value){
for(var i in arr){
if(arr[i] == value){
return i;
}
}
}
6、根据最后一张图片的位置确定是否继续加载图片(懒加载)
假设是后台给的数据
//数据
var dataInt = {'data':[{'src':'1.jpg'},{'src':'2.jpg'},{'src':'3.jpg'},{'src':'4.jpg'}]};
当滚动条滚动时执行
//滚动条滚动时
window.onscroll = function(){
scrollSlide(dataInt);
}
根据最后一张图片的位置,来判断是否进行加载
//判断是否具有了滚条加载数据块的条件
function checkScrollSlide(parent,clsname){
var oParent = document.getElementById(parent);
var oBox = getByClass(oParent,clsname);
var lastBoxH = oBox[oBox.length-1].offsetTop + Math.floor(oBox[oBox.length-1].offsetHeight/2);
var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
var height = document.documentElement.clientHeight || document.body.clientHeight;
return (lastBoxH < scrollTop + height)? true:false;
}
加载图片
//滚动条滚动时执行
function scrollSlide(dataInt){
////判断是否具有了滚条加载数据块的条件
if(checkScrollSlide('main','box')){
var oParent = document.getElementById('main');
//将数据块渲染到当前页面的尾部
for(var i=0;i<dataInt.data.length;i++){
var oBoxs = document.createElement('div');
oBoxs.className = 'box';
oParent.appendChild(oBoxs);
var oPic = document.createElement('div');
oPic.className = 'pic';
oBoxs.appendChild(oPic);
var oImg = document.createElement('img');
oImg.src = 'images/' + dataInt.data[i].src;
oPic.appendChild(oImg);
}
waterfall('main','box');
}
▓▓▓▓▓▓ 用jQurey实现
用jQuery实现的思路都是一样的,就直接放代码
$(window).on('load',function(){
waterfall();
var dataInt={'data':[{'src':'1.jpg'},{'src':'2.jpg'},{'src':'3.jpg'},{'src':'4.jpg'}]};
$(window).on('scroll',function(){
scrollSlide(dataInt);
})
});
function waterfall(){
var $oBox = $('#main>div');
var oBoxW = $oBox.eq(0).outerWidth();
var cols = Math.floor($(window).width()/oBoxW);
$('#main').css({
'width' : cols * oBoxW,
'margin' : '0 auto'
});
var hArr = [];
$oBox.each(function(index,value){
var oBoxH = $oBox.eq(index).height();
if(index<cols){
hArr.push(oBoxH);
}else{
var minH = Math.min.apply(null,hArr);
var minHIndex = $.inArray(minH,hArr);
$(value).css({
'position' : 'absolute',
'top': minH + 15,
'left' : $oBox.eq( minHIndex ).position().left
});
hArr[minHIndex] += $oBox.eq(index).height() + 15;
}
});
}
function checkScrollSlide(){
var $lastBox = $('#main>div').last();
var lastBoxH = $lastBox.offset().top + Math.floor($lastBox.height()/2);
var scrollTop = $(window).scrollTop();
var clientH = $(window).height();
return (lastBoxH < scrollTop + clientH) ? true : false;
}
function scrollSlide(dataInt){
if(checkScrollSlide()){
$.each(dataInt.data,function(index,value){
var $Box = $('<div>').addClass('box').appendTo('#main');
var $Pic = $('<div>').addClass('pic').appendTo($Box);
$('<img>').attr('src','images/' + $(value).attr('src')).appendTo($Pic);
})
waterfall();
}
}
用JavaScript和jQuery实现瀑布流的更多相关文章
- 网友微笑分享原创Jquery实现瀑布流特效
首先非常感谢网友微笑的无私分享,此Jquery特效是一款非常流行和实用的瀑布流布局,核心代码只有几十行,是我见过代码量最少的瀑布流布局,非常适合网友们学习哦,希望大家好好看一下这个Jquery特效的原 ...
- 【前端】用jQuery实现瀑布流效果
jQuery实现瀑布流效果 何为瀑布流: 瀑布流,又称瀑布流式布局.是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部.最早 ...
- 用jQuery实现瀑布流效果学习笔记
jQuery一直没系统的学,只知道是js库,封装了好多js函数,方便了开发.以前做过一个原生的图片网站瀑布流效果,超级麻烦,这次用了jQuery方法,瞬间代码浓缩了,只有56行js代码.神奇的让我来把 ...
- 用jquery实现瀑布流案例
一.瀑布流是我们常见的案例,这里主要讲述,用jquery的方式实现瀑布流的功能! 引言:我们经常见到很多网站的瀑布流功能,如淘宝.京东这些商品等等.. 实现它我们首先考虑几个问题:1.获取到数据 ...
- 前端jQuery实现瀑布流
瀑布流是我们经常会见到的东西,一直刷新一直有,其实它实现起来是很简单的.具体代码如下 1.css代码 <style> *{ margin:; padding:; } .container{ ...
- jQuery实现瀑布流
瀑布流布局多用于加载图片,或者图片配上文字.视觉表现为参差不齐的多栏布局.随着页面滚动条向下滚动,还会不断加载数据块并附加至当前尾部.本文就来利用jQuery实现一个图片瀑布流的效果. 1.布局. 首 ...
- Jquery简单瀑布流代码示例
最近很多网站都采用瀑布流风格设计,感觉挺有个性的,比较合适做图片类型的网站,没事仿开心网做一个瀑布流示例. 需要用到Jquery,jquery.masonry.min.js <!DOCTYPE ...
- jquery版瀑布流
一个月前用jquery实现了瀑布流效果,看着当时的代码有点难过……今天抽时间稍微修改了一下.额,现在看起来不是那么难受了,就来和大家分享一下.废话不多说,开始正题~ 一.演示效果 二.html代码 & ...
- jQuery制作瀑布流(转)
“瀑布流布局”随着pinterest网的流行而出名,现在国内使用这种风格布局的网站也越来越多,比如说Mark之,蘑菇街,点点网,哇哦等等.我第一次听到这个布局名称是来自于“乔花写的<瀑布流布局浅 ...
随机推荐
- Visual Studio项目模板与向导开发
在[Xamarin+Prism开发详解系列]里面经常使用到[Prism unity app]的模板创建Prism.Forms项目: 备注:由于Unity社区已经不怎么活跃,下一个版本将会有Autofa ...
- [html5]学习笔记一 新增的非主体结构元素
html新增加的非主体结构元素,主要是用来表示附加信息的,包括header,footer,hgroup,address元素. 1.header元素 header元素是一种具有引导和导航作用的结构元素, ...
- jq-实战之表格筛选
css部分 .select{background: #ccc} html部分 table width="> <thead> <th>姓名</th> ...
- C++编程练习(1)----“实现简单的线性表的顺序存储结构“
线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素. 故可以用数组来实现顺序存储结构. 用C++编写的利用数组实现简单的读取.插入和删除功能的线性表. #include< ...
- react native 运行项目下载gradle慢的解决办法
react-native run-android 慢 React-native run-Android中需要下载https://services.gradle.org/distributions/gr ...
- linux gdb基本概念
GDB是一个功能强大的调试器,它是一个自由软件,能够用在许多UNIX平台上.它同时也是Linux系统中的默认调试器.GDB已被移植到许多其他的计算机平台上,并且能够用于调试嵌入式实时系统.一般来说,G ...
- linux上安装Oracle 11g R2 标准版 64位
一.Oracle 安装前的准备 检查一下包,必须全部安装: binutils-2.20.51.0.2-5.43.el6.x86_64 compat-libstdc++-296-2.96-144.el6 ...
- ConOS安装mysql5.7 及简单配置
安装 保证你的用户有权限 安装 没有 切换 root su root (su的意思:swich user) # rpm -ivh http://dev.mysql.com/get/mysql57- ...
- 文件读写监控(inotify, systemtap)
一.inotify inotify是内核的一个特性,可以用来监控目录.文件的读写等事件,当监控目标是目录时,inotify除了会监控目录本身,还会监控目录中的文件.inotify的监控功能由 ...
- layer弹出层中H5播放器全屏出错解决 & 属性poster底图占满<video>的方法
1. 在layer弹窗组件中 如果使用了flash播放器,全屏是正常的 但若使用了HTML5的播放器,全屏失效 举个栗子 <!DOCTYPE html> <html> < ...