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 相关文章推荐
IE中createElement需要注意的一个问题
Jul 13 Javascript
EasyUI 中 MenuButton 的使用方法
Jul 14 Javascript
js语法学习之判断一个对象是否为数组
May 13 Javascript
简述Jquery与DOM对象
Jul 10 Javascript
JSON 数据详解及实例代码分析
Jan 20 Javascript
学习使用Bootstrap输入框、导航、分页等常用组件
May 11 Javascript
原生JS实现N级菜单的代码
May 21 Javascript
详解VueRouter进阶之导航钩子和路由元信息
Sep 13 Javascript
Vuejs监听vuex中值的变化的方法示例
Dec 02 Javascript
写gulp遇到的ES6问题详解
Dec 03 Javascript
JavaScript中变量提升和函数提升的详解
Aug 07 Javascript
9个JavaScript日常开发小技巧
Oct 06 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
php新浪微博登录接口用法实例
2014/12/23 PHP
javascript void(0)的妙用
2009/10/21 Javascript
jquery 元素相对定位代码
2010/10/15 Javascript
Jquery知识点一 Jquery的ready和Dom的onload的区别
2011/01/15 Javascript
最短的javascript:地址栏载入脚本代码
2011/10/13 Javascript
非常有用的40款jQuery 插件推荐(系列二)
2011/12/25 Javascript
JavaScript之引用类型介绍
2012/08/10 Javascript
js判断字符是否是汉字的两种方法小结
2014/01/03 Javascript
javascript格式化指定日期对象的方法
2015/04/21 Javascript
实例讲解jquery中mouseleave和mouseout的区别
2016/02/17 Javascript
javascript中不易分清的slice,splice和split三个函数
2016/03/29 Javascript
详解js数组的完全随机排列算法
2016/12/16 Javascript
canvas的神奇用法
2017/02/03 Javascript
React Native AsyncStorage本地存储工具类
2017/10/24 Javascript
vue中阻止click事件冒泡,防止触发另一个事件的方法
2018/02/08 Javascript
vue组件传递对象中实现单向绑定的示例
2018/02/28 Javascript
解决$store.getters调用不执行的问题
2019/11/08 Javascript
vue页面切换项目实现转场动画的方法
2019/11/12 Javascript
JS面向对象实现飞机大战
2020/08/26 Javascript
python中的__slots__使用示例
2015/02/26 Python
动态规划之矩阵连乘问题Python实现方法
2017/11/27 Python
python删除服务器文件代码示例
2018/02/09 Python
Python 图像处理: 生成二维高斯分布蒙版的实例
2019/07/04 Python
Python3操作Excel文件(读写)的简单实例
2019/09/02 Python
pytorch加载自定义网络权重的实现
2020/01/07 Python
手把手教你用纯css3实现轮播图效果实例
2017/05/04 HTML / CSS
请介绍一下Ant
2016/07/22 面试题
大学生志愿者感言
2014/01/15 职场文书
机电一体化应届生求职信范文
2014/01/24 职场文书
《郑和远航》教学反思
2014/04/16 职场文书
出差报告范文
2014/11/06 职场文书
活动总结书怎么写
2015/05/11 职场文书
2016年第十九届推普周活动总结
2016/04/06 职场文书
想创业成功,需要掌握这些要点
2019/12/06 职场文书
python面向对象版学生信息管理系统
2021/06/24 Python
vue3.0 数字翻牌组件的使用方法详解
2022/04/20 Vue.js