07 - 瀑布流特效


HTML結構

<div id="main">
    <div class="box"><div class="pic">![](images/0.jpg)</div></div>
    <div class="box"><div class="pic">![](images/1.jpg)</div></div>
    <div class="box"><div class="pic">![](images/2.jpg)</div></div>
    <div class="box"><div class="pic">![](images/3.jpg)</div></div>
    <div class="box"><div class="pic">![](images/4.jpg)</div></div>
    <div class="box"><div class="pic">![](images/5.jpg)</div></div>
    <div class="box"><div class="pic">![](images/6.jpg)</div></div>
    <div class="box"><div class="pic">![](images/7.jpg)</div></div>
    <div class="box"><div class="pic">![](images/8.jpg)</div></div>
    <div class="box"><div class="pic">![](images/9.jpg)</div></div>
    <div class="box"><div class="pic">![](images/10.jpg)</div></div>

    // 省略好多張圖片

    <!-- 引入Js文件 -->
    <!-- 通常在body里面引入比較好 不會造成頁面加載超載 -->

    <script src="js/index.js"></script>
    <script src="js/Scroll.js"></script>
    <script src="js/Underscore-min.js"></script>
</div>

Css樣式

<style>
        * {
            margin: 0;
            padding: 0;
            border: 0;
        }

        img {
            vertical-align: top;
        }

        body, html {
            width: 100%;
            height: 100%;
        }

        #main {
            position: relative;
        }

        .box {
            padding: 15px 0 0 15px;
            float: left;
        }

        .pic {
            padding: 10px;
            border: 1px solid #ccc;
            border-radius: 5px;
            background-color: #fff;
        }

        .pic img {
            width: 165px;
        }
</style>

Js代碼

window.onload = function () {
    // 1.實現瀑布流布局
    waterFall('main', 'box');

    // 2.滾動加載圖片
    window.onscroll = function () {
        // 2.1 判斷是否加載圖片
        if (checkWillLoadNewImage()) {
            // 2.2 造數據
            var dataArr = [
                {src: '12.jpg'},
                {src: '32.jpg'},
                {src: '15.jpg'},
                {src: '23.jpg'},
                {src: '15.jpg'},
                {src: '34.jpg'},
                {src: '24.jpg'},
                {src: '13.jpg'},
                {src: '25.jpg'}
            ];
            // 2.3 根據數據創建盒子
            for (var i = 0; i < dataArr.length; i++) {
                var newBox = document.createElement('div');
                newBox.setAttribute('class', 'box');
                $('main').appendChild(newBox);

                var newPic = document.createElement('div');
                newPic.setAttribute('class', 'pic');
                newBox.appendChild(newPic);

                var newImg = document.createElement('img');
                newPic.appendChild(newImg);
                newImg.src = 'images/' + dataArr[i].src;
            }
            // 2.4 重新調用瀑布流布局
            waterFall('main', 'box');
        }
    }
}


/**  函數調用1
 * 實現瀑布流布局
 * @param parent 父盒子ID
 * @param child  子盒子Class
 */

function waterFall(parent, child) {
    // -- 父盒子居中 --

    // 1. 獲取所有的盒子
    var allBox = $(parent).getElementsByClassName(child);

    // 2. 獲取盒子的寬度
    var boxWidth = allBox[0].offsetWidth;

    // 3. 獲取屏幕的寬度
    var clientW = document.documentElement.clientWidth || document.body.clientWidth;

    // 4. 求出列數
    var cols = parseInt(clientW / boxWidth);

    // 5. 賦值給父盒子 然后居中
    $(parent).style.width = cols * boxWidth + 'px';
    $(parent).style.margin = '0 auto';


    // -- 子盒子定位 --

    // 1. 定義數組
    var heightArr = [], boxHeight = 0, minBoxHeight = 0, minBoxIndex = 0;
    // 2. 遍歷盒子
    for (var i = 0; i < allBox.length; i++) {
        // 3. 取出盒子的高度
        boxHeight = allBox[i].offsetHeight;
        // 4. 把盒子添加進數組
        if (i < cols) {
            heightArr.push(boxHeight);
        }
        // 4.1 剩余其他的盒子
        else {
            // 4.1.1 求出最小盒子的高度
            minBoxHeight = Math.min.apply(null, heightArr);
            // 4.1.2 求出最小盒子的索引號
            minBoxIndex = getMinBoxIndex(heightArr, minBoxHeight);

            // 4.1.2 子盒子定位
            allBox[i].style.position = 'absolute';
            allBox[i].style.left = minBoxIndex * boxWidth + 'px';
            allBox[i].style.top = minBoxHeight + 'px';

            // 更新高度
            heightArr[minBoxIndex] += boxHeight;
        }
    }

}

/**   函數調用2
 * 最小索引
 * @param arr  數組
 * @param val  索引值
 * @returns {返回索引值}
 */

function getMinBoxIndex(arr, val) {
    for (var i = 0; i < arr.length; i++) {
        if (arr[i] == val) {
            return i;
        }
    }
}

/**   函數調用3
 * 判斷是否加載圖片
 */
function checkWillLoadNewImage() {
    // 1.獲取所有的盒子
    var allBox = $('main').getElementsByClassName('box');
    // 2.得到最后一個盒子
    var lastBox = allBox[allBox.length - 1];
    // 3.求出最后一個盒子高度的一半 + 頭部偏離的高度
    var lastBoxDis = lastBox.offsetWidth * 0.5 + lastBox.offsetTop;
    // 4.求出屏幕的高度
    var screenH = document.documentElement.clientHeight || document.body.clientHeight;
    // 5. 求出頁面偏離頭部的距離
    var scrollTop = scroll().top;

    // console.log(lastBoxDis, screenH, scrollTop); 開發中時時進行打印檢測 防止錯誤bug

    return lastBoxDis <= scrollTop + screenH;

}

特效展示

瀑布流.gif
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,182評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,489評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,290評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,776評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,510評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,866評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,860評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,036評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,585評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,331評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,536評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,058評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,754評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,154評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,469評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,273評論 3 399
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,505評論 2 379

推薦閱讀更多精彩內容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽默認的外補...
    _Yfling閱讀 13,781評論 1 92
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,733評論 25 708
  • 一:在制作一個Web應用或Web站點的過程中,你是如何考慮他的UI、安全性、高性能、SEO、可維護性以及技術因素的...
    Arno_z閱讀 1,200評論 0 1
  • BV全稱為Bottega Veneta,是意大利頂級奢侈品牌,BV包包的標志是由手工編織的細細的皮帶子組成的縱橫交...
    大家的大家閱讀 5,833評論 0 2
  • 小羚閱讀 107評論 0 1