详解照片瀑布流效果(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;
} 

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

(0)

相关推荐

  • js实现瀑布流的一种简单方法实例分享

    下面奉上一则用JS实现瀑布流的方法,望批评. 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><

  • js实现的美女瀑布流效果代码

    瀑布流以及回顶部的效果 *{ margin:0; padding:0; } h1{ text-align:center; height:100px; } body{ background-color:RGB(232,231,226); } .all{ margin:0 auto; width:1000px; } .number{ float:left; width:225px; } .content { margin:5px; background-color:white; } img{ mar

  • js实现仿百度瀑布流的方法

    本文实例讲述了js实现仿百度瀑布流的方法.分享给大家供大家参考.具体实现方法如下: <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>仿百度图片瀑布流</title> <link rel="stylesheet" type="text/css" href="style.css"&g

  • js实现瀑布流的三种方式比较

    瀑布流是一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部.最早采用此布局的网站是Pinterest,逐渐在国内流行开来.国内大多数清新站基本为这类风格. 瀑布流特点: 1.琳琅满目:整版以图片为主,大小不一的图片按照一定的规律排列. 2.唯美:图片的风格以唯美的图片为主. 3.操作简单:在浏览网站的时候只需要轻轻滑动一下鼠标滚轮,一切的美妙的图片精彩便可呈现在你面前. 瀑布流布局实现方式: 1.传统多列浮动 · 各列固定宽度,并且

  • 原生JavaScript+LESS实现瀑布流

    HTML(注意包裹关系,方便js调用) 复制代码 代码如下: <body>      <div id="main">          <div class="box">              <div class="pic">                  <img src="images/0.jpg" alt="">          

  • javascript实现瀑布流加载图片原理

    讲一下大概的原理吧,还是先上图:  功能描述: 根据不同菜单的属性值分别加载不同的数据 下拉滚动条到一定位置预加载图片,滚动条拉到最底下的时候渲染html: 鼠标移到菜单,切换各个图片列表: 鼠标移到图片列表上,显示详细信息:  技术实现方案: 先梳理一下从加载到显示的流程: 1. 加载数据 2. 拼接HTML写入到页面 3. 检查刚刚写入的HTML中的img是否全部加载完成,如果是,进入5.否则进入4 4. 等待图片加载完成 5. 计算每个元素的位置 一开始的时候最头疼的是如何定位的问题,后来

  • 原生JS实现响应式瀑布流布局

    原生JS实现的瀑布流布局,代码及demo代码地址:https://github.com/leozdgao/responsive_waterfall Demo:http://leozdgao.github.io/demo/responsive_waterfall/ 演示图: 核心代码: responsive_waterfall.js (function() { var Waterfall = function(opts) { var minBoxWidth; Object.defineProper

  • avalonjs制作响应式瀑布流特效

    布局不是基于float,也不是基于绝对定位,看最下面的html,css就知道了.也没有满篇烦人的html插入,代码很清爽 function getIndex(index) { if (index < 10) { index = "00" + index; } else if (index < 100) { index = "0" + index; } return index; } var $ = function(id) { return docume

  • 纯js实现瀑布流布局及ajax动态新增数据

    本文用纯js代码手写一个瀑布流网页效果,初步实现一个基本的瀑布流布局,以及滚动到底部后模拟ajax数据加载新图片功能. 缺点: 1. 程序不是响应式,不能实时调整页面宽度: 2. 程序中当新增ajax模拟数据图片后,是将整个页面的所有图片都重新定位一次. 3. 程序是等所有图片加载完成后再读取图片的尺寸,实际中肯定不能这样做. 4. 实际项目中,应该由后台程序给出图片尺寸值,在js代码中直接使用图片的width属性. 本程序思路: html结构: <body> <div id="

  • 解析javascript瀑布流原理实现图片滚动加载

    先科普下瀑布流吧 瀑布流,又称瀑布流式布局.是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部.最早采用此布局的网站是Pinterest,逐渐在国内流行开来.国内大多数清新站基本为这类风格,像美丽说.淘宝网都有使用. 这是我实现的一个效果,就是怎么滚动都加载不玩.就跟瀑布一样流啊流! 这里的实现方式我们只说Js实现方法 实现原理: 对容器中已有数据块元素进行第一次计算1 容器总宽度 2 列宽度  3 最小列数 ,得到列数

  • 纯js实现瀑布流展现照片(自动适应窗口大小)

    用瀑布流来展现照片再好不过了,下面是瀑布流(每一行的长度等于浏览器窗口的长度)的一种实现方式,也可以用css3实现,很简单,谷歌一下你就知道. 我的思路大概是一张一张的图片插入,当这一行的图片保持长宽比例不变并且高度低于250时就完成一个了循环,即这一行插入进去了. 然后进入下一个循环插入下一行.公式很简单,假设这一行当前的高度为h,则插入一张高和宽为(x,y)的图片时,满足下列关系: h' * (w / h + y / x) = w w是浏览器窗口的宽度, 则 h' = w / (w / h

  • javascript实现瀑布流自适应遇到的问题及解决方案

    这几天看了Amy老师的用javascript实现瀑布流,我跟着把代码敲出来.发现这样写只能第一次载入时适应屏幕,以后改变窗口大小就不能做到自适应了. 于是我想到了用window.onresize来使得瀑布流函数从新加载来达到目的, 复制代码 代码如下: window.onload=function(){     //瀑布流函数     waterfall('content','box');     //模拟数据加载     var dataInt = {"data":[{"s

随机推荐