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 相关文章推荐
JS方法调用括号的问题探讨
Jan 24 Javascript
jquery分页插件jpaginate在IE中不兼容问题
Apr 22 Javascript
jQuery控制的不同方向的滑动(向左、向右滑动等)
Jul 18 Javascript
javascript中数组array及string的方法总结
Nov 28 Javascript
jQuery实现选中弹出窗口选择框内容后赋值给文本框的方法
Nov 23 Javascript
jQuery自制提示框tooltip改进版
Aug 01 Javascript
jQuery 点击获取验证码按钮及倒计时功能
Sep 20 jQuery
基于Proxy的小程序状态管理实现
Jun 14 Javascript
弱类型语言javascript开发中的一些坑实例小结【变量、函数、数组、对象、作用域等】
Aug 07 Javascript
Vue中常用rules校验规则(实例代码)
Nov 14 Javascript
浅谈Vuex的this.$store.commit和在Vue项目中引用公共方法
Jul 24 Javascript
解决vscode进行vue格式化,会自动补分号和双引号的问题
Oct 26 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上传文件并显示上传进度的方法
2015/03/24 PHP
Ajax+Jpgraph实现的动态折线图功能示例
2019/02/11 PHP
javascript web对话框与弹出窗口
2009/02/22 Javascript
javascript 对象定义方法 简单易学
2009/03/22 Javascript
学习ExtJS Column布局
2009/10/08 Javascript
JavaScript高级程序设计 学习笔记 js高级技巧
2011/09/20 Javascript
7款吸引人眼球的jQuery/CSS3特效实例分享
2013/04/25 Javascript
javascript的parseFloat()方法精度问题探讨
2013/11/26 Javascript
js函数调用的方式
2014/05/06 Javascript
zTree插件下拉树使用入门教程
2016/04/11 Javascript
实例讲解Jquery中隐藏hide、显示show、切换toggle的用法
2016/05/13 Javascript
Javascript中的 “&amp;” 和 “|” 详解
2017/02/02 Javascript
浅谈angular2路由预加载策略
2017/10/04 Javascript
面包屑导航详解
2017/12/07 Javascript
webpack搭建vue 项目的步骤
2017/12/27 Javascript
实例解析ES6 Proxy使用场景介绍
2018/01/08 Javascript
vue之将echart封装为组件
2018/06/02 Javascript
vue路由前进后退动画效果的实现代码
2018/12/10 Javascript
Vue递归组件+Vuex开发树形组件Tree--递归组件的简单实现
2019/04/01 Javascript
详解js根据百度地图提供经纬度计算两点距离
2019/05/13 Javascript
Python中的列表生成式与生成器学习教程
2016/03/13 Python
利用Python抓取行政区划码的方法
2016/11/28 Python
在Python的一段程序中如何使用多次事件循环详解
2017/09/07 Python
python+influxdb+shell编写区域网络状况表
2018/07/27 Python
Python3中bytes类型转换为str类型
2018/09/27 Python
django执行数据库查询之后实现返回的结果集转json
2020/03/31 Python
用Python在Excel里画出蒙娜丽莎的方法示例
2020/04/28 Python
python 解决Fatal error in launcher:错误问题
2020/05/21 Python
聊聊python在linux下与windows下导入模块的区别说明
2021/03/03 Python
Chi Chi London官网:购买连衣裙和礼服
2020/10/25 全球购物
大门门卫岗位职责
2013/11/30 职场文书
小学毕业感言300字
2014/02/19 职场文书
公司委托书格式范本
2014/09/16 职场文书
linux下导入、导出mysql数据库命令的实现方法
2021/05/26 MySQL
2022漫威和DC电影上映作品
2022/04/05 欧美动漫
2022新作动画《福星小子》释出宣传影片 加入内田真礼&宫野真守配音演出
2022/04/08 日漫