最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解析javascript瀑布流原理實現(xiàn)圖片滾動加載

 更新時間:2016年03月10日 12:03:57   作者:白超華  
這篇文章主要幫助大家解析javascript瀑布流原理,實現(xiàn)js圖片滾動加載

先科普下瀑布流吧

瀑布流,又稱瀑布流式布局。是比較流行的一種網(wǎng)站頁面布局,視覺表現(xiàn)為參差不齊的多欄布局,隨著頁面滾動條向下滾動,這種布局還會不斷加載數(shù)據(jù)塊并附加至當(dāng)前尾部。最早采用此布局的網(wǎng)站是Pinterest,逐漸在國內(nèi)流行開來。國內(nèi)大多數(shù)清新站基本為這類風(fēng)格,像美麗說、淘寶網(wǎng)都有使用。

這是我實現(xiàn)的一個效果,就是怎么滾動都加載不玩。就跟瀑布一樣流啊流!

這里的實現(xiàn)方式我們只說Js實現(xiàn)方法

實現(xiàn)原理:

對容器中已有數(shù)據(jù)塊元素進(jìn)行第一次計算1 容器總寬度 2 列寬度  3 最小列數(shù) ,得到列數(shù)后,用一個數(shù)組存放盒子所有高度,找出最小高度。之后根據(jù)序列號更新高度;看著有些拗口,實現(xiàn)起來就很簡單了。

對于滾動加載:即滾動到哪個高度后,需要去加載數(shù)據(jù),其實這個就是列的最小高度值,這樣當(dāng)前滾動值和最小高度值比較一下即可判斷出來,是否要觸發(fā)加載數(shù)據(jù);就是寫一個函數(shù),用來判斷是否達(dá)到加載圖片條件,如果達(dá)到,就開始加載。比如獲得最后一張圖片的offsetTop,可視區(qū)高度,滾動距離,也就是當(dāng)圖片的offsetTop小于可視區(qū)高度和滾動距離之和的情況下,此時就應(yīng)該加載了,不過條件可以隨便定,也可以等滾動到圖片的一半時候在觸發(fā)加載條件,如圖所示:

先上HTML CSS代碼

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>waterfall</title>
 <script src="script.js"></script>
 <style>
  * {
   margin: 0;
   padding: 0;
  }
  body {
   background: yellow;
  }
  #container {

  }
  #container .pin {
   padding-left: 15px;
   padding-top: 15px;
   float: left;
  }
  #container .div-box {
   float: left;
   border: 1px solid #ccc;
   box-shadow: 0 0 5px #bbb;
   background: #fff;
   padding: 12px;
   border-radius: 9px;
  }
  #container .div-box img {
   width: 300px;
  }
  #container .div-box p {
   text-align: center;
   font-size: 20px;
   font-weight: bold;
   color: red;
  }
 </style>
 <script>
  
 </script>
</head>
<body>
 <div id="container">
  <div class="pin">
   <div class="div-box">
    <img src="img/1.jpg" alt="">
    <p>白超華-博客園</p>
   </div>
  </div>
  <div class="pin">
   <div class="div-box">
    <img src="img/2.jpg" alt="">
    <p>白超華-博客園</p>
   </div>
  </div>
  <div class="pin">
   <div class="div-box">
    <img src="img/3.jpg" alt="">
    <p>白超華-博客園</p>
   </div>
  </div>
  <div class="pin">
   <div class="div-box">
    <img src="img/4.jpg" alt="">
    <p>白超華-博客園</p>
   </div>
  </div>
  <div class="pin">
   <div class="div-box">
    <img src="img/5.jpg" alt="">
    <p>白超華-博客園</p>
   </div>
  </div>
  <div class="pin">
   <div class="div-box">
    <img src="img/6.jpg" alt="">
    <p>白超華-博客園</p>
   </div>
  </div>
  <div class="pin">
   <div class="div-box">
    <img src="img/7.jpg" alt="">
    <p>白超華-博客園</p>
   </div>
  </div>
  <div class="pin">
   <div class="div-box">
    <img src="img/8.jpg" alt="">
    <p>白超華-博客園</p>
   </div>
  </div>
  <div class="pin">
   <div class="div-box">
    <img src="img/9.jpg" alt="">
    <p>白超華-博客園</p>
   </div>
  </div>
  <div class="pin">
   <div class="div-box">
    <img src="img/10.jpg" alt="">
    <p>白超華-博客園</p>
   </div>
  </div>
  <div class="pin">
   <div class="div-box">
    <img src="img/1.jpg" alt="">
    <p>白超華-博客園</p>
   </div>
  </div>
  <div class="pin">
   <div class="div-box">
    <img src="img/2.jpg" alt="">
    <p>白超華-博客園</p>
   </div>
  </div>
  <div class="pin">
   <div class="div-box">
    <img src="img/3.jpg" alt="">
    <p>白超華-博客園</p>
   </div>
  </div>
  <div class="pin">
   <div class="div-box">
    <img src="img/4.jpg" alt="">
    <p>白超華-博客園</p>
   </div>
  </div>
  <div class="pin">
   <div class="div-box">
    <img src="img/5.jpg" alt="">
    <p>白超華-博客園</p>
   </div>
  </div>
  <div class="pin">
   <div class="div-box">
    <img src="img/6.jpg" alt="">
    <p>白超華-博客園</p>
   </div>
  </div>
 </div>
</body>
</html>

JS代碼,每行都有注釋

window.onload = function(){
 var data = {     //模擬后臺數(shù)據(jù) 的一個JSON格式的文件
  "data":[
   {"src":"1.jpg"},
   {"src":"2.jpg"},
   {"src":"3.jpg"},
   {"src":"4.jpg"},
   {"src":"5.jpg"},
  ]
 };
 window.onscroll = function(){
  if(checkScroll()){   //判斷是否具備滾動加載得條件
   var oParent = document.getElementById('container');
   for(var i=0; i<data.data.length; i++){
    var div1 = document.createElement('div'); //創(chuàng)建div元素
    div1.className = 'pin';     //設(shè)置class
    oParent.appendChild(div1);
    var div2 = document.createElement('div');//創(chuàng)建div元素
    div2.className = 'div-box';
    div1.appendChild(div2);
    var imgs = document.createElement('img');//創(chuàng)建img元素
    imgs.style.width = '300px';
    imgs.src = 'img/'+data.data[i].src; //設(shè)置讀取路徑
    div2.appendChild(imgs);
    var p = document.createElement('p');//創(chuàng)建p元素
    p.innerHTML = '白超華-博客園';
    div2.appendChild(p);
   }
   waterfall('container','pin');  //--注意 別忘了這句,當(dāng)滾動時候就執(zhí)行
  }
 }
 waterfall('container','pin');
}
function waterfall(parent, box){
 var oParent = document.getElementById(parent);//獲取父級對象
 var aBox = getByClass(oParent,box);//獲取所有class為pin的盒子的集合
 var boxWidth = aBox[0].offsetWidth;//獲取一個盒子的寬
 var pageWidth = document.body.clientWidth||document.documentElement.clientWidth;//獲取可視區(qū)寬
 var cols = Math.floor(pageWidth/boxWidth);//獲得列數(shù)
 var arrH = [];//用于存放盒子的高

 for(var i=0; i<aBox.length; i++){
  if(i<cols){//當(dāng)小于第一列個數(shù)的時候
   arrH.push(aBox[i].offsetHeight);
  } else {
   var minH = Math.min.apply(null,arrH);//得到數(shù)組中盒字的最小高度minH;
   var index = getMinIndex(arrH,minH);

   aBox[i].style.position = 'absolute';//設(shè)置絕對定位
   aBox[i].style.top = minH+'px';//設(shè)置top,就是最小高度
   aBox[i].style.left = aBox[0].offsetWidth*index+'px';//設(shè)置left,就是一個盒子的寬*index索引數(shù)
   arrH[index]+=aBox[i].offsetHeight; //更新新添加盒字后的列高
  }
 }
}
//通過父級獲取class
function getByClass(parent, classname){
 var aClass = parent.getElementsByTagName('*');
 var arr = [];

 for(var i=0; i<aClass.length; i++){
  if(aClass[i].className == classname){
   arr.push(aClass[i]);
  }
 }
 return arr;
}
//最小值的索引index
function getMinIndex(arr,val){
 for( i in arr){
  if(arr[i] == val){
   return i;
  }
 }
}
//
function checkScroll(){
 var oParent = document.getElementById('container');
 var aBox = getByClass(oParent,'pin');
 var lastBoxHeight = aBox[aBox.length-1].offsetTop;// 當(dāng)滾到到這個距離時候就開始加載
 var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;//兼容的滾動距離
 var documentHeight = document.documentElement.clientHeight; //頁面高度
 if(lastBoxHeight<scrollTop+documentHeight){
  return true;
 }
}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助。

相關(guān)文章

  • Javascript中this關(guān)鍵字的一些小知識

    Javascript中this關(guān)鍵字的一些小知識

    這篇文章主要介紹了Javascript中this關(guān)鍵字的一些小知識,本文講解了this的隱性綁定、var that = this兩部份內(nèi)容,需要的朋友可以參考下
    2015-03-03
  • 基于javascript實現(xiàn)圖片切換效果

    基于javascript實現(xiàn)圖片切換效果

    這篇文章主要介紹了基于javascript實現(xiàn)圖片切換效果的相關(guān)資料,需要的朋友可以參考下
    2016-04-04
  • js調(diào)用瀏覽器打印模塊實現(xiàn)點(diǎn)擊按鈕觸發(fā)自定義函數(shù)

    js調(diào)用瀏覽器打印模塊實現(xiàn)點(diǎn)擊按鈕觸發(fā)自定義函數(shù)

    把瀏覽器打印的功能保留并賦予到自己添加的按鈕當(dāng)中,可以在點(diǎn)擊按鈕的同時觸發(fā)自定義的函數(shù)
    2014-03-03
  • javascript實現(xiàn)下雨效果

    javascript實現(xiàn)下雨效果

    本文主要介紹了javascript實現(xiàn)下雨效果的示例代碼。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03
  • js異步編程小技巧詳解

    js異步編程小技巧詳解

    這篇文章主要介紹了js異步編程技巧,使用計數(shù)器的方式,每完成一個請求計數(shù)器加1 當(dāng)計數(shù)器等于2時執(zhí)行回調(diào)邏輯,兩個http并行發(fā)送,從而極大的提高了效率,需要的朋友可以參考下
    2017-08-08
  • Express框架req?res對象使用詳解

    Express框架req?res對象使用詳解

    這篇文章主要為大家介紹了Express框架req?res對象使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • JavaScript中offsetWidth的bug及解決方法

    JavaScript中offsetWidth的bug及解決方法

    這篇文章主要為大家詳細(xì)介紹了JavaScript中offsetWidth的bug及解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • js嚴(yán)格模式總結(jié)(分享)

    js嚴(yán)格模式總結(jié)(分享)

    下面小編就為大家?guī)硪黄猨s嚴(yán)格模式總結(jié)(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-08-08
  • JavaScript實現(xiàn)的搜索及高亮顯示功能示例

    JavaScript實現(xiàn)的搜索及高亮顯示功能示例

    這篇文章主要介紹了JavaScript實現(xiàn)的搜索及高亮顯示功能,涉及javascript字符遍歷與頁面元素屬性相關(guān)操作技巧,需要的朋友可以參考下
    2017-08-08
  • JS實現(xiàn)頁面跳轉(zhuǎn)與刷新的方法匯總

    JS實現(xiàn)頁面跳轉(zhuǎn)與刷新的方法匯總

    這篇文章主要給大家介紹了關(guān)于JS實現(xiàn)頁面跳轉(zhuǎn)與刷新的方法,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用JS具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08

最新評論

石渠县| 通州市| 西充县| 喀喇沁旗| 奎屯市| 浪卡子县| 剑阁县| 东光县| 资溪县| 曲沃县| 德兴市| 十堰市| 石屏县| 当涂县| 佛山市| 盐津县| 乐山市| 苍梧县| 凭祥市| 曲阜市| 锡林郭勒盟| 英山县| 仲巴县| 定州市| 额尔古纳市| 汉阴县| 桐梓县| 府谷县| 宾阳县| 保德县| 湾仔区| 日土县| 许昌市| 海兴县| 陆良县| 盐亭县| 沽源县| 嘉禾县| 巩留县| 汤阴县| 新巴尔虎右旗|