Rumah hujung hadapan web tutorial js 深入学习js瀑布流布局

深入学习js瀑布流布局

Jan 03, 2017 am 10:36 AM

本文实例为大家分享了js瀑布流布局学习资料,供大家参考,具体内容如下

特点:等宽不等高。
实现方式:Javascript/Jquery/CSS3多栏布局。
样例网站:花瓣网-->分类

一、JS实现瀑布流

index.html:页面结构    

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>瀑布流布局</title>
  <link rel="stylesheet" href="styles/layout.css">
</head>
<body>
  <div id="main">
    <div><div><img src="../waterFall/pic/0.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/1.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/2.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/3.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/4.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/5.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/6.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/7.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/8.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/9.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/10.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/11.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/12.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/13.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/14.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/15.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/16.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/17.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/18.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/19.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/20.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/21.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/22.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/23.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/24.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/25.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/26.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/27.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/28.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/29.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/30.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/31.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/32.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/33.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/34.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/35.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/36.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/37.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/38.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/39.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/40.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/41.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/42.jpg" alt=""></div></div>
    <div><div><img src="../waterFall/pic/43.jpg" alt=""></div></div>
  </div>
  <script src="scripts/waterfall.js"></script>
</body>
</html>
Salin selepas log masuk

layout.css:页面元素样式

*{
  pdding:0;
  margin:0;
}
div#main{
  position: relative;
}
div.box{
  padding:15px 0 0 15px;
  float: left;
}
div.pic{
  padding:10px;
  border:1px solid #ccc;
  border-radius:5px;
  box-shadow: 0 0 5px #ccc;
}
.pic img{
  height:auto;
  width:165px;
}
Salin selepas log masuk

waterfall.js

window.onload=function(){
  waterFall(&#39;main&#39;,&#39;box&#39;);
  //模拟后台相应数据json
  var dataInt={
    "data":
    [
     {"src":"0.jpg"},
     {"src":"1.jpg"},
     {"src":"2.jpg"},
     {"src":"3.jpg"},
     {"src":"4.jpg"},
     {"src":"5.jpg"},
     {"src":"6.jpg"}
    ]
  }
  window.onscroll=function(){
    if(checkScrollSlide){
      //将数据块渲染到当前页面的尾部
     var oParent=document.getElementById("main");
     for(var i=0;i<dataInt.data.length;i++){
       var oBox=document.createElement("div");
       oBox.className="box";
       oParent.appendChild(oBox);
       var oPic=document.createElement("div");
       oPic.className="pic";
       oBox.appendChild(oPic);
       var img=document.createElement("img");
       img.setAttribute("src",dataInt.data[i]);
       img.src="pic/"+dataInt.data[i].src;
       oPic.appendChild(img);
     }
     dataInt=null;//清空数据块,防止无限加载
     waterFall(&#39;main&#39;,&#39;box&#39;);//对页面新元素进行布局渲染
    }
  }
}
function waterFall(parent,box){
  //将main下的class为box的所有元素取出来
  var oParent=document.getElementById(parent);
  var oBoxs=getByClass(oParent,box);
  console.log(oBoxs.length);
  //计算整个页面显示的列数(页面宽/box宽)
  var oBoxW=oBoxs[0].offsetWidth;
  // console.log(oBoxW);
  var cols=Math.floor(document.documentElement.clientWidth/oBoxW);
  // console.log(cols);
  //设置main的宽
  oParent.style.cssText="width:"+oBoxW*cols+"px;margin:0 auto;"
  var hArr=[];//存放每列高度的数组
  for(var i=0;i<oBoxs.length;i++){
    if(i<cols){
      hArr.push(oBoxs[i].offsetHeight);
    }else{
      var minH=Math.min.apply(null,hArr);//获取当前数组最小高度值
      // console.log(minH);
      var index=getMinhIndex(hArr,minH);//获取数组最小高度的索引
      //console.log(index);
      oBoxs[i].style.position="absolute";//将之后的图片依次绝对定位
      oBoxs[i].style.top=minH+"px";
      oBoxs[i].style.left=index*oBoxW+"px";//计算新图片所在的位置并赋值
      hArr[index]+=oBoxs[i].offsetHeight;//变化数组列的高度值,因为加上了一张图片
    }
    //console.log(hArr);
  }
 
}
//根据class获取元素
function getByClass(parent,clsName){
  var boxArr=new Array(),//用来存储获取到的所有class为box的元素
    oElements=parent.getElementsByTagName("*");
    for(var i=0;i<oElements.length;i++){
      if(oElements[i].className==clsName){
        boxArr.push(oElements[i]);
      }
    }
  return boxArr;
}
function getMinhIndex(arr,val){
  for(var i=0;i<arr.length;i++){
    if(arr[i]==val){
      return i;
    }
  }
 
}
//检测是否具备滚动条加载数据块条件
function checkScrollSlide(){
  var oParent=document.getElementById("main");
  var oBoxs=getByClass(oParent,"box");
  var lastBoxH=oBoxs[oBoxs.length-1].offsetTop+Math.floor(oBoxs[oBoxs.length-1].offsetHeight/2);
  var scrollTop=document.body.scrollTop||document.documentElement.scrollTop;//混杂模式和标准模式下的scrollTop获取
  //console.log(scrollTop);
  var height=document.body.clientHeight||document.documentElement.clientHeight;//混杂模式和标准模式下的浏览器窗口高度获取
  return (lastBoxH<scrollTop+height)?true:false;//检测最后一个box高度是否小于滚动高度+窗口高度,返回布尔值
 
}
Salin selepas log masuk

二、JQuery

$( window ).on( "load", function(){
  waterfall(&#39;main&#39;,&#39;pin&#39;);
  var dataInt={&#39;data&#39;:[{&#39;src&#39;:&#39;1.jpg&#39;},{&#39;src&#39;:&#39;2.jpg&#39;},{&#39;src&#39;:&#39;3.jpg&#39;},{&#39;src&#39;:&#39;4.jpg&#39;}]};
  window.onscroll=function(){
    if(checkscrollside()){
      $.each( dataInt.data, function( index, value ){
        var $oPin = $(&#39;<div>&#39;).addClass(&#39;pin&#39;).appendTo( $( "#main" ) );
        var $oBox = $(&#39;<div>&#39;).addClass(&#39;box&#39;).appendTo( $oPin );
        $(&#39;<img>&#39;).attr(&#39;src&#39;,&#39;./images/&#39; + $( value).attr( &#39;src&#39;) ).appendTo($oBox);
      });
      waterfall();
    };
  }
});
 
/*
  parend 父级id
  pin 元素id
*/
function waterfall(parent,pin){
  var $aPin = $( "#main>div" );
  var iPinW = $aPin.eq( 0 ).width();// 一个块框pin的宽
  var num = Math.floor( $( window ).width() / iPinW );//每行中能容纳的pin个数【窗口宽度除以一个块框宽度】
  //oParent.style.cssText=&#39;width:&#39;+iPinW*num+&#39;px;ma rgin:0 auto;&#39;;//设置父级居中样式:定宽+自动水平外边距
  $( "#main" ).css({
    &#39;width:&#39; : iPinW * num,
    &#39;margin&#39;: &#39;0 auto&#39;
  });
 
  var pinHArr=[];//用于存储 每列中的所有块框相加的高度。
 
  $aPin.each( function( index, value ){
    var pinH = $aPin.eq( index ).height();
    if( index < num ){
      pinHArr[ index ] = pinH; //第一行中的num个块框pin 先添加进数组pinHArr
    }else{
      var minH = Math.min.apply( null, pinHArr );//数组pinHArr中的最小值minH
      var minHIndex = $.inArray( minH, pinHArr );
      $( value ).css({
        &#39;position&#39;: &#39;absolute&#39;,
        &#39;top&#39;: minH + 15,
        &#39;left&#39;: $aPin.eq( minHIndex ).position().left
      });
      //数组 最小高元素的高 + 添加上的aPin[i]块框高
      pinHArr[ minHIndex ] += $aPin.eq( index ).height() + 15;//更新添加了块框后的列高
    }
  });
}
 
function checkscrollside(){
  var $aPin = $( "#main>div" );
  var lastPinH = $aPin.last().get(0).offsetTop + Math.floor($aPin.last().height()/2);//创建【触发添加块框函数waterfall()】的高度:最后一个块框的距离网页顶部+自身高的一半(实现未滚到底就开始加载)
  var scrollTop = $( window ).scrollTop()//注意解决兼容性
  var documentH = $( document ).height();//页面高度
  return (lastPinH < scrollTop + documentH ) ? true : false;//到达指定高度后 返回true,触发waterfall()函数
}
Salin selepas log masuk

三、CSS多栏布局

.container{
  -webkit-column-width:160px;
  -moz-column-width:160px; 
   -webkit-column-gap:5px;
   -moz-column-gap:5px;
}
 
 
/*数据块 砖块*/
 
.container div{width:160px;
        margin:4px 0;}
Salin selepas log masuk

【css3和js实现方法比较】
--css3方式--
1:不需要计算,浏览器自动计算,只需设置1列宽,性能高
2:列宽随着浏览器宽口大小进行改变,用户体验不好;
3:图片排序按照垂直顺序排列,打乱图片显示顺序
4.图片加载还是需要js
--js方式--
js实现的瀑布流不会有上面的缺点,但是性能相对要差!

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

更多深入学习js瀑布流布局相关文章请关注PHP中文网!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Akan R.E.P.O. Ada Crossplay?
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimana saya membuat dan menerbitkan perpustakaan JavaScript saya sendiri? Bagaimana saya membuat dan menerbitkan perpustakaan JavaScript saya sendiri? Mar 18, 2025 pm 03:12 PM

Artikel membincangkan membuat, menerbitkan, dan mengekalkan perpustakaan JavaScript, memberi tumpuan kepada perancangan, pembangunan, ujian, dokumentasi, dan strategi promosi.

Bagaimanakah saya mengoptimumkan kod JavaScript untuk prestasi dalam penyemak imbas? Bagaimanakah saya mengoptimumkan kod JavaScript untuk prestasi dalam penyemak imbas? Mar 18, 2025 pm 03:14 PM

Artikel ini membincangkan strategi untuk mengoptimumkan prestasi JavaScript dalam pelayar, memberi tumpuan kepada mengurangkan masa pelaksanaan dan meminimumkan kesan pada kelajuan beban halaman.

Apa yang perlu saya lakukan jika saya menghadapi percetakan kod yang dihiasi untuk resit kertas terma depan? Apa yang perlu saya lakukan jika saya menghadapi percetakan kod yang dihiasi untuk resit kertas terma depan? Apr 04, 2025 pm 02:42 PM

Soalan dan penyelesaian yang sering ditanya untuk percetakan tiket kertas terma depan dalam pembangunan front-end, percetakan tiket adalah keperluan umum. Walau bagaimanapun, banyak pemaju sedang melaksanakan ...

Bagaimanakah saya boleh debug kod javascript dengan berkesan menggunakan alat pemaju pelayar? Bagaimanakah saya boleh debug kod javascript dengan berkesan menggunakan alat pemaju pelayar? Mar 18, 2025 pm 03:16 PM

Artikel ini membincangkan debugging JavaScript yang berkesan menggunakan alat pemaju pelayar, memberi tumpuan kepada menetapkan titik putus, menggunakan konsol, dan menganalisis prestasi.

Siapa yang dibayar lebih banyak Python atau JavaScript? Siapa yang dibayar lebih banyak Python atau JavaScript? Apr 04, 2025 am 12:09 AM

Tidak ada gaji mutlak untuk pemaju Python dan JavaScript, bergantung kepada kemahiran dan keperluan industri. 1. Python boleh dibayar lebih banyak dalam sains data dan pembelajaran mesin. 2. JavaScript mempunyai permintaan yang besar dalam perkembangan depan dan stack penuh, dan gajinya juga cukup besar. 3. Faktor mempengaruhi termasuk pengalaman, lokasi geografi, saiz syarikat dan kemahiran khusus.

Bagaimanakah saya menggunakan peta sumber untuk debug kod JavaScript minified? Bagaimanakah saya menggunakan peta sumber untuk debug kod JavaScript minified? Mar 18, 2025 pm 03:17 PM

Artikel ini menerangkan cara menggunakan peta sumber untuk debug JavaScript minifikasi dengan memetakannya kembali ke kod asal. Ia membincangkan membolehkan peta sumber, menetapkan titik putus, dan menggunakan alat seperti Chrome Devtools dan Webpack.

Bagaimana untuk menggabungkan elemen array dengan ID yang sama ke dalam satu objek menggunakan JavaScript? Bagaimana untuk menggabungkan elemen array dengan ID yang sama ke dalam satu objek menggunakan JavaScript? Apr 04, 2025 pm 05:09 PM

Bagaimana cara menggabungkan elemen array dengan ID yang sama ke dalam satu objek dalam JavaScript? Semasa memproses data, kita sering menghadapi keperluan untuk mempunyai id yang sama ...

Perbezaan dalam Konsol.Log Output Result: Mengapa kedua -dua panggilan berbeza? Perbezaan dalam Konsol.Log Output Result: Mengapa kedua -dua panggilan berbeza? Apr 04, 2025 pm 05:12 PM

Perbincangan mendalam mengenai punca-punca utama perbezaan dalam output konsol.log. Artikel ini akan menganalisis perbezaan hasil output fungsi Console.log dalam sekeping kod dan menerangkan sebab -sebab di belakangnya. � ...

See all articles