js瀑布流

 **瀑布流概念**:
        又稱瀑布流式布局蕊肥,是比較流行的一種網(wǎng)站頁面布局方式庶柿。
        視覺表現(xiàn)為參差不齊的多欄布局拍摇,最早采用此布局的是網(wǎng)站是Pinterest述吸,后逐漸在國內(nèi)流行喷橙。 

 **瀑布流原理**:
           頁面容器內(nèi)的多個高度不固定的div之間按照一定的間隔參差不齊的無序浮動癞志,
        鼠標(biāo)滾動時不斷在容器內(nèi)的尾部加載數(shù)據(jù)往枷,且自動加載到空缺位置,不斷循環(huán)今阳。

   **  優(yōu)點(diǎn):**

            1.有效降低了界面復(fù)雜度师溅,節(jié)省了空間:
     不再需要臃腫復(fù)雜的頁面導(dǎo)航鏈接或者按鈕了; 

            2.在觸屏設(shè)備上交互方式有更好的用戶體驗盾舌,
          通過向上滑動進(jìn)行頁面滾動和數(shù)據(jù)加載墓臭,對操作的精準(zhǔn)程度要求遠(yuǎn)遠(yuǎn)低于點(diǎn)擊按鈕或者鏈接;

            3.更高的參與度妖谴,使用戶能更好的專注于瀏覽而不是操作窿锉;

    ** 缺點(diǎn):**

            1.無限滾動只適用與特定類型產(chǎn)品中的某一類型,如某類微博信息膝舅,購物網(wǎng)站的某類商品嗡载,而不適用與一般的門戶網(wǎng)站,使用需斟酌仍稀;

            2.需要打造額外的js庫來保證頁面數(shù)據(jù)的加載和排列洼滚,而這在一定意義上增加了在網(wǎng)頁的性能和設(shè)備兼容等方面的問題;

   **  js核心思路:**

            1.編寫方法:獲取容器內(nèi)所有外層元素技潘,存入數(shù)組遥巴;

            2.編寫方法:計算容器內(nèi)一行可以承載多少個元素千康,方法:容器寬度/元素寬度,四舍五入向下取整铲掐;

            3.編寫方法:把每一行中所有元素的高度值存入數(shù)組拾弃;

            4.編寫方法:在高度值數(shù)組中找到最小高度值;

            5.編寫方法:把第二行第一個元素定位到上一行所有元素中高度最低的元素下面摆霉,即設(shè)置該元素的top豪椿,left,position屬性携栋;

            6.編寫方法:重置當(dāng)前高度值數(shù)組中的最小值搭盾;

            7.編寫方法:從第二行第一個元素開始,遍歷每個元素刻两,用上述方法重新定位每個元素的位置增蹭,把該事件綁定到頁面;

            8.編寫方法:監(jiān)聽鼠標(biāo)事件磅摹,當(dāng)前容器內(nèi)最下面一個元素的offsetTop<瀏覽器可視高度+已滾動高度時,加載下一頁數(shù)據(jù)霎奢;

            9.加載完之后户誓,用上述方法重新定位新加載元素的位置;



代碼效果:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        *{
 margin: 0px;
 padding: 0px;
}
#container{
 position: relative;
}
.box{
 padding: 7px;
 float: left;
 margin: 0px auto;
}
.box_img{
 padding: 5px;
 border: 1px solid #DCDCDC;
 box-shadow: 0 0 5px #ccc;
 border-radius: 5px;
}
.box_img img{
 width: 230px;
}
    </style>
</head>
<body>
    <div id="container">
        <div class="box">
         <div class="box_img">
          <img src="img/1.jpg" />
         </div>
        </div>
        <div class="box">
         <div class="box_img">
          <img src="img/2.jpg" />
         </div>
        </div>
        <div class="box">
         <div class="box_img">
          <img src="img/3.jpg" />
         </div>
        </div>
        <div class="box">
         <div class="box_img">
          <img src="img/4.jpg" />
         </div>
        </div>
        <div class="box">
         <div class="box_img">
          <img src="img/5.jpg" />
         </div>
        </div>
        <div class="box">
         <div class="box_img">
          <img src="img/6.jpg" />
         </div>
        </div>
        <div class="box">
         <div class="box_img">
          <img src="img/7.jpg" />
         </div>
        </div>
        <div class="box">
         <div class="box_img">
          <img src="img/3.jpg" />
         </div>
        </div>
        <div class="box">
         <div class="box_img">
          <img src="img/1.jpg" />
         </div>
        </div>
        <div class="box">
         <div class="box_img">
          <img src="img/2.jpg" />
         </div>
        </div>
        <div class="box">
         <div class="box_img">
          <img src="img/1.jpg" />
         </div>
        </div>
        <div class="box">
         <div class="box_img">
          <img src="img/2.jpg" />
         </div>
        </div>
        <div class="box">
         <div class="box_img">
          <img src="img/3.jpg" />
         </div>
        </div>
        <div class="box">
         <div class="box_img">
          <img src="img/4.jpg" />
         </div>
        </div>
        <div class="box">
         <div class="box_img">
          <img src="img/5.jpg" />
         </div>
        </div>
        <div class="box">
         <div class="box_img">
          <img src="img/6.jpg" />
         </div>
        </div>
          
       </div>
</body>
</html>
<script>

    window.onload=function(){
   
   imgLocation("container","box");
   var imgData={"data":[{"src":"1.jpg"},{"src":"2.jpg"},{"src":"3.jpg"},{"src":"3.jpg"},{"src":"4.jpg"},{"src":"5.jpg"},{"src":"6.jpg"},{"src":"2.jpg"},{"src":"3.jpg"},{"src":"3.jpg"},{"src":"4.jpg"},{"src":"5.jpg"}]}
   window.onscroll=function(){
  //  console.log(document.documentElement.scrollTop);
    if(checkFlag()){
     var cparent=document.getElementById("container");
     for(var i=0;i<imgData.data.length;i++){
      var ccontent=document.createElement("div");
      ccontent.className="box";
      cparent.appendChild(ccontent);
      var boximg=document.createElement("div");
      boximg.className="box_img";
      ccontent.appendChild(boximg);
      var img=document.createElement("img");
      img.src="img/"+imgData.data[i].src;
      boximg.appendChild(img);
        
      //另外一種方法在div后邊追加內(nèi)容幕侠,不覆蓋原有內(nèi)容
  //    var content="<div class='box'><div class='box_img'><img src='img/"+imgData.data[i].src+"'/></div></div>";
  //    cparent.innerHTML+=content;
     }
     imgLocation("container","box");
    }
   }
  }
    
  function checkFlag(){
   var cparent=document.getElementById("container");
   var ccontent=getChildElement(cparent,"box");//圖片的所有box數(shù)
   var lastContentHeight=ccontent[ccontent.length-1].offsetTop;//最后一張圖片距離頂部高度
   var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;//滾動條距離頂部高度
   var pageHeight=document.documentElement.clientHeight||document.body.clientHeight;//屏幕高度
  // console.log(lastContentHeight+","+scrollTop+","+pageHeight);
   if(lastContentHeight<scrollTop+pageHeight){
    return true;
   }
  }
    
  function imgLocation(parent,content){
   var cparent=document.getElementById(parent);
   var ccontent=getChildElement(cparent,content);//圖片的所有box數(shù)
   var imgWidth=ccontent[0].offsetWidth;//圖片寬度
   var num=Math.floor(document.documentElement.clientWidth/imgWidth);//一行放圖片個數(shù)
   cparent.style.cssText="width:"+imgWidth*num+"px;margin:0px auto";//container的寬度
   var boxHeightArr=[];//每一列box高度
   for(var i=0;i<ccontent.length;i++){
    if(i<num){
     boxHeightArr[i]=ccontent[i].offsetHeight;
    }else{
     var minHeight=Math.min.apply(null,boxHeightArr);//最小高度
     var minIndex = getMinheightLocation(boxHeightArr,minHeight);//得到最小高度下標(biāo)
  //   console.log(minHeight+","+minIndex);
     ccontent[i].style.position="absolute";
     ccontent[i].style.top=minHeight+"px";//距離頂部高度
     ccontent[i].style.left=ccontent[minIndex].offsetLeft+"px";//距離左邊長度
     boxHeightArr[minIndex]+=ccontent[i].offsetHeight;
  //   console.log(ccontent[i].offsetHeight+","+ccontent[i].height);//ccontent[i].height=undefined
       
    }
   }
  }
    
  function getMinheightLocation(boxHeightArr,minHeight){
   for(var i in boxHeightArr){
    if(boxHeightArr[i]==minHeight){
     return i
    }
   }
  }
    
  function getChildElement(parent,content){
   //將parent下有content的全部取出
   var contentArr=[];
   var allContent=parent.getElementsByTagName("*");
   for(i=0;i<allContent.length;i++){
    if(allContent[i].className=="box"){
     contentArr.push(allContent[i]);
    }
   }
   return contentArr;
  }
       </script>

兼容性
1 點(diǎn)擊300ms 使用fastclick
2 移動端1px 在ios中使用0.5px
3 js中獲取瀏覽器高度帝美,獲取scrollTOP等屬性需要兼容
4 H5 的audio在ios上autoplay不會自動播放 一般使用進(jìn)入頁面后,使用js控制播放
5 在html上加overflow:hidden屬性的時候晤硕,好多移動端瀏覽器都不支持
要實(shí)現(xiàn)超出范圍隱藏悼潭,滾動條不顯示,一般使用js獲取高度來動態(tài)設(shè)置html高度
6 ios系統(tǒng)中在移動瀏覽器的頁面中給按鈕加JS事件舞箍,其按鈕必須是原生HTML按鈕或者由<a>標(biāo)簽自定義構(gòu)成舰褪。
原來在IOS系統(tǒng)中,瀏覽器只支持給原生HTML按鈕或<a>標(biāo)簽加JS事件
7 你用js 生成的一個按鈕 <div class="btn">按鈕</div>
在ios上直接$("#btn").click是不能加點(diǎn)擊事件的疏橄,必須使用事件委托
8 h5頁面 當(dāng)輸入框在最底部占拍,點(diǎn)擊軟鍵盤后輸入框會被遮擋。定時器或者修改為固定定位

                  setTimeout(function(){
                     document.body.scrollTop = document.body.scrollHeight;
                  },300);
               var oHeight = $(document).height(); //瀏覽器當(dāng)前的高度
               $(window).resize(function(){ 
            if($(document).height() < oHeight){ 
            }else{ 
        $("#footer").css("position","absolute");
  } 
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末捎迫,一起剝皮案震驚了整個濱河市晃酒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌窄绒,老刑警劉巖贝次,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異彰导,居然都是意外死亡蛔翅,警方通過查閱死者的電腦和手機(jī)恼布,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來搁宾,“玉大人折汞,你說我怎么就攤上這事「峭龋” “怎么了爽待?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長翩腐。 經(jīng)常有香客問我鸟款,道長,這世上最難降的妖魔是什么茂卦? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任何什,我火速辦了婚禮,結(jié)果婚禮上等龙,老公的妹妹穿的比我還像新娘处渣。我一直安慰自己,他們只是感情好蛛砰,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布罐栈。 她就那樣靜靜地躺著,像睡著了一般泥畅。 火紅的嫁衣襯著肌膚如雪荠诬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天位仁,我揣著相機(jī)與錄音柑贞,去河邊找鬼。 笑死聂抢,一個胖子當(dāng)著我的面吹牛钧嘶,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播涛浙,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼康辑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了轿亮?” 一聲冷哼從身側(cè)響起疮薇,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎我注,沒想到半個月后按咒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡但骨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年励七,在試婚紗的時候發(fā)現(xiàn)自己被綠了智袭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡掠抬,死狀恐怖吼野,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情两波,我是刑警寧澤瞳步,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站腰奋,受9級特大地震影響单起,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜劣坊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一嘀倒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧局冰,春花似錦测蘑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至赠摇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間浅蚪,已是汗流浹背藕帜。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留惜傲,地道東北人洽故。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像盗誊,于是被迫代替她去往敵國和親时甚。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評論 2 355