一个简单的滑动验证效果 vue组件

Posted 艾琪云

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个简单的滑动验证效果 vue组件相关的知识,希望对你有一定的参考价值。

<!-- 
    简单的一个滑动验证码。
    @isOk  成功返回true,重置后返回false
    $refs.xxxx.resets()   重置方法。
 -->
<template>
  <div class="slide">
    <div class="out">
      <p v-show="!isOk">请向右滑动滑块</p>
      <div @mousedown="downJiantou($event)" class="jiantou">
        <p>>></p>
        <div class="green">
          <p v-show="isOk">验证成功</p>
        </div>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  name: "aqy-slide",
  data() {
    return {
      isDown: false,
      initX: -1,
      pageX: null,
      isOk: false,
      S: null,
      move: null,
    };
  },
  methods: {
    resets() {
      this.isDown = false;
      this.pageX = null;
      this.isOk = false;
      this.S = null;
      this.move = null;
      this.initX = -1;
      document.querySelector(".jiantou").style.left = "-1px";
      this.$emit("isOk", false);
    },
    // 鼠标按下箭头触发
    downJiantou(e) {
      if (!this.isOk) {
        this.isDown = true;
        this.pageX = e.pageX;
        //增加事件机制
        document.body.addEventListener("mouseup", this.upJiantou);
        // 由于无法直接拿到event ,所以借用vue的data来转换。
        document.body.addEventListener(
          "mousemove",
          (this.move = (event) => {
            this.moveJantou(event);
          })
        );
      }
    },
    upJiantou() {
      this.isDown = false;
      if (!this.isOk) {
        document.querySelector(".jiantou").className = "jiantou transition";
        document.querySelector(".jiantou").style.left = "-1px";
        setTimeout(() => {
          document.querySelector(".jiantou").className = "jiantou";
        }, 500);
      }
      document.body.removeEventListener("mousemove", this.move);
      document.body.removeEventListener("mouseup", this.upJiantou);
    },
    moveJantou(event) {
      if (this.isDown) {
        this.S = event.pageX - this.pageX + this.initX;
        if (this.S < 0) {
          document.querySelector(".jiantou").style.left = "-1px";
          return;
        }
        if (this.S > 250) {
          this.isDown = false;
          this.isOk = true;
          this.$emit("isOk", true);
          document.querySelector(".jiantou").style.left = "250px";
        } else {
          document.querySelector(".jiantou").style.left = this.S + "px";
        }
      }
    },
  },
};
</script>

<style lang="scss" scoped>
.slide {
  width: 100%;
  .out {
    z-index: 999;
    overflow: hidden;
    box-sizing: border-box;
    position: relative;
    margin: 0px auto;
    width: 300px;
    height: 40px;
    border: 1px solid #ccc;
    background-color: #eee;
    user-select: none;
    font-size: 14px;
    text-align: center;
    line-height: 40px;
    color: #666;
    .transition {
      transition: 0.5s;
    }
    .jiantou {
      position: absolute;
      box-sizing: border-box;
      top: -1px;
      left: -1px;
      width: 50px;
      height: 40px;
      border: 1px solid #ccc;
      background-color: #fff;
      & > p {
        user-select: none;
        line-height: 38px;
        text-align: center;
        color: #ccc;
      }
      &:hover {
        cursor: move;
      }
      .green {
        cursor: default;
        width: 300px;
        height: 40px;
        background-color: #7ac23c;
        position: absolute;
        left: -253px;
        top: -1px;
        z-index: -1;
        & > p {
          font-size: 14px;
          color: #fff;
          line-height: 40px;
          text-align: center;
        }
      }
    }
  }
}
</style>

以上是关于一个简单的滑动验证效果 vue组件的主要内容,如果未能解决你的问题,请参考以下文章

vue实现左右两列竖直分别滑动,且双向关联的选项卡

干货--手把手撸vue移动UI框架: 滑动加载

vue组件弹框过渡效果,如,点击显示为从左到右滑动,收回隐藏为从右到左滑动

基于vue项目的组件中导入mui框架初始化滑动等效果时需移除严格模式的问题

vue 父页面中含子页面滑动,滑动结束,底部组件进行滑动

vue-concise-slider vue滑动组件