js實(shí)現(xiàn)一個簡易的瀑布流效果

瀑布流效果档叔,就是每張大小不同的圖片不留白的鋪滿整個網(wǎng)頁瓶佳,首先要進(jìn)行頁面的設(shè)置芋膘,設(shè)置幾個固定的圖片,讓他們排成一排:

<!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>
    <link rel="stylesheet" href="../瀑布/css/pubu.css">
</head>

<body>
    <div class="warpper">
        <div class="box">
            <div class="pics">
                <img src="../瀑布/images/1.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pics">
                <img src="../瀑布/images/1.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pics">
                <img src="../瀑布/images/10.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pics">
                <img src="../瀑布/images/11.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pics">
                <img src="../瀑布/images/21.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pics">
                <img src="../瀑布/images/31.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pics">
                <img src="../瀑布/images/41.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pics">
                <img src="../瀑布/images/38.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pics">
                <img src="../瀑布/images/39.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pics">
                <img src="../瀑布/images/41.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pics">
                <img src="../瀑布/images/42.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pics">
                <img src="../瀑布/images/43.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pics">
                <img src="../瀑布/images/44.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pics">
                <img src="../瀑布/images/45.jpg" alt="">
            </div>
        </div>

        <div class="box">
            <div class="pics">
                <img src="../瀑布/images/46.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pics">
                <img src="../瀑布/images/33.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pics">
                <img src="../瀑布/images/35.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pics">
                <img src="../瀑布/images/37.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pics">
                <img src="../瀑布/images/51.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pics">
                <img src="../瀑布/images/52.jpg" alt="">
            </div>
        </div>
        <div class="box">
            <div class="pics">
                <img src="../瀑布/images/53.jpg" alt="">
            </div>
        </div>
    </div>
</body>
<script src="../瀑布/js/pubu.js"></script>
</html>

完成后,首先要進(jìn)行判斷为朋,因?yàn)榇笮〔灰坏膱D片排成排的話臂拓,中間會有很多留白的空隙,所以要在每行進(jìn)行判斷习寸,取每行中的高度最小的圖片,獲取之后胶惰,在最小的圖片之后,將下一行要排列的圖片絕對定位在 上一行最小高度的圖片之下霞溪,然后每次定位之后孵滞,在附加一個高度,讓圖片每次附加完后都會調(diào)換位置

var warpper = document.querySelector('.warpper');
        var html_w = document.documentElement.clientWidth || document.body.clientWidth;
        var boxs = document.querySelectorAll('.box');
        //獲取圖片外包的盒子的總數(shù)
        var box_w = boxs[0].offsetWidth;
        //獲取單個box的寬度
        var cols = Math.floor(html_w / box_w)
        //獲取每行在當(dāng)前寬度下可裝的圖片數(shù)

        warpper.style.width = box_w * cols + 'px'
        //最大的盒子根據(jù)每個小盒子的寬度和數(shù)量來進(jìn)行寬度賦予
        var arr = [];
        for (var i = 0; i < boxs.length; i++) {
            if (i < cols) {
                //當(dāng)i小于當(dāng)前該行的個數(shù)時
                arr.push(boxs[i].offsetHeight);
                //數(shù)組arr將這些數(shù)字裝進(jìn)
            } else {
                var minH = Math.min.apply(Math, arr)
                //取數(shù)組中高度最小的值
                var ind = arr.indexOf(minH);
                //獲取當(dāng)前最小值對應(yīng)的下標(biāo)
                boxs[i].style.cssText = `position:absolute;top:${minH}px;left:${box_w*ind}px`
                //為最小值之后的值設(shè)置一個絕對定位鸯匹,使該元素沿著最小值的高度往下排列
                arr[ind] += boxs[i].offsetHeight
                //每次循環(huán)之后坊饶,當(dāng)前的ind加上一個高度的值
            }                                     
        }

最后,傳入數(shù)據(jù)忽你,每次進(jìn)行傳值調(diào)用排列即可幼东,完整代碼:

window.addEventListener('load', addEvent);

function addEvent() {
    var data = {
        'dataimg': [{
                'src': '22.jpg'
            },
            {
                'src': '23.jpg'
            },
            {
                'src': '24.jpg'
            },
            {
                'src': '25.jpg'
            },
            {
                'src': '26.jpg'
            },
            {
                'src': '27.jpg'
            },
            {
                'src': '28.jpg'
            },
            {
                'src': '29.jpg'
            },
            {
                'src': '30.jpg'
            },
            {
                'src': '31.jpg'
            },
            {
                'src': '32.jpg'
            },
            {
                'src': '33.jpg'
            },
            {
                'src': '34.jpg'
            },
            {
                'src': '35.jpg'
            },
            {
                'src': '36.jpg'
            },
            {
                'src': '37.jpg'
            },
            {
                'src': '38.jpg'
            },
            {
                'src': '39.jpg'
            },
            {
                'src': '40.jpg'
            },
            {
                'src': '41.jpg'
            },
            {
                'src': '42.jpg'
            },
            {
                'src': '43.jpg'
            },
            {
                'src': '44.jpg'
            },
            {
                'src': '45.jpg'
            },
            {
                'src': '46.jpg'
            },
            {
                'src': '47.jpg'
            },
            {
                'src': '48.jpg'
            },
            {
                'src': '49.jpg'
            },
            {
                'src': '50.jpg'
            },
            {
                'src': '51.jpg'
            },
            {
                'src': '52.jpg'
            },
            {
                'src': '53.jpg'
            },
            {
                'src': '54.jpg'
            },
            {
                'src': '55.jpg'
            },
            {
                'src': '56.jpg'
            },
            {
                'src': '57.jpg'
            },
            {
                'src': '58.jpg'
            },
            {
                'src': '59.jpg'
            },
            {
                'src': '60.jpg'
            },
            {
                'src': '61.jpg'
            },
            {
                'src': '62.jpg'
            },
            {
                'src': '63.jpg'
            },
            {
                'src': '64.jpg'
            },
            {
                'src': '65.jpg'
            },
            {
                'src': '66.jpg'
            },
            {
                'src': '67.jpg'
            },
            {
                'src': '68.jpg'
            },
            {
                'src': '69.jpg'
            },
            {
                'src': '70.jpg'
            },
            {
                'src': '71.jpg'
            },
            {
                'src': '72.jpg'
            },
            {
                'src': '73.jpg'
            },
            {
                'src': '74.jpg'
            },
            {
                'src': '75.jpg'
            },
            {
                'src': '76.jpg'
            },
            {
                'src': '77.jpg'
            },
            {
                'src': '78.jpg'
            },
            {
                'src': '79.jpg'
            },
            {
                'src': '80.jpg'
            },
            {
                'src': '81.jpg'
            },
            {
                'src': '82.jpg'
            },
            {
                'src': '83.jpg'
            },
            {
                'src': '84.jpg'
            },
        ]
    }
    instAll()
    var warpper = document.querySelector('.warpper');

    window.onscroll = function () {
        if (isOk()) {
            //滾動條判斷事件
            for (var i in data.dataimg) {
                //模擬請求臂容,獲得數(shù)據(jù)
                warpper.innerHTML += `<div class="box">
                <div class="pics">
                    <img src="../瀑布/images/${data.dataimg[i].src}" alt="">
                </div>
            </div>`
            }
            instAll()
            //調(diào)用排列
        }

    }

    function instAll() {
        var warpper = document.querySelector('.warpper');
        var html_w = document.documentElement.clientWidth || document.body.clientWidth;
        var boxs = document.querySelectorAll('.box');
        //獲取圖片外包的盒子的總數(shù)
        var box_w = boxs[0].offsetWidth;
        //獲取單個box的寬度
        var cols = Math.floor(html_w / box_w)
        //獲取每行在當(dāng)前寬度下可裝的圖片數(shù)

        warpper.style.width = box_w * cols + 'px'
        //最大的盒子根據(jù)每個小盒子的寬度和數(shù)量來進(jìn)行寬度賦予
        var arr = [];
        for (var i = 0; i < boxs.length; i++) {
            if (i < cols) {
                //當(dāng)i小于當(dāng)前該行的個數(shù)時
                arr.push(boxs[i].offsetHeight);
                //數(shù)組arr將這些數(shù)字裝進(jìn)
            } else {
                var minH = Math.min.apply(Math, arr)
                //取數(shù)組中高度最小的值
                var ind = arr.indexOf(minH);
                //獲取當(dāng)前最小值對應(yīng)的下標(biāo)
                boxs[i].style.cssText = `position:absolute;top:${minH}px;left:${box_w*ind}px`
                //為最小值之后的值設(shè)置一個絕對定位科雳,使該元素沿著最小值的高度往下排列
                arr[ind] += boxs[i].offsetHeight
                //每次循環(huán)之后,當(dāng)前的ind加上一個高度的值
            }                                     
        }

    }

    function isOk() {
        var boxs = document.querySelectorAll('.box');
        var screen_h = document.documentElement.clientHeight || document.body.clientHeight;
        //獲取當(dāng)前可視窗口的高
        var top = screen_h + document.documentElement.scrollTop || document.body.scrollTop;
        //下拉框的高+可視窗口的高的和即為總高度
        var last_img = boxs[boxs.length - 1].offsetTop + boxs[boxs.length - 1].clientHeight/2
        //最后一張圖片底部離最上部的高度
        return top > last_img ? true : false
        //判斷脓杉,最后一張圖片的高度超過top時糟秘,停止
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市球散,隨后出現(xiàn)的幾起案子尿赚,更是在濱河造成了極大的恐慌,老刑警劉巖蕉堰,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凌净,死亡現(xiàn)場離奇詭異,居然都是意外死亡屋讶,警方通過查閱死者的電腦和手機(jī)冰寻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來皿渗,“玉大人斩芭,你說我怎么就攤上這事±纸” “怎么了划乖?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長挤土。 經(jīng)常有香客問我琴庵,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任迷殿,我火速辦了婚禮尉桩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘贪庙。我一直安慰自己蜘犁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布止邮。 她就那樣靜靜地躺著这橙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪导披。 梳的紋絲不亂的頭發(fā)上屈扎,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機(jī)與錄音撩匕,去河邊找鬼鹰晨。 笑死,一個胖子當(dāng)著我的面吹牛止毕,可吹牛的內(nèi)容都是我干的模蜡。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼扁凛,長吁一口氣:“原來是場噩夢啊……” “哼忍疾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起谨朝,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤卤妒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后字币,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體则披,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年洗出,在試婚紗的時候發(fā)現(xiàn)自己被綠了士复。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡共苛,死狀恐怖判没,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情隅茎,我是刑警寧澤澄峰,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站辟犀,受9級特大地震影響俏竞,放射性物質(zhì)發(fā)生泄漏绸硕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一魂毁、第九天 我趴在偏房一處隱蔽的房頂上張望玻佩。 院中可真熱鬧,春花似錦席楚、人聲如沸咬崔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽垮斯。三九已至,卻和暖如春只祠,著一層夾襖步出監(jiān)牢的瞬間兜蠕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工抛寝, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留熊杨,地道東北人。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓盗舰,卻偏偏與公主長得像晶府,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子岭皂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355

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

  • html結(jié)構(gòu) (Emmet) (div.box>div.pic>img[src="images/$.jpg"])*...
    LaBaby_閱讀 639評論 0 0
  • 八月了郊霎,時間過得可真快。不知道自己現(xiàn)在的狀態(tài)是什么爷绘,有點(diǎn)不太明確自己的定位。也算是個大二的學(xué)生了进倍,可是一直都是一顆...
    小本YuDL閱讀 674評論 0 6
  • 黃金風(fēng)鈴木(學(xué)名:Tabebuia chrysantha(Jacq. )Nichols)土至,別稱:黃花風(fēng)鈴木、黃絲風(fēng)...
    夢舞蝶馨閱讀 425評論 3 6
  • 打卡日期:2019年1月25日 打卡累計天數(shù):95 婉兒第2個100天 ?睡早起(7:30):早起(7:20)早睡...
    夏的靜閱讀 59評論 0 0
  • 我們在工作中,偶爾做成一件事不難垂蜗,難的是找出成功的原因楷扬,上升到理論的高度,以后可以重復(fù)成功贴见。 電的科學(xué)史其實(shí)就是科...
    gyl58365閱讀 78評論 0 0