jquery瀑布流的原理

  • 什么是瀑布流,說(shuō)話不形象徒欣,直接看圖說(shuō)話

![S55M%73LKAKO@]OZ7D@MH.png](http://upload-images.jianshu.io/upload_images/3361706-6f2520633110a1c3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

  • 原來(lái)瀑布流就是長(zhǎng)這樣,雖然這個(gè)瀑布流有點(diǎn)丑陋切平,但是當(dāng)你當(dāng)你把圖片中的方塊換成圖片磕谅,應(yīng)該會(huì)很贊,同時(shí)隨著你鼠標(biāo)的滾動(dòng)宠纯,圖片會(huì)層次不齊的加載在頁(yè)面上,形成像瀑布一樣的流水效果
  • 看完圖后层释,想必你是對(duì)它很感興趣婆瓜,那咱不廢話,直接說(shuō)說(shuō)原理把贡羔!
  1. 你的視覺(jué)告訴你廉白,啥子瀑布流,不就是每一列的寬度相等乖寒,每一列的寬度不相等猴蹂,沒(méi)什么了不起,戰(zhàn)勝困難就要從戰(zhàn)略上藐視它楣嘁,小樣瀑布流我們還搞不定磅轻,自從我們聽(tīng)了若愚大大的課,解決它簡(jiǎn)直是so easy ,piece of cake,
  2. 來(lái)把逐虚,我才不怕你----破布流瓢省,枯燥的理論開(kāi)始了
    -首先 外面一個(gè)打的div包裹,position:relative;里面的div position:absolute;這是為了有利于用JS來(lái)操作他們的top痊班、left來(lái)更改他們的位置,同時(shí)把這些新建一個(gè)空數(shù)組來(lái)遍歷它們后勤婚,一列為數(shù)組的一個(gè)元素,來(lái)設(shè)置它們的位置涤伐。
  • 第二步馒胆, 我們先把一行放滿,看看到底一行能擺幾個(gè)凝果,用這個(gè)公式就可以了:一行能擺的數(shù)量=窗口可視區(qū)域的寬度/一個(gè)div的寬度祝迂,由于我們給每個(gè)div設(shè)置了margin,所以獲取元素的寬度時(shí)器净,應(yīng)該使用 var $itemWidth=$('.item').outerWidth(true)型雳,它獲取的是寬度=content寬度+padding寬度+border寬度+margin,而不是width().

  • 第三步,我們開(kāi)始來(lái)擺放每個(gè)div把山害,我們會(huì)發(fā)現(xiàn)第一行沒(méi)有什么問(wèn)題纠俭,依次擺放即可,可是到了第二行浪慌,每一行的高度不一冤荆,我該把它放在哪了,沒(méi)事权纤,有規(guī)律可循:這時(shí)钓简,第二行的第一張應(yīng)該放在頁(yè)面上高度最小的div乌妒,同時(shí),下一個(gè)div總是和當(dāng)前隊(duì)列中高度最小的下面外邓,依次如此撤蚊,即,div的水平方向距離為=div數(shù)組索引號(hào)*div固定寬度损话,拴魄,div垂直方向距離=div數(shù)組索引號(hào)對(duì)應(yīng)的值(即當(dāng)前列的圖片高度之和)。div擺放后更新當(dāng)前列的所有圖片總高度席镀。

  • 注意:第三步你也可以理解為匹中,給定一個(gè)數(shù)組,在該數(shù)組中找出成員最小值和該成員在數(shù)組中的索引號(hào)豪诲。

  • 舉個(gè)例子來(lái)說(shuō):有一排人站在你面前顶捷,現(xiàn)在讓你在它們中找個(gè)最矮,正常人都會(huì)這么想屎篱,我先假設(shè)這群人的第1個(gè)人是身高最矮的服赎,然后我拿第1個(gè)人的身高和第2人的身高比較,若是要是第1個(gè)人的身高最矮交播,就繼續(xù)認(rèn)為第1個(gè)人最矮重虑,若是第2人身高更矮,我就扔了第1個(gè)人秦士,拿第2個(gè)人繼續(xù)按照這個(gè)方法比較缺厉,最后肯定能找到里面?zhèn)€子最矮的。

  • 也就是:首先假定數(shù)組中某個(gè)值為最小值隧土,然后用for循環(huán)遍歷數(shù)組中的所有成員和假定最小值比較提针,如果某數(shù)組成員的值小于假定值,則獲取將該值(colSumHeight[i])和對(duì)應(yīng)的索引號(hào)(i)

  • 第四步:設(shè)置初始狀態(tài)數(shù)組曹傀,數(shù)組長(zhǎng)度等于當(dāng)前一行能擺放的圖片數(shù)辐脖,該數(shù)據(jù)記錄每行中每張圖片的高度,數(shù)組的索引號(hào)記錄圖片在每行上第幾列的位置皆愉。每張圖片擺放后嗜价,修改數(shù)組內(nèi)對(duì)應(yīng)索引號(hào)成員的值(即當(dāng)前列的高度之和)

  • 破布流原理到此結(jié)束,下面是詳細(xì)的JS代碼幕庐,有興趣的看官可以看看

    $(function(){
          var waterfall=(function($){
    
          function render(){
              //獲取div元素的寬度
              var elWidth=$('.item').outerWidth(true),
              //計(jì)算得到一列放置div的數(shù)量
              colNum=parseInt($(window).width()/elWidth),
              //設(shè)置空數(shù)組久锥,來(lái)存放每一列div的高度
              colSumHeight=[];
    
              //遍歷空數(shù)組,添加元素翔脱,并把每一列div的高度設(shè)置為0
              //等同于colSumHeight=[0,0,0,0,0]
              for(var i=0;i<colNum;i++){
                  colSumHeight.push(0);
              }
              
              //遍歷所有的div,通過(guò)在函數(shù)計(jì)算出每一列的高度
              //找出高度之和最小的一列div,接著一次按照這個(gè)方法
              //把所有的div擺放完畢
              $('.item').each(function(){
                  var $cur=$(this);
    
                  var idx=0,
                  minSumHeight=colSumHeight[0];
    
                  for(var i=0;i<colSumHeight.length;i++){
                      if(colSumHeight[i]<minSumHeight){
                          idx=i;
                          minSumHeight=colSumHeight[i];
                          }
                      }
                  $cur.css({
                      left:idx*elWidth,
                      top:minSumHeight
                  });
                  colSumHeight[idx]=$cur.outerHeight(true)+colSumHeight[idx];
              })      
          }
          render()
    
          //當(dāng)瀏覽器窗口縮放時(shí)奴拦,重新放置計(jì)算一列放置div的數(shù)量
          $(window).on('resize',function(){
                  render();
              })
          return{
              init:render
          }
      })(jQuery)
      waterfall.init();
    
    })
    

代碼題

task30

版權(quán)為饑人谷和作者所有,若轉(zhuǎn)載請(qǐng)注明出處

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末届吁,一起剝皮案震驚了整個(gè)濱河市错妖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌疚沐,老刑警劉巖暂氯,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異亮蛔,居然都是意外死亡痴施,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)究流,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)辣吃,“玉大人,你說(shuō)我怎么就攤上這事芬探∩竦茫” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵偷仿,是天一觀的道長(zhǎng)哩簿。 經(jīng)常有香客問(wèn)我,道長(zhǎng)酝静,這世上最難降的妖魔是什么节榜? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮别智,結(jié)果婚禮上宗苍,老公的妹妹穿的比我還像新娘。我一直安慰自己薄榛,他們只是感情好浓若,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著蛇数,像睡著了一般挪钓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上耳舅,一...
    開(kāi)封第一講書(shū)人閱讀 49,079評(píng)論 1 285
  • 那天碌上,我揣著相機(jī)與錄音,去河邊找鬼浦徊。 笑死馏予,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的盔性。 我是一名探鬼主播霞丧,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼冕香!你這毒婦竟也來(lái)了蛹尝?” 一聲冷哼從身側(cè)響起后豫,我...
    開(kāi)封第一講書(shū)人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎突那,沒(méi)想到半個(gè)月后挫酿,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡愕难,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年早龟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片猫缭。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡葱弟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出猜丹,到底是詐尸還是另有隱情芝加,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布居触,位于F島的核電站妖混,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏轮洋。R本人自食惡果不足惜制市,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望弊予。 院中可真熱鬧祥楣,春花似錦、人聲如沸汉柒。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)碾褂。三九已至兽间,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間正塌,已是汗流浹背嘀略。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留乓诽,地道東北人帜羊。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像鸠天,于是被迫代替她去往敵國(guó)和親讼育。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 所謂瀑布流,就是圖片分幾列有規(guī)律的排列奶段,但是這里的排列是有要求的饥瓷,普通的浮動(dòng)布局會(huì)使圖片與圖片之間有很多的空隙,這...
    小飛俠zzr閱讀 814評(píng)論 0 0
  • 《ijs》速成開(kāi)發(fā)手冊(cè)3.0 官方用戶交流:iApp開(kāi)發(fā)交流(1) 239547050iApp開(kāi)發(fā)交流(2) 10...
    葉染柒丶閱讀 5,073評(píng)論 0 7
  • html結(jié)構(gòu) (Emmet) (div.box>div.pic>img[src="images/$.jpg"])*...
    LaBaby_閱讀 632評(píng)論 0 0
  • github地址little-waterfall-framework-** 這里把整一個(gè)瀑布流小框架的實(shí)現(xiàn)思路寫(xiě)出...
    Tuberose閱讀 6,415評(píng)論 12 123
  • 瀑布流 原理:1 每個(gè)元素的width相等忧饭,height不等扛伍;就像瀑布筷畦,水柱大小一樣词裤,長(zhǎng)短各異。2 所有元素用po...
    jrg_memo閱讀 336評(píng)論 0 0