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 相关文章推荐
如何快速的呈现我们的网页的技巧整理
Jul 01 Javascript
jquery 事件执行检测代码
Dec 09 Javascript
jQuery之浮动窗口实现代码(两种方法)
Sep 08 Javascript
使用Firebug对js进行断点调试的图文方法
Apr 02 Javascript
Google (Local) Search API的简单使用介绍
Nov 28 Javascript
Vue.js每天必学之Class与样式绑定
Sep 05 Javascript
Bootstrap框架安装使用详解
Jan 21 Javascript
ionic 3.0+ 项目搭建运行环境的教程
Aug 09 Javascript
Vue 表单控件绑定的实现示例
Aug 11 Javascript
layui table单元格事件修改值的方法
Sep 24 Javascript
vue使用canvas实现移动端手写签名
Sep 22 Javascript
如何vue使用el-table遍历循环表头和表体数据
Apr 26 Vue.js
简单实现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/03/25 PHP
Yii基于数组和对象的Model查询技巧实例详解
2015/12/28 PHP
php中array_slice和array_splice函数解析
2016/10/18 PHP
PHP 范围解析操作符(::)用法分析【访问静态成员和类常量】
2020/04/14 PHP
通过event对象的fromElement属性解决热区设置主实体的一个bug
2008/12/22 Javascript
一个js的tab切换效果代码[代码分离]
2010/04/11 Javascript
Jquery插件之多图片异步上传
2010/10/20 Javascript
Javascript图片上传前的本地预览实例
2014/06/16 Javascript
jquery学习总结(超级详细)
2014/09/04 Javascript
jQuery中$.get、$.post、$.getJSON和$.ajax的用法详解
2014/11/19 Javascript
使用js画图之正弦曲线
2015/01/12 Javascript
在JavaScript的正则表达式中使用exec()方法
2015/06/16 Javascript
动态加载jQuery的方法
2015/06/16 Javascript
学习JavaScript设计模式(封装)
2015/11/26 Javascript
jQuery无刷新上传之uploadify3.1简单使用
2016/06/18 Javascript
Bootstrap3制作搜索框样式的方法
2016/07/11 Javascript
js定时器实例分享
2016/12/20 Javascript
vue实现导航栏效果(选中状态刷新不消失)
2017/12/13 Javascript
使用javascript做时间倒数读秒功能的实例
2019/01/23 Javascript
python中常用的各种数据库操作模块和连接实例
2014/05/29 Python
Python使用cx_Oracle模块操作Oracle数据库详解
2018/05/07 Python
Python基于xlrd模块操作Excel的方法示例
2018/06/21 Python
Python多重继承之菱形继承的实例详解
2020/02/12 Python
为什么是 Python -m
2020/06/19 Python
Python爬取你好李焕英豆瓣短评生成词云的示例代码
2021/02/24 Python
阿里巴巴英国:Alibaba英国
2019/12/11 全球购物
牵手50新加坡:专为黄金岁月的单身人士而设的交友网站
2020/08/16 全球购物
自荐书模板
2013/12/19 职场文书
优秀中学生事迹材料
2014/01/31 职场文书
大学社团活动总结
2014/04/26 职场文书
保安公司服务承诺书
2014/05/28 职场文书
小学五一劳动节活动总结
2015/02/09 职场文书
2015年中个人总结范文
2015/03/10 职场文书
2015年安全员工作总结范文
2015/04/22 职场文书
党支部审查意见
2015/06/02 职场文书
新入职员工工作总结
2015/10/15 职场文书