百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>JS教程> js,jquery分别实现照片瀑布流效果与知识点总结
分享文章到:

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

发布时间:01/15 来源: 浏览: 关键词:
这篇文章介绍了js,jquery分别实现照片瀑布流效果与知识点总结,实现后效果很好,有兴趣的同学可以看看

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

 
 代码如下
<!DOCTYPE html>
<html>
<head>
<metahttp-equiv="Content-Type"content="text/html; charset=UTF-8"/>
<scripttype="text/javascript"src="jquery-1.8.3.min.js"/></script>
<scripttype="text/javascript"src="script2.js"/></script>
<title></title>
<styletype="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>
<divid="main">
 <divclass="pin">
  <divclass="box">
   <imgsrc="images/1.jpg"/>
  </div>
 </div>
 <divclass="pin">
  <divclass="box">
   <imgsrc="images/2.jpg"/>
  </div>
 </div>
 <divclass="pin">
  <divclass="box">
   <imgsrc="images/3.jpg"/>
  </div>
 </div>
 <divclass="pin">
  <divclass="box">
   <imgsrc="images/4.jpg"/>
  </div>
 </div>
 <divclass="pin">
  <divclass="box">
   <imgsrc="images/5.jpg"/>
  </div>
 </div>
 <divclass="pin">
  <divclass="box">
   <imgsrc="images/6.jpg"/>
  </div>
 </div>
 <divclass="pin">
  <divclass="box">
   <imgsrc="images/7.jpg"/>
  </div>
 </div>
 <divclass="pin">
  <divclass="box">
   <imgsrc="images/8.jpg"/>
  </div>
 </div>
 <divclass="pin">
  <divclass="box">
   <imgsrc="images/9.jpg"/>
  </div>
 </div>
 <divclass="pin">
  <divclass="box">
   <imgsrc="images/1.jpg"/>
  </div>
 </div>
 <divclass="pin">
  <divclass="box">
   <imgsrc="images/2.jpg"/>
  </div>
 </div>
 <divclass="pin">
  <divclass="box">
   <imgsrc="images/3.jpg"/>
  </div>
 </div>
 <divclass="pin">
  <divclass="box">
   <imgsrc="images/4.jpg"/>
  </div>
 </div>
 <divclass="pin">
  <divclass="box">
   <imgsrc="images/5.jpg"/>
  </div>
 </div>
 <divclass="pin">
  <divclass="box">
   <imgsrc="images/6.jpg"/>
  </div>
 </div>
 <divclass="pin">
  <divclass="box">
   <imgsrc="images/7.jpg"/>
  </div>
 </div>
 <divclass="pin">
  <divclass="box">
   <imgsrc="images/8.jpg"/>
  </div>
 </div>
 <divclass="pin">
  <divclass="box">
   <imgsrc="images/9.jpg"/>
  </div>
 </div>
 <divclass="pin">
  <divclass="box">
   <imgsrc="images/1.jpg"/>
  </div>
 </div>
 <divclass="pin">
  <divclass="box">
   <imgsrc="images/2.jpg"/>
  </div>
 </div>
 <divclass="pin">
  <divclass="box">
   <imgsrc="images/3.jpg"/>
  </div>
 </div>
</div>
</body>
</html>
 

用js实现部分:

 
 代码如下
window.onload=function(){
   
 waterfall('main','box');
  vardataimg={'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())
   {
    varmain= document.getElementById('main');
    for(vari=0;i<dataimg.data.length;i++)
    {
     varpin=document.createElement('div');
     pin.className='pin';    
     main.appendChild(pin);   
     varbox=document.createElement('div');
     box.className='box';
     pin.appendChild(box);
     varimg=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,会每一次循环都遍历一次
  varnodes=(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;
    }
   }
  }
  returneles;
 }
}
//知识点一:js中通过属性offset--等,但padding,margin等只能获取在内联html中有的样式,
//因此,下面这个函数是获取css样式的通用函数。
vargetStyle =function(dom, attr)
{
 returndom.currentStyle ? dom.currentStyle[attr] : getComputedStyle(dom,false)[attr];
}
 functionwaterfall(parent,box){
  varmain=document.getElementById(parent);
  varboxes=$$(box,main);
   varpins=$$('pin',main);
  //console.log(boxes.length);
   varpinw=pins[0];
  varboxw=boxes[0].offsetWidth+parseInt(getStyle(pinw,'paddingLeft'));
  console.log(boxes[0].clientWidth);
  //console.log(boxw+','+main.clientWidth+','+main.offsetWidth+','+getStyle(boxes[0],'margin'));
  varcols=Math.floor(document.documentElement.clientWidth/boxw);
   console.log(cols);
  main.style.width=cols*boxw+'px';
  varboxesh=[];
  for(vari=0;i<boxes.length;i++){
   if(i<cols){
    boxesh.push(boxes[i].offsetHeight+parseInt(getStyle(pinw,'paddingBottom')));
   }
   else{
    varminh=Math.min.apply(null,boxesh);
    varindex=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'));
   }
  }
 }
  
 functiongetMinIndex(arr,val){
  for(vari=0;i<arr.length;i++){
   if(arr[i]==val)
    returni;
  }
 }
  
 functioncheckscrollside(){
 varmain=document.getElementById('main');
 varaPin=$$('pin',main);
 console.log(aPin.length);
 varlastPinH=aPin[aPin.length-1].offsetTop+Math.floor(aPin[aPin.length-1].offsetHeight/2);
 varscrollTop=document.documentElement.scrollTop||document.body.scrollTop;
 vardocumentH=document.documentElement.clientHeight;//页面高度
 return(lastPinH<scrollTop+documentH)?true:false;
}
 

用jQuery实现部分:

 
 代码如下
//知识点一:jquery事件绑定
$(window).on('load',function(){
 waterfall();
 vardataimg={'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对象的方法);
    varoBox=$('<div>').addClass('pin').appendTo($('#main'));
    varoPic=$('<div>').addClass('box').appendTo($(oBox));
    $('<img>').attr('src','images/'+value.src).appendTo($(oPic));
   })
   waterfall();
  }
 })
})
  
functionwaterfall(){
 var$boxs=$('#main>.pin');
 //知识点八:jquery中的outerWidth(false)方法==js中的offsetWidth属性
 //innerWidth()==clientWidth;
 //width()==width;
 varw=$boxs.eq(0).outerWidth(false);
 //console.log(w);
 varcols=Math.floor($(window).width()/w);
 //知识点九:jquery可以直接css(),js是obj,style.margin: ect;
 $('#main').width(cols*w).css('margin','10px auto');
 varhArr=[];
 //注意,这儿value是DOM对象
 $boxs.each(function(index,value){
  varh=$boxs.eq(index).outerHeight(false);
  if(index<cols){
   hArr.push(h);
  }else{
   varminH=Math.min.apply(null,hArr);
   //知识点十:jquey中直接封装了一个数组中找取某个值对应下标的方法
   varminHIndex=$.inArray(minH,hArr);
   $(value).css({
    'position':'absolute',
    'top':minH+'px',
    'left':minHIndex*w+'px',
   });
   hArr[minHIndex]+=$boxs.eq(index).outerHeight(false);
  }
 })
 //console.log(hArr);
}
  
functioncheckScrollSlide(){
 //知识点十一:可以直接last()方法获取最后一个元素
 var$lastBox=$('#main>div').last();
 //知识点十二:js中的一系列offsetTop等属性,变成了jquey中的offset().top ect;
 varlastBoxDis=$lastBox.offset().top+Math.floor($lastBox.outerHeight(false)/2);
 varscrollTop=$(window).scrollTop();
 vardocumentH=$(window).height();
 return(lastBoxDis<scrollTop+documentH)?true:false;
}

 

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有2人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板