JS經過ajax + 多列布局 + 自動加載來實現瀑布流效果

Ajax

  • 說明:本文效果是無限加載的,意思就是你一直滾動就會一直加載圖片出現,經過鼠標滾動距離來判斷的,因此不是說的那種加載一次就停了的那種,那種demo下次我會再作一次

css部分用的是html5+css3的新屬性,圖片會自動添加到每行的最頂端上去,而不是用js去判斷。去除了一些js計算的麻煩。php

css部分:css

* {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        
        body {
            background: #352323 url(images/a.png);
        }
        
        img {
            display: block;
        }
        
        section {
            max-width: 95%;
            margin: 0 auto;
            overflow: hidden;
            column-count: 5;
            column-gap: 0;
            column-fill: auto;
        }
        
        figure {
            border: 2px solid pink;
            margin: 0 5px 10px;
            break-inside: avoid;
            padding: 5px;
        }
        
        figure img {
            width: 100%;
        }
        
        figcaption {
            padding: 10px 0;
            text-align: center;
            font-weight: 900;
            color: #a77869;
        }

html部分:html

經過js插入節點,由於後臺不知道多少張圖片前端

<section>
        <!--  <figure>
            <img src="images/1.jpg" alt="">
            <figcaption>日後餘生,風雪是你</figcaption>
        </figure> -->

</section>

js有兩個部分,一個是我封裝的ajax函數,和一些判斷函數html5

第一部分css3

window.onload = function() {
        var section = document.getElementsByTagName('section')[0];
        //運行ajax函數;


        ajax('get', 'active.php', 'num=10', function(data) {
            //解析json對象
            let img_data = JSON.parse(data);
            console.log(img_data);
            //循環建多少圖片配多少標籤
            for (let i = 0; i < img_data.length; i++) {

                //創建figure標籤
                let figure = document.createElement('figure');

                //建立兩個子元素img和figcaption,並賦值
                let img = document.createElement('img');
                img.src = img_data[i];

                let figcaption = document.createElement('figcaption');

                figcaption.innerHTML = '日後餘生,風雪是你';
                //插節點
                figure.appendChild(img);
                figure.appendChild(figcaption);
                section.appendChild(figure);
            }
        });


        document.onscroll = function() {
            var scrollTop = document.documentElement.scrollTop; //距離網頁高度
            console.log(scrollTop);

            // var ks = document.documentElement.clientHeight; //但是化窗口高度
            var ks = window.innerHeight || document.documentElement.clientHeight; //但是化窗口高度/兼容方法
            var ht = document.documentElement.offsetHeight; //html總高度
            // console.log(ht);

            if (scrollTop + 1 >= ht - ks) { //鼠標滾動的距離大於html總高度-窗口的距離(也就是html在可視窗口之下的總高度)時  觸發函數;
                //執行函數
                ajax('get', 'active.php', 'num=10', function(data) {
                    //解析json對象
                    let img_data = JSON.parse(data);
                    console.log(img_data);
                    //循環建多少圖片配多少標籤
                    for (let i = 0; i < img_data.length; i++) {

                        //創建figure標籤
                        let figure = document.createElement('figure');

                        //建立兩個子元素img和figcaption,並賦值
                        let img = document.createElement('img');
                        img.src = img_data[i];

                        let figcaption = document.createElement('figcaption');

                        figcaption.innerHTML = '日後餘生,風雪是你';
                        //插節點
                        figure.appendChild(img);
                        figure.appendChild(figcaption);
                        section.appendChild(figure);
                    }
                });
            }
        }
    };

第二部分:ajax

/**
 * ajax封裝
 * @param {string} mehod請求數據方法
 * @param {string} url 請求地址
 * @param {string} data 請求參數
 * @param {[functiong]} success [請求成功以後執行的函數0]
 * @return {[none]}  none
 */
function ajax(mehod, url, data, success) {
    var xhr = null;
    if (window.XMLHttpRequest) {
        xhr = new XMLHttpRequest();
    } else {
        xhr = new ActiveXObject("Microsoft.xmlhttp")
    }


    //若是有參數get方法須要拼接字符串url+?+data
    if (mehod === 'get' && data) {
        url += '?' + data;
    }


    //open方法
    xhr.open(mehod, url, true);

    //send方法
    if (mehod === 'get') {
        xhr.send();
    } else {
        xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded');
        xhr(data);
    }

    xhr.onreadystatechange = function() {
        if (xhr.readyState === 4 && xhr.status === 200) {
            success && success(xhr.responseText);
        }
    }

php後臺數據json

由於主要功能偏向前端,因此後端就經過本地文件載入的後端

<?php 

header("Content-type:text/html;charset=utf-8");


$num = $_GET['num']; // api調用者傳遞的須要的圖片頁數 

$img = file("img.txt");

// var_dump($img);

$array_url = array();

for($i=0;$i<$num;$i++){
	$url = array_rand($img);
	array_push($array_url,$img[$url]);
}

$a = json_encode($array_url);

echo $a;

相關文章
相關標籤/搜索