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 相关文章推荐
IE6与IE7中,innerHTML获取param的区别
Mar 15 Javascript
Jquery获取复选框被选中值的简单方法
Jul 04 Javascript
点击标签切换和自动切换DIV选项卡
Aug 10 Javascript
vue中的计算属性的使用和vue实例的方法示例
Dec 04 Javascript
详解在vue-cli中使用graphql即vue-apollo的用法
Sep 08 Javascript
详解Webpack loader 之 file-loader
Nov 07 Javascript
基于iview的router常用控制方式
May 30 Javascript
Node对CommonJS的模块规范
Nov 06 Javascript
js+canvas实现五子棋小游戏
Aug 02 Javascript
js定时器出现第一次延迟的原因及解决方法
Jan 04 Javascript
游戏开发中如何使用CocosCreator进行音效处理
Apr 14 Javascript
使用这 6个Vue加载动画库来减少我们网站的跳出率
May 18 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获取301跳转URL简单实例
2013/12/16 PHP
php从数据库查询结果生成树形列表的方法
2015/04/17 PHP
Yii2框架引用bootstrap中日期插件yii2-date-picker的方法
2016/01/09 PHP
Yii 2中的load()和save()示例详解
2017/08/03 PHP
会自动逐行上升的文本框
2006/06/30 Javascript
Javascript事件热键兼容ie|firefox
2010/12/30 Javascript
调整小数的格式保留小数点后两位
2014/05/14 Javascript
JQUERY表单暂存功能插件分享
2016/02/23 Javascript
解析javascript瀑布流原理实现图片滚动加载
2016/03/10 Javascript
基于JS实现导航条之调用网页助手小精灵的方法
2016/06/17 Javascript
JavaScript和jQuery获取input框的绝对位置实现方法
2016/10/13 Javascript
JavaScript实现三级联动菜单实例代码
2017/06/26 Javascript
JavaScript 数组去重并统计重复元素出现的次数实例
2017/12/14 Javascript
解决VUE中document.body.scrollTop为0的问题
2018/09/15 Javascript
微信小程序时间轴实现方法示例
2019/01/14 Javascript
微信小程序制作扭蛋机代码实例
2019/09/24 Javascript
js基础之事件捕获与冒泡原理
2019/10/09 Javascript
Python下载网络小说实例代码
2018/02/03 Python
django 解决manage.py migrate无效的问题
2018/05/27 Python
详解python中的Turtle函数库
2018/11/19 Python
python迭代器常见用法实例分析
2019/11/22 Python
python 实现将Numpy数组保存为图像
2020/01/09 Python
Pycharm远程连接服务器并实现代码同步上传更新功能
2020/02/25 Python
python中uuid模块实例浅析
2020/12/29 Python
日本PLST在线商店:日本时尚杂志刊载的人气服装
2016/12/10 全球购物
英国空调、除湿机和通风设备排名第一:Air Con Centre
2019/02/25 全球购物
英语专业毕业生自荐信
2013/10/28 职场文书
公司中层干部的自我评价分享
2014/03/01 职场文书
住院医师规范化培训实施方案
2014/06/12 职场文书
新文化运动的口号
2014/06/21 职场文书
干部作风整顿自我剖析材料和整改措施
2014/09/18 职场文书
2015年禁毒宣传活动总结
2015/03/25 职场文书
惊涛骇浪观后感
2015/06/05 职场文书
2015年小学生暑假总结
2015/07/13 职场文书
Python获取百度热搜的完整代码
2021/04/07 Python
app场景下uniapp的扫码记录
2022/07/23 Java/Android