js自定义瀑布流布局插件


Posted in Javascript onMay 16, 2017

瀑布流布局是网页中经常采用的一种布局方式,其布局有如下特点:

瀑布流布局特点:

(1)图文元素按列排放
(2)列宽一致,但高度不等
(3)布局过程中将优先向高度最小的列补充数据

以下是自定义的一个jQuery瀑布流插件:jquery.myWaterfull.js

(function ($) {
 $.fn.extend({
  myWaterfull: function () {

   var parentWidth = $(this).width(); //获取每行的宽度
   var childItems = $(this).children();
   var childWidth = childItems.width(); //获取每一列的列宽
   var column = 5; //定义每行有多少列
   //计算并设置列与列之间的间隙
   var space = (parentWidth - column * childWidth) / (column - 1);
   //声明一个数组,用来存放第一行中每一列的高度
   var arrHeight = [];

   //对子元素进行排列布局
   $.each(childItems, function (index, item) {
    if (index < column) { //对第一行的列进行排列布局
     $(item).css({
      top: 0,
      left: index * (childWidth + space)
     });
     arrHeight.push($(item).height() + space); //将第一行中的列的高度添加到数组中
    } else {
     //找寻列高最小的那一列
     var minIndex = 0;
     var minValue = arrHeight[minIndex];
     //循环遍历找出最小的列高值
     for (var i = 0; i < arrHeight.length; i++) {
      if (minValue > arrHeight[i]) {
       minValue = arrHeight[i];
       minIndex = i;
      }
     }

     //对余下的子元素挨个排列布局
     $(item).css({
      top: minValue + space,
      left: minIndex * (childWidth + space)
     });

     //更新最小列高
     arrHeight[minIndex] += $(item).height() + space;
    }
   });

   //由于这里是利用定位对子元素进行布局,所以要更新父元素的高度
   //当然也可以利用浮动对子元素进行布局
   var maxHeight = 0;
   for (var i = 0; i < arrHeight.length; i++) {
    if (maxHeight < arrHeight[i]) {
     maxHeight = arrHeight[i];
    }
   }

   //设置父元素的高度
   $(this).height(maxHeight);

  }
 });
})(jQuery);

使用示例:

这里假设一个HTML结构:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
 <meta charset="UTF-8">
 <title>瀑布流案例原始</title>
 <style>
* {
 margin: 0;
 padding: 0;
}

body {
 font-family: Microsoft Yahei;
 background-color: #f5f5f5;
}

.container {
 width: 1200px;
 margin: 0 auto;
 padding-top: 50px;
}

.container > .items {
 position: relative;
}

.container > .items > .item {
 width: 232px;
 position: absolute;
 box-shadow: 0 1px 3px rgba(0, 0, 0, .3);
 overflow: hidden;
}

.container > .items > .item > img {
 width: 100%;
 display: block;
 height: 232px;
}

.container > .items > .item:nth-child(3n) > img {
 width: 100%;
 display: block;
 height: 350px;
}

.container > .items > .item > p {
 margin: 0;
 padding: 10px;
 background: #fff;
}

.container > .btn {
 width: 280px;
 height: 40px;
 text-align: center;
 line-height: 40px;
 background-color: #ccc;
 border-radius: 8px;
 font-size: 24px;
 cursor: pointer;
}

.container > .loading {
 background-color: transparent;
}
</style>
</head>
<body>
<div class="container">
 <div class="items">

 </div>
 <div class="btn loading">正在加载...</div>
</div>

书写脚本文件,这里假设从后台获取子元素的数据,并用artTemplate模板引擎将数据渲染到页面:

<script src="JS/jquery.min.js"></script>
<script src="JS/jquery.myWaterfull.js"></script>
<script src="JS/template.js"></script>

//定义引擎模板
<script id="template" type="text/html">
 {{ each items as item index}}
 <div class="item">
  <img src="{{item.path}}" alt="">
  <p>{{item.text}}</p>
 </div>
 {{/each}}
</script>

//书写脚本
$(function () {
 //根据接口文档,向服务器请求数据
 var page = 1, pageSize = 20;
 //当DOM结构加载完毕,就调用一次render函数
 render();
 function render() {
  $.ajax({
   type: "get",
   url: "php/data.php",
   data: {
    page: page,
    pageSize: pageSize
   },
   beforeSend: function () { //在发送请求前改变按钮的内容
    $(".btn").html("正在加载...").addClass("loading");
   },
   success: function (data) {
    //2.借助模板引擎,渲染数据
    var tplStr = template("template", data);
    $(".items").append(tplStr);
    $(".items").myWaterfull();
    //当加载完成后,改变按钮内容和样式
    $(".btn").html("加载更多").removeClass("loading");
    //当后台数据展示完毕时,向用户提示
    if (data.items.length < pageSize) {
     $(".btn").html("没有更多内容了").addClass("loading");
    }
    //每次响应成功后,将从后台返回的page保存起来
    page = data.page;
   }
  });
 }

 //当点击按钮时,加载下一页数据
 $(".btn").on('click',function () {
  if($(".btn").hasClass("loading")) return false;
  render();
 });

 //当页面滚动到数据底部的时候加载数据
 $(window).on('scroll',function () {
  //判断是否滚动到底部
  var isBottom = ($('.items').height()-($(window).height()-$('.items').offset().top))-$(window).scrollTop();
  if (isBottom <= 200 && !$('.btn').hasClass("loading")) render();
 });


});

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
checkbox全选/取消全选以及checkbox遍历jQuery实现代码
Dec 02 Javascript
一个JavaScript用逗号分割字符串实例
Sep 22 Javascript
了不起的node.js读书笔记之mongodb数据库交互
Dec 22 Javascript
jQuery菜单插件用法实例
Jul 25 Javascript
jQuery如何使用自动触发事件trigger
Nov 29 Javascript
js判断移动端是否安装某款app的多种方法
Dec 18 Javascript
JavaScript实现倒计时跳转页面功能【实用】
Dec 13 Javascript
基于bootstrap的文件上传控件bootstrap fileinput
Dec 23 Javascript
Angularjs按需查询实例代码
Oct 30 Javascript
Vue无限滑动周选择日期的组件的示例代码
Jul 18 Javascript
highCharts提示框中显示当前时间的方法
Jan 18 Javascript
基于JavaScript获取base64图片大小
Oct 18 Javascript
简单实现js点击展开二级菜单功能
May 16 #Javascript
JavaScript禁止微信浏览器下拉回弹效果
May 16 #Javascript
jQuery实现div跟随鼠标移动
Aug 20 #jQuery
jquery+ajax实现省市区三级联动 (封装和不封装两种方式)
May 15 #jQuery
bootstrap响应式表格实例详解
May 15 #Javascript
VUE多层路由嵌套实现代码
May 15 #Javascript
JavaScript制作简单的框选图表
May 15 #Javascript
You might like
本地机apache配置基于域名的虚拟主机详解
2013/08/10 PHP
PHP的Yii框架中Model模型的学习教程
2016/03/29 PHP
php实现QQ小程序发送模板消息功能
2019/09/18 PHP
JSQL  一个 web DB 的封装
2010/05/05 Javascript
js对象之JS入门之Array对象操作小结
2011/01/09 Javascript
JavaScript中:表达式和语句的区别[译]
2012/09/17 Javascript
写JQuery插件的基本知识
2013/11/25 Javascript
浅析JavaScript中的CSS属性及命名规范
2013/11/28 Javascript
jQuery学习笔记之jQuery.extend(),jQuery.fn.extend()分析
2014/06/09 Javascript
JavaScript获得指定对象大小的方法
2015/07/01 Javascript
三种带箭头提示框总结实例
2016/06/14 Javascript
浅析Nodejs npm常用命令
2016/06/14 NodeJs
JS+HTML5 FileReader对象用法示例
2017/04/07 Javascript
详解适配器在JavaScript中的体现
2018/09/28 Javascript
JavaScript工具库之Lodash详解
2019/06/15 Javascript
微信小程序事件 bindtap bindinput代码实例
2019/08/26 Javascript
js面向对象之实现淘宝放大镜
2020/01/15 Javascript
[02:12]2019完美世界全国高校联赛(春季赛)报名开启
2019/03/01 DOTA
python抓取京东商城手机列表url实例代码
2013/12/18 Python
深入解析Python中的线程同步方法
2016/06/14 Python
使用pandas中的DataFrame数据绘制柱状图的方法
2018/04/10 Python
在windows下Python打印彩色字体的方法
2018/05/15 Python
Anaconda2下实现Python2.7和Python3.5的共存方法
2018/06/11 Python
python pygame实现方向键控制小球
2019/05/17 Python
django 连接数据库 sqlite的例子
2019/08/14 Python
python内置函数sorted()用法深入分析
2019/10/08 Python
解决导入django_filters不成功问题No module named 'django_filter'
2020/07/15 Python
PyTorch 中的傅里叶卷积实现示例
2020/12/11 Python
python 实现有道翻译功能
2021/02/26 Python
app内嵌H5 webview 本地缓存问题的解决
2020/10/19 HTML / CSS
专门经营化妆刷的美国彩妆品牌:Sigma Beauty
2017/09/11 全球购物
加拿大鞋网:Globo Shoes
2019/12/26 全球购物
北京RT科技有限公司.net工程师面试题
2013/02/15 面试题
祖国在我心中演讲稿450字
2014/09/05 职场文书
公务员政审个人总结
2015/02/12 职场文书
Python pygame实现中国象棋单机版源码
2021/06/20 Python