jQuery实现瀑布流布局


Posted in Javascript onDecember 12, 2014

HTML

 <div id="main">

         <div class="box">

             <div class="pic">

                 <img src="images/0.jpg" alt="">

             </div>

         </div>

         <div class="box">

             <div class="pic">

                 <img src="images/1.jpg" alt="">

             </div>

         </div>

         <div class="box">

             <div class="pic">

                 <img src="images/2.jpg" alt="">

             </div>

         </div>

         <div class="box">

             <div class="pic">

                 <img src="images/3.jpg" alt="">

             </div>

         </div>

         <div class="box">

             <div class="pic">

                 <img src="images/4.jpg" alt="">

             </div>

         </div>

         <div class="box">

             <div class="pic">

                 <img src="images/2.jpg" alt="">

             </div>

         </div>

 </div>

CSS

 * {

     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: 0px 0px 5px #ccc;

     img {

         width:165px;

         height:auto;

     }

 }

JavaScript

 $(window).on("load",function () {

     waterfall();

     var dataInt = { "data":[{"src":"7.jpg"},{"src":"8.jpg"},{"src":"9.jpg"},{"src":"6.jpg"}]}

     //模拟json数据;

     $(window).on("scroll",function () {

         if(checkScrollSlide){

             $.each(dataInt.data,function (key,value) {

                 var oBox=$("<div>").addClass("box").appendTo($("#main"));

                 //jQuery支持连缀,隐式迭代;

                 var oPic=$("<div>").addClass('pic').appendTo($(oBox));

                 $("<img>").attr("src","images/"+$(value).attr("src")).appendTo(oPic);

             });

             waterfall();

         }

     })

 });

 //流式布局主函数;

 function waterfall () {

     var $boxs=$("#main>div");

     //获取#main元素下的直接子元素div.box;

     //获取每一列的宽度;

     var w=$boxs.eq(0).outerWidth();

     //outerWidth()获取包含padding和border在内的宽度;

     //var w=$boxs.eq(0).width();

     //width()只能获取给元素定义的宽度;

     var cols=Math.floor($(window).width()/w);

     //获取多少列;

     $("#main").width(w*cols).css("margin","0 auto");

     //设置#main元素的宽度和居中样式;

     var hArr=[];

     //每一列高度的集合;

     $boxs.each(function (index,value) {

     //遍历每一个box元素;

     //为了找到之前所有元素的最低点,然后将本元素设置到最低点之下;

         var h=$boxs.eq(index).outerHeight();

         //每一个box元素的高,

         if (index<cols) {

             hArr[index]=h;

             //确定每列第一个元素的高度;

         } else{

             var minH=Math.min.apply(null,hArr);

             //得出列高数组中的最小高度;

             var minHIndex=$.inArray(minH,hArr);

             //$.inArray()方法得出元素(minH)在数组(hArr)中的index值;

             //console.log(value);

             //此时的value是第一行之后的所有的box元素的DOM对象!;

             $(value).css({

             //$(value):将DOM对象转换成jQuery对象,才能继续使用jQuery方法;

                 "position":"absolute",

                 "top":minH+"px",

                 "left":minHIndex*w+"px"

             });

             hArr[minHIndex]+=$boxs.eq(index).outerHeight();

             //最低高元素的高度+刚添加到最低高度下的元素的高度=新的列高;

         };

     });

     // console.log(hArr);

 };

 function checkScrollSlide () {

     var $lastBox=$("#main>div").last();

     var lastBoxDis=$lastBox.offset().top+Math.floor($lastBox.outerHeight()/2);

     var scrollTop=$(window).scrollTop();

     var documentH=$(window).height();

     return (lastBoxDis<scrollTop+documentH)?true:false;

 }

详细解释清仔细参考注释吧,我就不单独再拉出来写了。

Javascript 相关文章推荐
用javascript来实现动画导航效果的代码
Dec 16 Javascript
javscript对象原型的一些看法
Sep 19 Javascript
深入学习JavaScript对象
Oct 13 Javascript
jQuery实现页面下拉100像素出现悬浮窗口的方法
Sep 05 Javascript
实现隔行换色效果的两种方式【实用】
Nov 27 Javascript
jQuery插件DataTable使用方法详解(.Net平台)
Dec 22 Javascript
JS实现的自动打字效果示例
Mar 10 Javascript
Vue2递归组件实现树形菜单
Apr 10 Javascript
CountUp.js实现数字滚动增值效果
Oct 17 Javascript
antd-日历组件,前后禁止选择,只能选中间一部分的实例
Oct 29 Javascript
Vue3+elementui plus创建项目的方法
Dec 01 Vue.js
jquery+ajax验证不通过也提交表单问题处理
Dec 12 #Javascript
js 左右悬浮对联广告代码示例
Dec 12 #Javascript
原生JavaScript+LESS实现瀑布流
Dec 12 #Javascript
jquery禁止回车触发表单提交
Dec 12 #Javascript
完美兼容各大浏览器的jQuery插件实现图片切换特效
Dec 12 #Javascript
windows8.1+iis8.5下安装node.js开发环境
Dec 12 #Javascript
jQuery 和 CSS 的文本特效插件集锦
Dec 12 #Javascript
You might like
PHP curl 并发最佳实践代码分享
2012/09/05 PHP
php实现html标签闭合检测与修复方法
2015/07/09 PHP
PHP 常用时间函数资料整理
2016/10/22 PHP
php实现基于pdo的事务处理方法示例
2017/07/21 PHP
PHP生成推广海报的方法分享
2018/04/22 PHP
AJAX异步从优酷专辑中采集所有视频及信息(JavaScript代码)
2010/11/20 Javascript
JavaScript 原型继承之构造函数继承
2011/08/26 Javascript
ASP.NET jQuery 实例2 (表单中使用回车在TextBox之间向下移动)
2012/01/13 Javascript
删除节点的jquery代码
2014/01/13 Javascript
javascript获取文档坐标和视口坐标
2015/05/26 Javascript
javascript实现支持移动设备画廊
2015/08/24 Javascript
cocos2dx骨骼动画Armature源码剖析(三)
2015/09/08 Javascript
简单实现JS倒计时效果
2016/12/23 Javascript
jQuery表单插件ajaxForm实例详解
2017/01/17 Javascript
Vue.set()实现数据动态响应的方法
2018/02/07 Javascript
Koa2微信公众号开发之本地开发调试环境搭建
2018/05/16 Javascript
解决vue更新路由router-view复用组件内容不刷新的问题
2019/11/04 Javascript
python使用MySQLdb访问mysql数据库的方法
2015/08/03 Python
详解python字节码
2018/02/07 Python
python爬虫自动创建文件夹的功能
2018/08/01 Python
Python实用库 PrettyTable 学习笔记
2019/08/06 Python
python 中Arduino串口传输数据到电脑并保存至excel表格
2019/10/14 Python
使用Python爬虫库requests发送表单数据和JSON数据
2020/01/25 Python
python+requests接口自动化框架的实现
2020/08/31 Python
如何利用input事件来监听移动端的输入
2016/04/15 HTML / CSS
html5移动端自适应布局的实现
2020/04/15 HTML / CSS
英国花园、DIY、电器和家居用品商店:Robert Dyas
2019/03/18 全球购物
输入一行文字,找出其中大写字母、小写字母、空格、数字、及其他字符各有多少
2016/04/15 面试题
C#和SQL Server的面试题
2016/08/12 面试题
说一下Linux下有关用户和组管理的命令
2016/01/04 面试题
中班上学期幼儿评语
2014/04/30 职场文书
2014城乡环境综合治理工作总结
2014/12/19 职场文书
学前班语言教学计划
2015/01/20 职场文书
居安思危观后感
2015/06/11 职场文书
导游词之京东大峡谷旅游区
2019/10/29 职场文书
redis lua限流算法实现示例
2022/07/15 Redis