JS通过ajax + 多列布局 + 自动加载来实现瀑布流效果

Stella981
• 阅读 754

Ajax

  • 说明:本文效果是无限加载的,意思就是你一直滚动就会一直加载图片出现,通过鼠标滚动距离来判断的,所以不是说的那种加载一次就停了的那种,那种demo下次我会再做一次

css部分用的是html5+css3的新属性,图片会自动添加到每行的最顶端上去,而不是用js去判断。去除了一些js计算的麻烦。

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部分:

通过js插入节点,因为后台不知道多少张图片

 <section>
        <!--  <figure>
            <img src="images/1.jpg" alt="">
            <figcaption>往后余生,风雪是你</figcaption>
        </figure> -->

</section>

js有两个部分,一个是我封装的ajax函数,和一些判断函数

第一部分

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封装
 * @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后台数据

因为主要功能偏向前端,所以后端就通过本地文件载入的

<?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;

JS通过ajax + 多列布局 + 自动加载来实现瀑布流效果

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
Easter79 Easter79
3年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
3年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
JS和CSS加载(渲染)机制不同
一、结论CSS可以在页面加载完成后随时渲染。举个例子:通过js给某个元素加一个id或者css,只要这个id或者css有对应的样式,此元素的样式就会自动生效。JS不可以在页面加载完成后生效。最明显的例子就是使用EasyUI的时候,iframe中哪些样式无效(EasyUi是依靠JS进行样式处理的,所以无法运行JS,那么样式也就无法设置。简单点说
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这