全网整合营销服务商

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

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

详解照片瀑布流效果(js,jquery分别实现与知识点总结)

看了网上的瀑布流教程,自己跟着写了遍,然后总结了下知识点

<!DOCTYPE html> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<script type="text/javascript" src="jquery-1.8.3.min.js"/></script> 
<script type="text/javascript" src="script2.js"/></script> 
<title></title> 
<style type="text/css"> 
 *{padding: 0;margin:0;} 
 #main{ 
  margin-top: 10px; 
  position: relative; 
 
 } 
 .pin{ 
  margin:0; 
  padding:0 0 5px 3px; 
  float:left; 
 } 
 .box{ 
  padding: 10px 5px 0 5px; 
  border:1px solid #ccc; 
  box-shadow: 0 0 6px #ccc; 
  border-radius: 5px; 
 } 
 .box img{ 
  border:0; 
  margin:0; 
  width:200px; 
  height:auto; 
 } 
</style> 
</head> 
<body> 
<div id="main"> 
 <div class="pin"> 
  <div class="box"> 
   <img src="images/1.jpg"/> 
  </div> 
 </div> 
 <div class="pin"> 
  <div class="box"> 
   <img src="images/2.jpg"/> 
  </div> 
 </div> 
 <div class="pin"> 
  <div class="box"> 
   <img src="images/3.jpg"/> 
  </div> 
 </div> 
 <div class="pin"> 
  <div class="box"> 
   <img src="images/4.jpg"/> 
  </div> 
 </div> 
 <div class="pin"> 
  <div class="box"> 
   <img src="images/5.jpg"/> 
  </div> 
 </div> 
 <div class="pin"> 
  <div class="box"> 
   <img src="images/6.jpg"/> 
  </div> 
 </div> 
 <div class="pin"> 
  <div class="box"> 
   <img src="images/7.jpg"/> 
  </div> 
 </div> 
 <div class="pin"> 
  <div class="box"> 
   <img src="images/8.jpg"/> 
  </div> 
 </div> 
 <div class="pin"> 
  <div class="box"> 
   <img src="images/9.jpg"/> 
  </div> 
 </div> 
 <div class="pin"> 
  <div class="box"> 
   <img src="images/1.jpg"/> 
  </div> 
 </div> 
 <div class="pin"> 
  <div class="box"> 
   <img src="images/2.jpg"/> 
  </div> 
 </div> 
 <div class="pin"> 
  <div class="box"> 
   <img src="images/3.jpg"/> 
  </div> 
 </div> 
 <div class="pin"> 
  <div class="box"> 
   <img src="images/4.jpg"/> 
  </div> 
 </div> 
 <div class="pin"> 
  <div class="box"> 
   <img src="images/5.jpg"/> 
  </div> 
 </div> 
 <div class="pin"> 
  <div class="box"> 
   <img src="images/6.jpg"/> 
  </div> 
 </div> 
 <div class="pin"> 
  <div class="box"> 
   <img src="images/7.jpg"/> 
  </div> 
 </div> 
 <div class="pin"> 
  <div class="box"> 
   <img src="images/8.jpg"/> 
  </div> 
 </div> 
 <div class="pin"> 
  <div class="box"> 
   <img src="images/9.jpg"/> 
  </div> 
 </div> 
 <div class="pin"> 
  <div class="box"> 
   <img src="images/1.jpg"/> 
  </div> 
 </div> 
 <div class="pin"> 
  <div class="box"> 
   <img src="images/2.jpg"/> 
  </div> 
 </div> 
 <div class="pin"> 
  <div class="box"> 
   <img src="images/3.jpg"/> 
  </div> 
 </div> 
</div> 
</body> 
</html> 

用js实现部分:

window.onload=function(){ 
  
 waterfall('main','box'); 
  var dataimg={'data':[{'src':'1.jpg'},{'src':'2.jpg'},{'src':'3.jpg'},{'src':'4.jpg'},{'src':'5.jpg'},{'src':'6.jpg'},{'src':'7.jpg'},{'src':'8.jpg'},{'src':'9.jpg'}]}; 
  
  window.onscroll=function() 
  { 
   if(checkscrollside()) 
   { 
    var main= document.getElementById('main'); 
    for(var i=0;i<dataimg.data.length;i++) 
    { 
     var pin=document.createElement('div'); 
     pin.className='pin';     
     main.appendChild(pin);    
     var box=document.createElement('div'); 
     box.className='box'; 
     pin.appendChild(box); 
     var img=document.createElement('img'); 
     img.src='images/'+dataimg.data[i].src; 
     box.appendChild(img); 
    } 
    waterfall('main','box'); 
   }; 
  } 
}   
 
function $$(clsName,ele) 
{ 
 //如果当前浏览器支持通过类名获取元素,直接返回 
 if(document.getElementsByClassName) 
 { 
  return(ele||document).getElementsByClassName(clsName); 
 } 
 else 
 { 
  //尽量把这些量存放在变量中,否则 
  //例如循环不用len,而用nodes.length,会每一次循环都遍历一次 
  var nodes=(ele||document).getElementsByTagName("*"), 
  eles=[], 
  len=nodes.length 
  i, 
  j, 
  currNode, 
  clsNames, 
  clsLen; 
  for(i=0;i<len;i++) 
  { 
   currNode=nodes[i]; 
   clsNames=currNode.className.split(' '); 
   clsLen=clsNames.length; 
   for(j=0;j<clsLen;j++) 
   { 
    if(clsNames[j]==clsName) 
    { 
  eles.push(currNode); 
      break; 
    } 
   } 
  } 
  return eles; 
 } 
} 
//知识点一:js中通过属性offset--等,但padding,margin等只能获取在内联html中有的样式, 
//因此,下面这个函数是获取css样式的通用函数。 
var getStyle = function(dom, attr) 
{ 
 return dom.currentStyle ? dom.currentStyle[attr] : getComputedStyle(dom, false)[attr]; 
} 
 function waterfall(parent,box){ 
  var main=document.getElementById(parent); 
  var boxes=$$(box,main); 
   var pins=$$('pin',main); 
  //console.log(boxes.length); 
   var pinw=pins[0]; 
  var boxw=boxes[0].offsetWidth+parseInt(getStyle(pinw,'paddingLeft')); 
  console.log(boxes[0].clientWidth); 
  //console.log(boxw+','+main.clientWidth+','+main.offsetWidth+','+getStyle(boxes[0],'margin')); 
  var cols=Math.floor(document.documentElement.clientWidth/boxw); 
   console.log(cols); 
  main.style.width=cols*boxw+'px'; 
  var boxesh=[]; 
  for(var i=0;i<boxes.length;i++){ 
   if(i<cols){ 
    boxesh.push(boxes[i].offsetHeight+parseInt(getStyle(pinw,'paddingBottom'))); 
   } 
   else{ 
    var minh=Math.min.apply(null,boxesh); 
    var index=getMinIndex(boxesh,minh); 
    boxes[i].style.position='absolute'; 
    boxes[i].style.top=minh+'px'; 
    boxes[i].style.left=index*boxw+'px'; 
    boxesh[index]+=boxes[i].offsetHeight+parseInt(getStyle(pinw,'paddingLeft')); 
   } 
  } 
 } 
 
 function getMinIndex(arr,val){ 
  for(var i=0;i<arr.length;i++){ 
   if(arr[i]==val) 
    return i; 
  } 
 } 
 
 function checkscrollside(){ 
 var main=document.getElementById('main'); 
 var aPin=$$('pin',main); 
 console.log(aPin.length); 
 var lastPinH=aPin[aPin.length-1].offsetTop+Math.floor(aPin[aPin.length-1].offsetHeight/2); 
 var scrollTop=document.documentElement.scrollTop||document.body.scrollTop; 
 var documentH=document.documentElement.clientHeight;//页面高度 
 return (lastPinH<scrollTop+documentH)?true:false; 
} 

用jQuery实现部分:

//知识点一:jquery事件绑定 
$(window).on('load',function(){ 
 waterfall(); 
 var dataimg={'data':[{'src':'1.jpg'},{'src':'2.jpg'},{'src':'3.jpg'},{'src':'4.jpg'},{'src':'5.jpg'},{'src':'6.jpg'},{'src':'7.jpg'},{'src':'8.jpg'},{'src':'9.jpg'}]}; 
 $(window).on('scroll',function(){ 
  if(checkScrollSlide()){ 
   //知识点二:数组遍历 
   //知识点三:value参数是DOM对象 
   $.each(dataimg.data,function(key,value){ 
    //知识点四:创建DOM元素,不需要createElement('div'); 
    //知识点五:为元素绑定class,不再是className=''; 
    //知识点六:往元素中填充元素,不再是obj.appendChild(obj); 
    //知识点七:属性的获取和设置,可以直接用attr (注意这是针对jquey对象的方法); 
    var oBox=$('<div>').addClass('pin').appendTo($('#main')); 
    var oPic=$('<div>').addClass('box').appendTo($(oBox)); 
    $('<img>').attr('src','images/'+value.src).appendTo($(oPic)); 
   }) 
   waterfall(); 
  } 
 }) 
}) 
 
function waterfall(){ 
 var $boxs=$('#main>.pin'); 
 //知识点八:jquery中的outerWidth(false)方法==js中的offsetWidth属性 
 //innerWidth()==clientWidth; 
 //width()==width; 
 var w=$boxs.eq(0).outerWidth(false); 
 //console.log(w); 
 var cols=Math.floor($(window).width()/w); 
 //知识点九:jquery可以直接css(),js是obj,style.margin: ect; 
 $('#main').width(cols*w).css('margin','10px auto'); 
 var hArr=[]; 
 //注意,这儿value是DOM对象 
 $boxs.each(function(index,value){ 
  var h=$boxs.eq(index).outerHeight(false); 
  if(index<cols){ 
   hArr.push(h); 
  }else{ 
   var minH=Math.min.apply(null,hArr); 
   //知识点十:jquey中直接封装了一个数组中找取某个值对应下标的方法 
   var minHIndex=$.inArray(minH,hArr); 
   $(value).css({ 
    'position':'absolute', 
    'top':minH+'px', 
    'left':minHIndex*w+'px', 
   }); 
   hArr[minHIndex]+=$boxs.eq(index).outerHeight(false); 
  } 
 }) 
 //console.log(hArr); 
} 
 
function checkScrollSlide(){ 
 //知识点十一:可以直接last()方法获取最后一个元素 
 var $lastBox=$('#main>div').last(); 
 //知识点十二:js中的一系列offsetTop等属性,变成了jquey中的offset().top ect; 
 var lastBoxDis=$lastBox.offset().top+Math.floor($lastBox.outerHeight(false)/2); 
 var scrollTop=$(window).scrollTop(); 
 var documentH=$(window).height(); 
 return (lastBoxDis<scrollTop+documentH)?true:false; 
} 

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


# js瀑布流效果  # 照片瀑布流  # jquery瀑布流照片墙  # nodejs中的异步编程知识点详解  # JS内置对象和Math对象知识点详解  # VsCode与Node.js知识点详解  # nodejs连接mysql数据库及基本知识点详解  # JavaScript知识点总结(十六)之Javascript闭包(Closure)代码详解  # JavaScript知识点总结(十一)之js中的Object类详解  # JavaScript知识点总结(四)之逻辑OR运算符详解  # javascript知识点详解  # 可以直接  # 遍历  # 绑定  # 这是  # 放在  # 看了  # 不需要  # 写了  # 装了  # 大家多多  # 而用  # 中找  # 变成了  # 网上  # 总结了  # height  # body  # width  # images  # id 


相关文章: 如何快速建站并高效导出源代码?  制作网站外包平台,自动化接单网站有哪些?  北京网站制作网页,网站升级改版需要多久?  如何快速重置建站主机并恢复默认配置?  如何做静态网页,sublimetext3.0制作静态网页?  电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  大连网站制作公司哪家好一点,大连买房网站哪个好?  如何通过建站之星自助学习解决操作问题?  潍坊网站制作公司有哪些,潍坊哪家招聘网站好?  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  大连 网站制作,大连天途有线官网?  如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本  如何在IIS7中新建站点?详细步骤解析  宝塔建站助手安装配置与建站模板使用全流程解析  北京建设网站制作公司,北京古代建筑博物馆预约官网?  建站DNS解析失败?如何正确配置域名服务器?  SQL查询语句优化的实用方法总结  高端建站三要素:定制模板、企业官网与响应式设计优化  如何解决VPS建站LNMP环境配置常见问题?  Android自定义控件实现温度旋转按钮效果  如何快速上传自定义模板至建站之星?  建站之星代理商如何保障技术支持与售后服务?  Android使用GridView实现日历的简单功能  建站主机服务器选购指南:轻量应用与VPS配置解析  无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍?  中山网站推广排名,中山信息港登录入口?  如何快速登录WAP自助建站平台?  已有域名如何快速搭建专属网站?  如何选择网络建站服务器?高效建站必看指南  如何通过万网虚拟主机快速搭建网站?  网站图片在线制作软件,怎么在图片上做链接?  建站主机默认首页配置指南:核心功能与访问路径优化  ,柠檬视频怎样兑换vip?  免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?  如何在Windows虚拟主机上快速搭建网站?  GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?  如何在IIS管理器中快速创建并配置网站?  高性能网站服务器部署指南:稳定运行与安全配置优化方案  javascript中对象的定义、使用以及对象和原型链操作小结  如何自定义建站之星网站的导航菜单样式?  如何快速启动建站代理加盟业务?  如何高效利用200m空间完成建站?  如何在宝塔面板中修改默认建站目录?  如何在局域网内绑定自建网站域名?  建站之星北京办公室:智能建站系统与小程序生成方案解析  如何用景安虚拟主机手机版绑定域名建站?  建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析  如何撰写建站申请书?关键要点有哪些?  一键制作网站软件下载安装,一键自动采集网页文档制作步骤? 

您的项目需求

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