全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

用JavaScript和jQuery实现瀑布流

大致介绍

在慕课网上学习了用原生js和jQuery实现瀑布流,在这里做个笔记

用JavaScript实现

基本结构:

<div id="main">
 <div class="box">
  <div class="pic"><img src="images/1.jpg" alt=""></div>
 </div>
 <div class="box">
  <div class="pic"><img src="images/2.jpg" alt=""></div>
 </div>
  ...
  ...
  ...
 </div>

基本样式:

*{
 margin: 0px;
 padding: 0px;
 }
 #main{
 position: relative;
 }
 .box{
 padding: 15px 0 0 15px;
 float: left;
 }
 .pic{
 padding: 10px;
 border: 1px solid #ccc;
 border-radius: 5px;
 box-shadow: 0 0 5px #ccc;
 }

思路:

1、获取#main下的所有.box

2、计算页面中图片有几列,并设置页面的宽度

3、找出这几列中高度最小的列

4、从第二行开始,设置图片为相对定位,把一张图片放到高度最小列的下面

5、更新列的高度,重复3、4、5步骤,直至图片加载完

6、根据最后一张图片的位置确定是否继续加载图片(懒加载)

实现:

1、获取#main下的所有.box

  //将main下的所有class为box的元素取出来
  var oParent = document.getElementById(parent);
  var oBox = getByClass(oParent,box);
// 根据class获取元素
 function getByClass(parent,clsname){
  var arr = [];//用来存储获取到的所有class为box的元素
  var oElement = parent.getElementsByTagName('*');
  for(var i=0;i<oElement.length;i++){
  if(oElement[i].className == clsname){
   arr.push(oElement[i]);
  }
  }
  return arr;
 }

2、计算页面中图片有几列,并设置页面的宽度

  //计算整个页面显示的列数(页面宽/box的宽)
  var oBoxW = oBox[0].offsetWidth;
  var cols = Math.floor(document.documentElement.clientWidth/oBoxW);
  //设置main的宽
  oParent.style.cssText = 'width:' + oBoxW*cols + 'px;margin:0 auto;'; 

3、找出这几列中高度最小的列

4、从第二行开始,设置图片为相对定位,把一张图片放到高度最小列的下面

5、更新列的高度,重复3、4、5步骤,直至图片加载完

//存储每列的高度
  var hArr = [];
  for(var i=0;i<oBox.length;i++){
  if(i<cols){
   //第一行图片的高度
   hArr.push(oBox[i].offsetHeight);
  }else{
   var minH = Math.min.apply(null,hArr);
   var index = getMinIndex(hArr,minH);
   oBox[i].style.position = "absolute";
   oBox[i].style.top = minH + 'px';
   //oBox[i].style.left = oBoxW*index+'px';
   oBox[i].style.left = oBox[index].offsetLeft + 'px';
   //更新每列的高度
   hArr[index] += oBox[i].offsetHeight;
  }
  }
//获取每列高度最小的索引值
 function getMinIndex(arr,value){
  for(var i in arr){
  if(arr[i] == value){
   return i;
  }
  }
 }

6、根据最后一张图片的位置确定是否继续加载图片(懒加载)

假设是后台给的数据

  //数据
  var dataInt = {'data':[{'src':'1.jpg'},{'src':'2.jpg'},{'src':'3.jpg'},{'src':'4.jpg'}]};  

当滚动条滚动时执行

  //滚动条滚动时
  window.onscroll = function(){
  scrollSlide(dataInt);
  }  

根据最后一张图片的位置,来判断是否进行加载

//判断是否具有了滚条加载数据块的条件
 function checkScrollSlide(parent,clsname){
  var oParent = document.getElementById(parent);
  var oBox = getByClass(oParent,clsname);
  var lastBoxH = oBox[oBox.length-1].offsetTop + Math.floor(oBox[oBox.length-1].offsetHeight/2);
  var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
  var height = document.documentElement.clientHeight || document.body.clientHeight;
  return (lastBoxH < scrollTop + height)? true:false;
 }

加载图片

//滚动条滚动时执行
 function scrollSlide(dataInt){
  ////判断是否具有了滚条加载数据块的条件
  if(checkScrollSlide('main','box')){
  var oParent = document.getElementById('main');
  //将数据块渲染到当前页面的尾部
  for(var i=0;i<dataInt.data.length;i++){
   var oBoxs = document.createElement('div');
   oBoxs.className = 'box';
   oParent.appendChild(oBoxs);
   var oPic = document.createElement('div');
   oPic.className = 'pic';
   oBoxs.appendChild(oPic);
   var oImg = document.createElement('img');
   oImg.src = 'images/' + dataInt.data[i].src;
   oPic.appendChild(oImg);
  }
  waterfall('main','box');
  }

用jQurey实现

用jQuery实现的思路都是一样的,就直接放代码

$(window).on('load',function(){
  waterfall();
  var dataInt={'data':[{'src':'1.jpg'},{'src':'2.jpg'},{'src':'3.jpg'},{'src':'4.jpg'}]};
  $(window).on('scroll',function(){
  scrollSlide(dataInt);
  })
 });
 function waterfall(){
  var $oBox = $('#main>div');
  var oBoxW = $oBox.eq(0).outerWidth();
  var cols = Math.floor($(window).width()/oBoxW);
  $('#main').css({
  'width' : cols * oBoxW,
  'margin' : '0 auto'
  });
  var hArr = [];
  $oBox.each(function(index,value){
  var oBoxH = $oBox.eq(index).height();
  if(index<cols){
   hArr.push(oBoxH);
  }else{
   var minH = Math.min.apply(null,hArr);
   var minHIndex = $.inArray(minH,hArr);
   $(value).css({
   'position' : 'absolute',
   'top': minH + 15,
   'left' : $oBox.eq( minHIndex ).position().left
   });
   hArr[minHIndex] += $oBox.eq(index).height() + 15;
  }
  });
 }
 function checkScrollSlide(){
  var $lastBox = $('#main>div').last();
  var lastBoxH = $lastBox.offset().top + Math.floor($lastBox.height()/2);
  var scrollTop = $(window).scrollTop();
  var clientH = $(window).height();
  return (lastBoxH < scrollTop + clientH) ? true : false;
 }
 function scrollSlide(dataInt){
  if(checkScrollSlide()){
  $.each(dataInt.data,function(index,value){
   var $Box = $('<div>').addClass('box').appendTo('#main');
   var $Pic = $('<div>').addClass('pic').appendTo($Box);
   $('<img>').attr('src','images/' + $(value).attr('src')).appendTo($Pic);
  })
  waterfall();
  }
 }

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!


# jquery实现瀑布流  # javascript瀑布流  # jquery  # 瀑布流  # Jquery瀑布流插件使用介绍  # jQuery 瀑布流 浮动布局(一)(延迟AJAX加载图片)  # jQuery瀑布流插件Wookmark使用实例  # jQuery Masonry瀑布流插件使用详解  # jQuery 瀑布流 绝对定位布局(二)(延迟AJAX加载图片)  # jQuery实现瀑布流布局  # js实现的美女瀑布流效果代码  # javascript自适应宽度的瀑布流实现思路  # 原生JS实现响应式瀑布流布局  # 解析瀑布流布局:JS+绝对定位的实现  # 纯js实现瀑布流展现照片(自动适应窗口大小)  # 加载  # 滚动条  # 判断是否  # 在这里  # 做个  # 是一样的  # 网上  # solid  # ccc  # 有几列  # shadow  # radius  # border  # relative  # position  # padding  # left  # float  # clsname  # function 


相关文章: 再谈Python中的字符串与字符编码(推荐)  天津个人网站制作公司,天津网约车驾驶员从业资格证官网?  专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?  上海网站制作开发公司,上海买房比较好的网站有哪些?  IOS倒计时设置UIButton标题title的抖动问题  浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  建站之星后台搭建步骤解析:模板选择与产品管理实操指南  C++中引用和指针有什么区别?(代码说明)  外贸公司网站制作,外贸网站建设一般有哪些步骤?  html制作网站的步骤有哪些,iapp如何添加网页?  网站设计制作公司地址,网站建设比较好的公司都有哪些?  南阳网站制作公司推荐,小学电子版试卷去哪里找资源好?  相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料?  定制建站流程步骤详解:一站式方案设计与开发指南  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  专业公司网站制作公司,用什么语言做企业网站比较好?  ,巨量百应是干嘛的?  如何在Golang中使用replace替换模块_指定本地或远程路径  代刷网站制作软件,别人代刷火车票靠谱吗?  网站制作费用多少钱,一个网站的运营,需要哪些费用?  如何在Windows虚拟主机上快速搭建网站?  建站之星后台管理如何实现高效配置?  教学网站制作软件,学习*后期制作的网站有哪些?  香港服务器网站卡顿?如何解决网络延迟与负载问题?  如何在局域网内绑定自建网站域名?  如何通过多用户协作模板快速搭建高效企业网站?  Android自定义listview布局实现上拉加载下拉刷新功能  北京专业网站制作设计师招聘,北京白云观官方网站?  如何在云服务器上快速搭建个人网站?  如何用已有域名快速搭建网站?  如何在阿里云虚拟服务器快速搭建网站?  宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?  深圳网站制作案例,网页的相关名词有哪些?  音乐网站服务器如何优化API响应速度?  网站专业制作公司有哪些,做一个公司网站要多少钱?  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  教育培训网站制作流程,请问edu教育网站的域名怎么申请?  桂林网站制作公司有哪些,桂林马拉松怎么报名?  如何在Golang中使用encoding/gob序列化对象_存储和传输数据  PHP正则匹配日期和时间(时间戳转换)的实例代码  如何在万网自助建站中设置域名及备案?  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  深入理解Android中的xmlns:tools属性  用v-html解决Vue.js渲染中html标签不被解析的问题  如何彻底卸载建站之星软件?  佛山企业网站制作公司有哪些,沟通100网上服务官网?  高防服务器租用首荐平台,企业级优惠套餐快速部署  网站制作服务平台,有什么网站可以发布本地服务信息?  如何在万网开始建站?分步指南解析 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。