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

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

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

先科普下瀑布流吧

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

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

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

實(shí)現(xiàn)原理:

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

對(duì)于滾動(dòng)加載:即滾動(dòng)到哪個(gè)高度后,需要去加載數(shù)據(jù),其實(shí)這個(gè)就是列的最小高度值,這樣當(dāng)前滾動(dòng)值和最小高度值比較一下即可判斷出來(lái),是否要觸發(fā)加載數(shù)據(jù);就是寫一個(gè)函數(shù),用來(lái)判斷是否達(dá)到加載圖片條件,如果達(dá)到,就開(kāi)始加載。比如獲得最后一張圖片的offsetTop,可視區(qū)高度,滾動(dòng)距離,也就是當(dāng)圖片的offsetTop小于可視區(qū)高度和滾動(dòng)距離之和的情況下,此時(shí)就應(yīng)該加載了,不過(guò)條件可以隨便定,也可以等滾動(dòng)到圖片的一半時(shí)候在觸發(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 = {     //模擬后臺(tái)數(shù)據(jù) 的一個(gè)JSON格式的文件
  "data":[
   {"src":"1.jpg"},
   {"src":"2.jpg"},
   {"src":"3.jpg"},
   {"src":"4.jpg"},
   {"src":"5.jpg"},
  ]
 };
 window.onscroll = function(){
  if(checkScroll()){   //判斷是否具備滾動(dòng)加載得條件
   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)滾動(dòng)時(shí)候就執(zhí)行
  }
 }
 waterfall('container','pin');
}
function waterfall(parent, box){
 var oParent = document.getElementById(parent);//獲取父級(jí)對(duì)象
 var aBox = getByClass(oParent,box);//獲取所有class為pin的盒子的集合
 var boxWidth = aBox[0].offsetWidth;//獲取一個(gè)盒子的寬
 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)小于第一列個(gè)數(shù)的時(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è)置絕對(duì)定位
   aBox[i].style.top = minH+'px';//設(shè)置top,就是最小高度
   aBox[i].style.left = aBox[0].offsetWidth*index+'px';//設(shè)置left,就是一個(gè)盒子的寬*index索引數(shù)
   arrH[index]+=aBox[i].offsetHeight; //更新新添加盒字后的列高
  }
 }
}
//通過(guò)父級(jí)獲取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)滾到到這個(gè)距離時(shí)候就開(kāi)始加載
 var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;//兼容的滾動(dòng)距離
 var documentHeight = document.documentElement.clientHeight; //頁(yè)面高度
 if(lastBoxHeight<scrollTop+documentHeight){
  return true;
 }
}

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

相關(guān)文章

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

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

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

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

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

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

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

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

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

    js異步編程小技巧詳解

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

    Express框架req?res對(duì)象使用詳解

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

    JavaScript中offsetWidth的bug及解決方法

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

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

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

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

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

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

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

最新評(píng)論

杭锦后旗| 容城县| 彰化市| 西青区| 海丰县| 柏乡县| 漾濞| 庆安县| 沧州市| 清苑县| 保德县| 镇坪县| 民和| 浪卡子县| 平泉县| 蒙山县| 昭平县| 德昌县| 新兴县| 城市| 通州区| 江山市| 玉屏| 吐鲁番市| 普定县| 客服| 逊克县| 延边| 常德市| 海门市| 博乐市| 焦作市| 大同县| 正镶白旗| 万州区| 枞阳县| 云南省| 盐边县| 高阳县| 深州市| 偏关县|