页面PC端 / 移动端整屏纵向翻页,点击/触摸滑动效果功能代码非插件


页面翻页,滑动功能示范代码


<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scale=no, maximum-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Pic_Test</title>
  <style>
    * {
      margin: 0;
      padding: 0;
    }

    html,
    body {
      height: 100%;
    }

    #pages-wrap {
      width: 100%;
      height: 100%;
      overflow: hidden;
    }

    .pages-content {
      margin: 0 auto;
      height: 100%;
      background: rgba(7, 17, 27, 0.4);
    }

    .pages {
      height: 25%;
      text-align: center;
      font-size: 30px;
      color: #FFF;
    }

    .p1 {
      background: rgba(7, 17, 27, 0.2);
    }

    .p2 {
      background: rgba(174, 238, 238, 0.2);
    }

    .p3 {
      background: rgba(238, 162, 173, 0.2);
    }

    .p4 {
      background: rgba(152, 251, 152, 0.2);
    }

    @media screen and (min-width: 1000px) {
      .pages-content {
        width: 600px;
      }
    }
  </style>
</head>

<body>
  <div id="pages-wrap">
    <div class="pages-content" style="height: 100%; transform: translate3d(0px, 0px, 0px); transition-duration: 0.3s">
      <div class="pages p1">第一页</div>
      <div class="pages p2">第二页</div>
      <div class="pages p3">第三页</div>
      <div class="pages p4">第四页</div>
    </div>
  </div>
  <script src="jquery-3.3.1.min.js"></script>
  <script type="text/javascript">

    // ==========================全局变量/函数==================================
    var start_y = 0,
      total_distance = 0,
      move_y = 0;
    var pages_wrap = $("#pages-wrap");
    var timer;
    var curr_index = 0; // 当前页
    var screen_height = $(document).height(); // 当前网页可以浏览区域高度
    var wrap = $(".pages-content:last-child");
    var pages = $(".pages");
    var total = pages.length; // 总页面数
    wrap.css("height", total * screen_height + "px") // 修改父容器初始高度

    // 下一页
    function nextPage() {
      curr_index++;
      if (curr_index <= total - 1) {
        var move_y = -(curr_index * screen_height);
        wrap.css("transform", "translate3d(0px," + move_y + "px, 0px)");
      } else {
        curr_index = total - 1
        return
      }
    }

    // 上一页
    function prevPage() {
      curr_index--;
      if (curr_index >= 0) {
        var move_y = -(curr_index * screen_height);
        wrap.css("transform", "translate3d(0px," + move_y + "px, 0px)");
      } else {
        curr_index = 0
        return
      }
    }

    // 鼠标/手指拖动、翻页功能
    function movePage(client) {
      var start_time = null,
        end_time = null;
      var down = client == "pc" ? "mousedown" : "touchstart";
      var move = client == "pc" ? "mousemove" : "touchmove";
      var up = client == "pc" ? "mouseup" : "touchend";
      var obj = client == "pc" ? $(window) : wrap;
      obj.on(down, function (e) {
        e.preventDefault();
        total_distance = 0;
        wrap.css("transition-duration", "0s");  // 修改动画时间避免造成拖动延迟不流畅
        start_y = client == "pc" ? e.clientY : e.changedTouches[0].clientY;
        start_time = new Date().getTime();   // 移动端判断手指停留屏幕开始时间
        obj.on(move, function (e) {
          e.preventDefault();
          var clientY = client == "pc" ? e.clientY : e.changedTouches[0].clientY;
          var distance_y = clientY - start_y;
          total_distance += distance_y;
          var arr = wrap.css("transform").split(",")
          var y = user_agent.indexOf('rv') > 0 ? parseInt(arr[13].match(/-?\d+/g)) : parseInt(arr[5].match(/-?\d+/g));   // 利用正则,获取样式内Y轴距离
          move_y = y + distance_y;
          start_y = clientY;   // 修改开始Y轴为当前Y轴坐标,为下一个移动距离做基准
          wrap.css("transform", "translate3d(0px," + move_y + "px, 0px)");
        });
      });
      obj.on(up, function (e) {
        e.preventDefault();
        end_time = new Date().getTime();   // 移动端判断手指停留屏幕结束时间
        wrap.css("transition-duration", "0.3s");
        wrap.off(move);
        if (client == "pc") { obj.off(move); }
        function isMovePage() {   // 判断上翻、下翻、回弹
          if (total_distance < 0 && move_y >= -(screen_height * (total - 1))) {
            nextPage();
          } else if (total_distance > 0 && move_y < 0) {
            prevPage();
          } else {
            move_y = -(curr_index * screen_height);
            wrap.css("transform", "translate3d(0px," + move_y + "px, 0px)");
          }
        }
        if (end_time - start_time <= 200 && Math.abs(total_distance) >= 100) {   // 判断鼠标/手指滑动时间和距离,符合要求直接翻页
          isMovePage();
        } else {
          if (Math.abs(total_distance) >= screen_height / 2) {
            isMovePage();
          } else {
            move_y = -(curr_index * screen_height);
            wrap.css("transform", "translate3d(0px," + move_y + "px, 0px)"); // 定义移动距离不够,回弹当前页面
          }
        }
      });
    }
    // 判断打开页面的平台
    var user_agent = navigator.userAgent.toLowerCase();

    // 判断是否微信浏览器打开
    function isWeixn(ua) {
      if (ua.match(/MicroMessenger/i) == "micromessenger") {
        return true;
      } else {
        return false;
      }
    }

    // =========================PC端事件===================================

    // 判断为windows环境
    if (user_agent.indexOf('windows') > 0) {
      // PC端滚轮滑动翻页
      pages_wrap.on("mousewheel", function (e) {
        clearTimeout($.data(this, "timer"));
        $.data(this, "timer", setTimeout(function () {
          if (e.originalEvent.wheelDelta < 0) {
            nextPage();
          }
          if (e.originalEvent.wheelDelta > 0) {
            prevPage();
          }
        }, 100))
      });

      // PC端鼠标拖动翻页
      wrap.on({   // 利用冒泡,达到鼠标在window对象也可以拖动页面滚动
        "mousedown": function () {
          wrap.on("mousemove", function () { });
        },
        "mouseup": function () { }
      })
      movePage("pc");

    }

    // ==========================手机端事件==================================

    // 判断为移动端
    if (user_agent.indexOf("iphone") > 0 || user_agent.indexOf("ipad") > 0 || user_agent.indexOf("ipod") > 0 || user_agent.indexOf("android") > 0) {
      movePage("mobile");
      if (isWeixn(user_agent)) {

      } else {

      }
    }

  </script>
</body>

</html>

猜你喜欢

转载自www.cnblogs.com/lovellll/p/10208223.html