jquery实现瀑布流效果 jquery下拉加载新数据


Posted in Javascript onDecember 12, 2016

瀑布流效果在很多网站还是有的,这种错落有致的排布看着还是很不错的呢。今天我就来记录一下关于用jquery实现瀑布流效果的代码;

jquery实现瀑布流效果 jquery下拉加载新数据

一、页面基本排版
1. items盒子主要用来存放我们需要摆放的数据item;
2. tips是页面加载数据的时候用来提示用户的文本;

<div class="wrapper">
  <div class="items">
   <div class="item"></div>
  </div>
  <p class="tips loading">正在加载...</p>
 </div>

二、css样式(控制提示语句摆放的位置,还有数据展示的样式)

body {
  text-align: center;
  margin: 0;
  padding: 0;
  background-color: #F7F7F7;
  font-family: '微软雅黑';
}

.wrapper {
  padding: 50px;
}

img {
  display: block;
  width: 100%;
  height: 300px;
}

.items {
  position: relative;
  padding-bottom: 10px;
}

.item {
  width: 228px;
  position: absolute;
  border: 1px solid #ddd;
}

.tips {
  width: 280px;
  height: 40px;
  margin: 30px auto 0;
  text-align: center;
  line-height: 40px;
  background-color: #CCC;
  border-radius: 6px;
  font-size: 16px;
  cursor: pointer;
  position: fixed;
  bottom: 0px;
  left: 50%;
  margin-left: -140px;
  opacity: 0;
  color: #666;
}

.tips.loading {
   /*background-color: transparent;*/
  background-color: #dadada;
}

三、模版的引用(由于本例子中数据的展示样式都一致,在这里我引用模版artTemplate)关

1. 记得要先引入这个模版的js包;
2. 定义模版的模块要有一个id,还有设置type;

<script src="../js/template_native.js"></script>
 <script type="text/html" id="template">
  <% for(var i = 0; i < items.length; i++){ %>
   <div class='item'>
    <img src="<%=items[i].path%>" alt="">
    <p>
     <%=items[i].text%>
    </p>
   </div>
   <% } %>
 </script>

四、js控制瀑布流的效果

1. 这里,我请求了两个php分别返回了两个模拟数据;

$(function() {
 //页面一加载就出现的图片,对应实际百度图片中点击搜索图片
 $.ajax({
  url: "./reset.php",
  dataType: "json",
  success: function(data) {
   var obj = {
    items: data
   };
   var result = template("template", obj);
   $(".items").html(result);
   waterfall();
  }
 });
});

// 编写瀑布流js

function waterfall() {
 //计算出显示盒子宽度
 var totalWidth = $(".items").width();
 //计算出单张图片宽度(每张图片宽度是一致的)
 var eachWidth = $(".items .item").width();
 //计算出一行能排布几张图片
 var columNum = Math.floor(totalWidth / eachWidth);
 //将剩余的空间设置成外边距
 var margin = (totalWidth - eachWidth * columNum) / (columNum + 1);
 //定义一个数组用来填充高度值
 var heightArr = [];
 for (var i = 0; i < columNum; i++) {
  heightArr[i] = 0;
 }

 //摆放位置 摆放在最小高度处
 var elementItems = $(".items .item");
 elementItems.each(function(idx, ele) {
  //取得一行中高度最小值及其索引
  //定义初始的最小值及其索引值
  var minIndex = 0;
  var minValue = heightArr[minIndex];
  for (var i = 0; i < heightArr.length; i++) {
   if (heightArr[i] < minValue) {
    minIndex = i;
    minValue = heightArr[i];
   }
  }

  $(ele).css({
   //注意点:这儿乘上的是最小值所在的索引idx
   left: margin + (margin + eachWidth) * minIndex,
   top: minValue
  });

  //重新计算高度,更新高度数组
  var oldHeight = heightArr[minIndex];
  oldHeight += $(ele).height() + margin;
  heightArr[minIndex] = oldHeight;
 });

 return heightArr;

}

$(window).on("scroll", function() {
 if (toBottom()) {
  $(".tips").css("opacity", 1);
  $.ajax({
   url: "./index.php",
   dataType: "json",
   success: function(data) {
    var dataItem = {
     items: data
    };
    var res = template("template", dataItem);
    $(".items").append(res);
    waterfall();
    $(".tips").css("opacity", 0);
   }
  });
 }
});

//判断是否已经到底部了
function toBottom() {
 var scrollTop = $(window).scrollTop();
 var clientHeight = $(window).height();
 var offsetTop = $(".items .item:last-child").offset().top;
 console.log(scrollTop + "..." + clientHeight + "..." + offsetTop);
 if (scrollTop + clientHeight > offsetTop) {
  return true;
 } else {
  return false;
 }
}

五、最后在这里奉上的是自定义模拟数据,以及简单编写的php返回数据(别忘了,用此种方式获取数据的话,需要开启本地服务器哦~);

如下为返回数据的基本模式,如果想要定义多条数据,只要多复制几条对象就可;

[
 {
  "path": "./images/1.jpg",
  "text": "中学时候我们班两个同学打赌,内容是在 厕所吃方便面,谁先吃完谁赢,输了的请 赢了的吃一个月的饭,于是厕所里惊现两 个货蹲坑上吃泡面,这俩货还没有决出胜 负,旁边拉屎的哥们都吐了三回了!!!"
 },
 {
  "path": "./images/2.jpg",
  "text": "亲戚有许多好兄弟,平时戏称为马哥,牛哥,等等动物名。一次,有人敲门,那时他儿子尚小,一开门,对着他爸妈就说:爸爸,妈妈,驴来了!"
 }
 ...
]

如下为php代码:

//reset.php
<?php
 $jsonString = file_get_contents('info/reset.json');
 $totalArr = json_decode($jsonString);
 echo json_encode($totalArr);
 ?>
//index.php 这里规定一次返回三条数据
<?php
 $jsonString = file_get_contents('info/data.json');
 $totalArr = json_decode($jsonString);
 $randomKeyArr = array_rand($totalArr,3);
 $templateArr = array();
 for ($i=0; $i <count($randomKeyArr) ; $i++) {
   $currentKey = $randomKeyArr[$i];
   $currentObj = $totalArr[$currentKey];
   $templateArr[$i] = $currentObj;
 }
 echo json_encode($templateArr);
 ?>

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

Javascript 相关文章推荐
jquery checkbox,radio是否选中的判断代码
Mar 20 Javascript
JavaScript 获取当前时间戳的代码
Aug 05 Javascript
jQuery中offset()方法用法实例
Jan 16 Javascript
理解js回收机制通俗易懂版
Feb 29 Javascript
Knockoutjs 学习系列(一)ko初体验
Jun 07 Javascript
AngularJs Javascript MVC 框架
Jun 20 Javascript
jQuery Easyui DataGrid点击某个单元格即进入编辑状态焦点移开后保存数据
Aug 15 Javascript
JS中关于事件处理函数名后面是否带括号的问题
Nov 16 Javascript
浅谈Vue SPA 首屏加载优化实践
Dec 15 Javascript
vue实现PC端录音功能的实例代码
Jun 05 Javascript
Vue 实现从小到大的横向滑动效果详解
Oct 16 Javascript
vue瀑布流组件实现上拉加载更多
Mar 10 Javascript
AngularJS封装指令方法详解
Dec 12 #Javascript
JS+Canvas实现的俄罗斯方块游戏完整实例
Dec 12 #Javascript
最好用的Bootstrap fileinput.js文件上传组件
Dec 12 #Javascript
jQuery Ajax File Upload实例源码
Dec 12 #Javascript
VueJs与ReactJS和AngularJS的异同点
Dec 12 #Javascript
layer实现弹窗提交信息
Dec 12 #Javascript
详解Javascript数据类型的转换规则
Dec 12 #Javascript
You might like
基于mysql的论坛(5)
2006/10/09 PHP
php简单备份与还原MySql的方法
2016/05/09 PHP
PHP基于自定义函数实现的汉字转拼音功能实例
2017/09/30 PHP
PHP实现带进度条的Ajax文件上传功能示例
2019/07/02 PHP
php加速缓存器opcache,apc,xcache,eAccelerator原理与配置方法实例分析
2020/03/02 PHP
NodeJs中的非阻塞方法介绍
2012/06/05 NodeJs
jquery使用ColorBox弹出图片组浏览层实例演示
2013/03/14 Javascript
设置jsf的选择框h:selectOneMenu为不可编辑状态的方法
2014/01/07 Javascript
动态显示可输入的字数提示还可以输入的字数
2014/04/01 Javascript
教你如何在 Javascript 文件里使用 .Net MVC Razor 语法
2014/07/23 Javascript
javascript中解析四则运算表达式的算法和示例
2014/08/11 Javascript
javascript实现避免页面按钮重复提交
2015/01/08 Javascript
jquery ui resize 中border-box的bug修正
2015/04/26 Javascript
基于JS实现的倒计时程序实例
2015/07/24 Javascript
JS实现自动定时切换的简洁网页选项卡效果
2015/10/13 Javascript
vuejs响应用户事件(如点击事件)
2017/03/14 Javascript
AngularJS 实现购物车全选反选功能
2017/10/24 Javascript
纯js代码生成可搜索选择下拉列表的实例
2018/01/11 Javascript
vue watch关于对象内的属性监听
2019/04/22 Javascript
Flutter实现仿微信底部菜单栏功能
2019/09/18 Javascript
Jquery属性的获取/设置及样式添加/删除操作技巧分析
2019/12/23 jQuery
Vue v-for中的 input 或 select的值发生改变时触发事件操作
2020/08/31 Javascript
python实现网页链接提取的方法分享
2014/02/25 Python
python3实现在二叉树中找出和为某一值的所有路径(推荐)
2019/12/26 Python
python3 简单实现组合设计模式
2020/07/02 Python
用python实现前向分词最大匹配算法的示例代码
2020/08/06 Python
HTML5公共页面提取作为公用代码的方法
2020/06/30 HTML / CSS
法国一家芭蕾舞鞋公司:Repetto
2018/11/12 全球购物
几个判断型的面试题
2012/07/03 面试题
工程项目经理任命书
2014/06/05 职场文书
数学兴趣小组活动总结
2014/07/08 职场文书
餐厅周年庆活动方案
2014/08/25 职场文书
幼儿园小班见习报告
2014/10/31 职场文书
2015年仓库管理员工作总结
2015/04/21 职场文书
社区干部培训心得体会
2016/01/06 职场文书
JAVA SpringMVC实现自定义拦截器
2022/03/16 Python