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 相关文章推荐
javascript new一个对象的实质
Jan 07 Javascript
什么是DOM(Document Object Model)文档对象模型
Mar 05 Javascript
javascript中的缓动效果实现程序
Dec 29 Javascript
javascript实现可改变滚动方向的无缝滚动实例
Jun 17 Javascript
使用GruntJS构建Web程序之安装篇
Jun 04 Javascript
js实现html table 行,列锁定的简单实例
Oct 13 Javascript
AngularJS全局scope与Isolate scope通信用法示例
Nov 22 Javascript
用最简单的方法判断JavaScript中this的指向(推荐)
Sep 04 Javascript
ES6中Array.copyWithin()函数的用法实例详解
Sep 16 Javascript
微信小程序项目实践之验证码倒计时功能
Jul 18 Javascript
Vue刷新修改页面中数据的方法
Sep 16 Javascript
详解JavaScript原型与原型链
Nov 16 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
PHP超级全局变量数组小结
2012/10/04 PHP
如何让thinkphp在模型中自动完成session赋值小教程
2014/09/05 PHP
一个页面放2段图片滚动代码出现冲突的问题如何解决
2012/12/21 Javascript
JS求平均值的小例子
2013/11/29 Javascript
文本框文本自动补全效果示例分享
2014/01/19 Javascript
jQuery 获取兄弟元素的几种不错方法
2014/05/23 Javascript
一个判断抢购时间是否到达的简单的js函数
2014/06/23 Javascript
JavaScript获取DOM元素的11种方法总结
2015/04/25 Javascript
多种JQuery循环滚动文字图片效果代码
2020/06/23 Javascript
详解javascript事件绑定使用方法
2016/10/20 Javascript
bootstrap table分页模板和获取表中的ID方法
2017/01/10 Javascript
JavaScript和jQuery制作光棒效果
2017/02/24 Javascript
webpack打包js的方法
2018/03/12 Javascript
Paypal支付不完全指北
2020/06/04 Javascript
浅谈vue-props的default写不写有什么区别
2020/08/09 Javascript
[01:35]2018年度CS GO最佳战队-完美盛典
2018/12/17 DOTA
使用Python脚本操作MongoDB的教程
2015/04/16 Python
python+opencv实现霍夫变换检测直线
2020/10/23 Python
浅谈python多进程共享变量Value的使用tips
2019/07/16 Python
pycharm重命名文件的方法步骤
2019/07/29 Python
Apache部署Django项目图文详解
2019/07/30 Python
Django shell调试models输出的SQL语句方法
2019/08/29 Python
Python 利用邮件系统完成远程控制电脑的实现(关机、重启等)
2019/11/19 Python
使用Matplotlib 绘制精美的数学图形例子
2019/12/13 Python
关于Python Tkinter Button控件command传参问题的解决方式
2020/03/04 Python
Python如何实现大型数组运算(使用NumPy)
2020/07/24 Python
加拿大便宜的隐形眼镜商店:Clearly
2016/09/15 全球购物
阿迪达斯意大利在线商店:adidas意大利
2016/09/19 全球购物
西班牙香水和化妆品购物网站:Arenal Perfumerías
2019/03/01 全球购物
成功的酒店创业计划书
2013/12/27 职场文书
茶叶生产计划书
2014/01/10 职场文书
建国大业观后感600字
2015/06/01 职场文书
公司员工奖惩制度
2015/08/04 职场文书
创业计划书之游泳馆
2019/09/16 职场文书
浅谈Java实现分布式事务的三种方案
2021/06/11 Java/Android
Tomcat starup.bat 脚本实现开机自启动
2022/04/20 Servers