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


Posted in Javascript onMay 30, 2019

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 + 多列布局 + 自动加载实现瀑布流效果

总结

以上所述是小编给大家介绍的JS通过ajax + 多列布局 + 自动加载来实现瀑布流效果,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
JQuery中对服务器控件 DropdownList, RadioButtonList, CheckboxList的操作总结
Jun 28 Javascript
JS this作用域以及GET传输值过长的问题解决方法
Aug 06 Javascript
extjs4 treepanel动态改变行高度示例
Dec 17 Javascript
JS中getYear()和getFullYear()区别分析
Jul 04 Javascript
jQuery实现可编辑的表格实例讲解(2)
Sep 17 Javascript
jquery操作select元素和option的实例代码
Feb 03 Javascript
使用vuex缓存数据并优化自己的vuex-cache
May 30 Javascript
Vue刷新修改页面中数据的方法
Sep 16 Javascript
JavaScript中构造函数与原型链之间的关系详解
Feb 25 Javascript
使用异步组件优化Vue应用程序的性能
Apr 28 Javascript
jquery向后台提交数组的代码分析
Feb 20 jQuery
TypeScript 引用资源文件后提示找不到的异常处理技巧
Jul 15 Javascript
全面分析JavaScript 继承
May 30 #Javascript
浅谈Express.js解析Post数据类型的正确姿势
May 30 #Javascript
vue组件三大核心概念图文详解
May 30 #Javascript
详解一次Vue低版本安卓白屏问题的解决过程
May 30 #Javascript
基于iview的router常用控制方式
May 30 #Javascript
深入了解js原型模式
May 30 #Javascript
js逆向解密之网络爬虫
May 30 #Javascript
You might like
建立动态的WML站点(三)
2006/10/09 PHP
PHP的范围解析操作符(::)的含义分析说明
2011/07/03 PHP
php实现的支持断点续传的文件下载类
2014/09/23 PHP
ThinkPHP基于PHPExcel导入Excel文件的方法
2014/10/15 PHP
TP3.2批量上传文件或图片 同名冲突问题的解决方法
2017/08/01 PHP
PHP获取远程http或ftp文件的md5值的方法
2019/04/15 PHP
javascript 同时在IE和FireFox获取KeyCode的代码
2010/02/07 Javascript
JavaScript 小型打飞机游戏实现原理说明
2010/10/28 Javascript
js性能优化 如何更快速加载你的JavaScript页面
2012/03/17 Javascript
jQuery的context属性用法实例
2014/12/27 Javascript
原生javascript实现图片滚动、延时加载功能
2015/01/12 Javascript
详解JavaScript中jQuery和Ajax以及JSONP的联合使用
2015/08/13 Javascript
javascript发送短信验证码实现代码
2015/11/12 Javascript
AngularJS实现DOM元素的显示与隐藏功能
2016/11/22 Javascript
基于jQuery实现的Ajax 验证用户名唯一性实例代码
2017/06/28 jQuery
vue jsx 使用指南及vue.js 使用jsx语法的方法
2017/11/11 Javascript
Vue动态加载异步组件的方法
2018/11/21 Javascript
node实现简单的增删改查接口实例代码
2019/08/22 Javascript
vue 实现websocket发送消息并实时接收消息
2019/12/09 Javascript
原生js实现的金山打字小游戏(实例代码详解)
2020/03/16 Javascript
vue 判断元素内容是否超过宽度的方式
2020/07/29 Javascript
在Uni中使用Vue的EventBus总线机制操作
2020/07/31 Javascript
nestjs返回给前端数据格式的封装实现
2021/02/22 Javascript
[48:28]完美世界DOTA2联赛循环赛FTD vs Magma第二场 10月30日
2020/10/31 DOTA
python模拟鼠标拖动操作的方法
2015/03/11 Python
Python基于pygame实现图片代替鼠标移动效果
2015/11/11 Python
python实现简易内存监控
2018/06/21 Python
python 去除二维数组/二维列表中的重复行方法
2019/01/23 Python
Python3列表内置方法大全及示例代码小结
2019/05/10 Python
Django继承自带user表并重写的例子
2019/11/18 Python
Python延迟绑定问题原理及解决方案
2020/08/04 Python
OpenCV灰度化之后图片为绿色的解决
2020/12/01 Python
网上书店创业计划书
2014/01/12 职场文书
单身联谊活动方案
2014/01/29 职场文书
专题组织生活会方案
2014/06/15 职场文书
手把手带你彻底卸载MySQL数据库
2022/06/14 MySQL