瀑布流布局

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<style>
    .demo-1 {
        column-count: 4;
        -moz-column-gap: 1em;
        -webkit-column-gap: 1em;
        column-gap: 1em;
        width: 100%;
        margin: 0 auto;
        transition: 1s;
    }

    @media screen and (max-width: 750px) {
        .demo-1 {
            column-count: 2;
        }
    }

    .item {
        padding: 2em;
        margin-bottom: 0.5em;
        -webkit-column-break-inside: avoid;
        break-inside: avoid;
        /*防止斷點*/
        background: #ccc;
        text-align: center;
    }
</style>

<body>
    <div class="demo-1">
        <div class="item">
            <div class="item_content content-lar" style="height:100px;"> img</div>
            <span>content</span>
        </div>
        <div class="item">
            <div class="item_content content-sma" style="height:150px;"> 2</div>
        </div>
        <div class="item">
            <div class="item_content content-mid" style="height:50px;"> 3</div>
        </div>
        <div class="item">
            <div class="item_content content-sma" style="height:200px;"> 4</div>
        </div>
        <div class="item">
            <div class="item_content content-mid" style="height:60px;"> 5 </div>
        </div>
        <div class="item">
            <div class="item_content content-lar" style="height:90px;"> 6</div>
        </div>
        <div class="item">
            <div class="item_content content-sma"> 7</div>
        </div>
        <div class="item">
            <div class="item_content content-lar" style="height:120px;"> 8</div>
        </div>
        <div class="item">
            <div class="item_content content-lar"> 9</div>
        </div>
        <div class="item">
            <div class="item_content content-sma" style="height:100px;"> 10 </div>
        </div>
        <div class="item">
            <div class="item_content content-mid"> 11 </div>
        </div>
        <div class="item">
            <div class="item_content content-mid" style="height:100px;"> 12</div>
        </div>
        <div class="item">
            <div class="item_content content-lar"> 9</div>
        </div>
        <div class="item">
            <div class="item_content content-sma" style="height:200px;"> 4</div>
        </div>
        <div class="item">
            <div class="item_content content-lar"> 9</div>
        </div>
        <!-- more items -->
    </div>
</body>
<script type="text/javascript">
    // 定義瀑布流算法函數(shù)
    function fall() {
        const minGap = 20; // 最小間距,讓每一列的最小空隙可以自定義瘤睹,避免太過擁擠的情況發(fā)生沽翔。但是,會通過計算得到真實的間距表窘。
        const itemWidth = 300; // 每一項的寬度苛秕,即當前每一個圖片容器的寬度颖杏。保證每一列都是等寬不等高的。
        const scrollBarWidth = getScrollbarWidth();    // 獲取滾動條的寬度
        const pageWidth = window.innerWidth - scrollBarWidth; // 獲取當前頁面的寬度 = window.innerWidth - 滾動條的寬度
        const column = Math.floor(pageWidth / (itemWidth + minGap)); // 實際列數(shù)=頁面寬度/(圖片寬度+最小間距)
        const gap = (pageWidth - itemWidth * column) / column / 2; // 計算真實間距 = (頁面寬度- 圖片寬度*實際列數(shù))/實際列數(shù)/2
        const items = document.querySelectorAll('img'); // 獲取所有的外層元素
        const heightArr = []; // 定義一個空數(shù)組政溃,保存最低高度趾访。

        // 獲取滾動條的寬度
        function getScrollbarWidth() {
            const oDiv = document.createElement('div');//創(chuàng)建一個div
            // 給div設置樣式。隨便定義寬高董虱,只要能獲取到滾動條就可以
            oDiv.style.cssText = `width: 50px;height: 50px;overflow: scroll;`
            document.body.appendChild(oDiv);//把div添加到body中
            const scrollbarWidth = oDiv.offsetWidth - oDiv.clientWidth;// 使最大寬度和可視寬度相減腹缩,獲得到滾動條寬度。
            oDiv.remove();//移除創(chuàng)建的div
            return scrollbarWidth;//返回滾動條寬度
        }


        for (let i = 0; i < items.length; i++) {
            // 遍歷所有的外層容器
            const height = items[i].offsetHeight;
            // 如果當前處在第一行
            if (i < column) {
                // 直接設置元素距離上部的位置和距離左邊的距離。
                items[i].style.cssText = `top: ${gap}px;left: ${(itemWidth + gap) * i + gap}px`;
                // 保存當前元素的高度藏鹊。
                heightArr.push(height);
            } else {
                // 不是第一行的話润讥,就進行比對。
                let minHeight = heightArr[0]; // 先保存第一項的高度
                let minIndex = 0; // 保存第一項的索引值
                for (let j = 0; j < heightArr.length; j++) {
                    // 通過循環(huán)遍歷比對盘寡,拿到最小值和最小值的索引楚殿。
                    if (minHeight > heightArr[j]) {
                        minHeight = heightArr[j];
                        minIndex = j;
                    }
                }
                // 通過最小值為當前元素設置top值,通過索引為當前元素設置left值竿痰。
                items[i].style.cssText = `top: ${minHeight + gap * 2}px; left: ${(itemWidth + gap) * minIndex + gap}px`;
                // 并修改當前索引的高度為當前元素的高度
                heightArr[minIndex] = minHeight + gap + height;
            }
        }
    }
    // 頁面加載完成調(diào)用一次脆粥。
    window.onload = fall;
    // 頁面尺寸發(fā)生改變再次調(diào)用。
    window.onresize = fall;
</script>

</html>
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末影涉,一起剝皮案震驚了整個濱河市变隔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蟹倾,老刑警劉巖匣缘,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鲜棠,居然都是意外死亡肌厨,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門豁陆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來柑爸,“玉大人,你說我怎么就攤上這事盒音”眵ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵祥诽,是天一觀的道長譬圣。 經(jīng)常有香客問我,道長原押,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任偎血,我火速辦了婚禮诸衔,結果婚禮上,老公的妹妹穿的比我還像新娘颇玷。我一直安慰自己笨农,他們只是感情好,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布帖渠。 她就那樣靜靜地躺著谒亦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上份招,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天切揭,我揣著相機與錄音,去河邊找鬼锁摔。 笑死廓旬,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的谐腰。 我是一名探鬼主播孕豹,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼十气!你這毒婦竟也來了励背?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤砸西,失蹤者是張志新(化名)和其女友劉穎叶眉,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體籍胯,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡竟闪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了杖狼。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炼蛤。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蝶涩,靈堂內(nèi)的尸體忽然破棺而出理朋,到底是詐尸還是另有隱情,我是刑警寧澤绿聘,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布嗽上,位于F島的核電站,受9級特大地震影響熄攘,放射性物質(zhì)發(fā)生泄漏兽愤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一挪圾、第九天 我趴在偏房一處隱蔽的房頂上張望浅萧。 院中可真熱鬧,春花似錦哲思、人聲如沸洼畅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽帝簇。三九已至徘郭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間丧肴,已是汗流浹背残揉。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留闪湾,地道東北人冲甘。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像途样,于是被迫代替她去往敵國和親江醇。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

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