JS實(shí)現(xiàn)瀑布流布局

瀑布流又稱瀑布流式布局顶捷,是比較流行的一種網(wǎng)站頁面布局方式柄粹。視覺表現(xiàn)為參差不齊的多欄布局匕积,最早采用此布局的是網(wǎng)站是 Pinterest,后逐漸在國內(nèi)流行扮念。

瀑布流布局效果

image

即多行等寬元素排列损搬,后面的元素依次添加到其后,等寬不等高柜与,根據(jù)圖片原比例縮放直至寬度達(dá)到我們的要求巧勤,依次按照規(guī)則放入指定位置。

那么規(guī)則是什么呢旅挤?
下面通過圖解來分析一下瀑布流的算法踢关。

圖解瀑布流算法

當(dāng)?shù)谝慌排艥M足夠多的等寬圖片時(shí)(如下圖情況),自然而然的考慮到之后放置的圖片會(huì)往下面排放粘茄。

image

那么第六張圖片签舞,放置在什么位置呢秕脓?是下圖的位置么?

image

我們通過瀑布流算法實(shí)驗(yàn)得到儒搭,后面緊跟的第六張圖片的位置應(yīng)該是這個(gè)位置吠架。

image

為什么呢?
因?yàn)榉胖盟奥辏@一列的高度為所有列中最小傍药,所以會(huì)放置在這個(gè)地方。
所以我們知道了魂仍,如果再繼續(xù)放置下去拐辽,第七張圖片應(yīng)該是這個(gè)位置,對(duì)嗎擦酌?

image

通過瀑布流算法實(shí)驗(yàn)得出位置正確俱诸。看懂這個(gè)圖示應(yīng)該就能理解了瀑布流的原理算法赊舶。

image

JS 實(shí)現(xiàn)代碼

window.onload = function () {
    var wapper = document.querySelector('.wapper')
    window.onscroll = function () { //滾動(dòng)條事件
        if (isOk()) { //判斷可以執(zhí)行圖片時(shí)
            for (var i in data.dataimg) { //循環(huán)數(shù)據(jù)庫寫入
                wapper.innerHTML += ` <div class="box">
                <div class="plic">
                    <img src="./images/${data.dataimg[i].src}.jpg" alt="">
                </div>
            </div>`
            }
            shunxu() //調(diào)用排序方式
        }
    }

    shunxu()

    function shunxu() { //封裝圖片排列順序
        var wapper = document.querySelector('.wapper');
        var html_w = document.documentElement.clientWidth || document.body.clientWidth; //獲取頁面寬度
        var boxs = document.querySelectorAll('.box');
        var box_w = boxs[0].offsetWidth; //獲取單張圖片的寬度
        var cols = Math.floor(html_w / box_w); //計(jì)算第一排的圖片數(shù)量
        wapper.style.width = box_w * cols + 'px'; //重新給wapper定義寬度
        var arr = []; //聲明一個(gè)空數(shù)組睁搭,放第一排圖片的高度
        for (var i = 0; i < boxs.length; i++) { //循環(huán)所有圖片
            if (i < cols) { //判斷第一排的圖片
                arr.push(boxs[i].offsetHeight); //高度放入空數(shù)組
            } else { //反之不是第一排的
                var minH = Math.min.apply(Math, arr); //最低高度(數(shù)組找最小數(shù)的方法)
                var ind = arr.indexOf(minH); //通過高度找出下標(biāo)
                boxs[i].style = `position:absolute;left:${ind * box_w}px;top:${minH}px`;
                //定位,left值為下標(biāo)*圖片的寬度笼平,top值為最低高度
                arr[ind] += boxs[i].offsetHeight;
                //加入圖片后更新arr的數(shù)據(jù)

            }
        }

    }


    function isOk() { //封裝圖片是否要加載
        var boxs = document.querySelectorAll('.box');
        var screen_h = document.documentElement.clientHeight || document.body.clientHeight; //可視區(qū)窗口高度
        var scroll_t = document.documentElement.scrollTop || document.body.scrollTop; //滾動(dòng)條高度
        var top = screen_h + scroll_t; //top值
        var last_img = boxs[boxs.length - 1].offsetTop + boxs[boxs.length - 1].clientHeight / 2;//最后一張圖片距頂部的高度
        //總top值大于最后一張圖片距頂部的高度嗎园骆,大于了就true,否則false
        return top > last_img ? true : false;

    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末寓调,一起剝皮案震驚了整個(gè)濱河市锌唾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌夺英,老刑警劉巖鸠珠,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異秋麸,居然都是意外死亡渐排,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門灸蟆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來驯耻,“玉大人,你說我怎么就攤上這事炒考】筛浚” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵斋枢,是天一觀的道長帘靡。 經(jīng)常有香客問我,道長瓤帚,這世上最難降的妖魔是什么描姚? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任涩赢,我火速辦了婚禮,結(jié)果婚禮上轩勘,老公的妹妹穿的比我還像新娘筒扒。我一直安慰自己,他們只是感情好绊寻,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布花墩。 她就那樣靜靜地躺著,像睡著了一般澄步。 火紅的嫁衣襯著肌膚如雪冰蘑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天村缸,我揣著相機(jī)與錄音懂缕,去河邊找鬼。 笑死王凑,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的聋丝。 我是一名探鬼主播索烹,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼弱睦!你這毒婦竟也來了百姓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤况木,失蹤者是張志新(化名)和其女友劉穎垒拢,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體火惊,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡求类,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了屹耐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尸疆。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖惶岭,靈堂內(nèi)的尸體忽然破棺而出寿弱,到底是詐尸還是另有隱情,我是刑警寧澤按灶,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布症革,位于F島的核電站,受9級(jí)特大地震影響鸯旁,放射性物質(zhì)發(fā)生泄漏噪矛。R本人自食惡果不足惜量蕊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望摩疑。 院中可真熱鬧危融,春花似錦、人聲如沸雷袋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽楷怒。三九已至蛋勺,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鸠删,已是汗流浹背抱完。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留刃泡,地道東北人巧娱。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像烘贴,于是被迫代替她去往敵國和親禁添。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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