vue实现滑动解锁功能


Posted in Vue.js onMarch 03, 2022

本文实例为大家分享了vue实现滑动解锁功能的具体代码,供大家参考,具体内容如下

vue实现滑动解锁功能

vue实现滑动解锁功能

vue实现滑动解锁功能

话不多说,直接上代码;

<template>
  <div>
    <div id="box">
      <div class="bgColor"></div>
      <div class="txt">滑动解锁</div>
      <!--给i标签添加上相应字体图标的类名即可-->
      <div class="slider">
        <i v-show="!isSuccess" class="el-icon-d-arrow-right"></i>
        <i v-show="isSuccess" class="el-icon-check"></i>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  mounted() {
    var self = this;
    //一、定义了一个获取元素的方法
    function getEle(selector) {
      return document.querySelector(selector);
    }
    //二、获取到需要用到的DOM元素
    var box = getEle("#box"), //容器
      bgColor = getEle(".bgColor"), //背景色
      txt = getEle(".txt"), //文本
      slider = getEle(".slider"), //滑块
      icon = getEle(".slider>i"),
      successMoveDistance = box.offsetWidth - slider.offsetWidth, //解锁需要滑动的距离
      downX; //用于存放鼠标按下时的位置
    //三、给滑块添加鼠标按下事件
    slider.onmousedown = mousedownHandler;
    slider.ontouchstart = mousedownHandler; //移动端加touchstart事件
    //3.1鼠标按下事件的方法实现
    function mousedownHandler(e) {
      bgColor.style.transition = "";
      slider.style.transition = "";
      var e = e || window.event || e.which;
      downX = e.clientX ? e.clientX : e.changedTouches[0].clientX;
      if (!self.isSuccess) {
        //在鼠标按下时,分别给鼠标添加移动和松开事件
        document.onmousemove = mousemoveHandler;
        document.onmouseup = mouseupHandler;
        //添加移动端对应事件
        document.ontouchmove = mousemoveHandler;
        document.ontouchend = mouseupHandler;
      }
    }
    //四、定义一个获取鼠标当前需要移动多少距离的方法
    function getOffsetX(offset, min, max) {
      if (offset < min) {
        offset = min;
      } else if (offset > max) {
        offset = max;
      }
      return offset;
    }
    //3.1.1鼠标移动事件的方法实现
    function mousemoveHandler(e) {
      var e = e || window.event || e.which;
      var moveX = e.clientX ? e.clientX : e.changedTouches[0].clientX;
      console.log(moveX);
      var offsetX = getOffsetX(moveX - downX, 0, successMoveDistance);
      bgColor.style.width = offsetX + "px";
      slider.style.left = offsetX + "px";

      if (offsetX == successMoveDistance) {
        success();
      }
      //如果不设置滑块滑动时会出现问题(目前还不知道为什么)
      e.preventDefault();
    }
    //3.1.2鼠标松开事件的方法实现
    function mouseupHandler(e) {
      if (!self.isSuccess) {
        bgColor.style.width = 0 + "px";
        slider.style.left = 0 + "px";
        bgColor.style.transition = "width 0.5s linear";
        slider.style.transition = "left 0.5s linear";
      }
      document.onmousemove = null;
      document.onmouseup = null;
      //移除移动端事件
      document.ontouchmove = null;
      document.ontouchend = null;
    }
    //五、定义一个滑块解锁成功的方法
    function success() {
      self.isSuccess = true;
      txt.innerHTML = "解锁成功";
      bgColor.style.backgroundColor = "lightgreen";
      //滑动成功时,移除鼠标按下事件和鼠标移动事件
      slider.onmousedown = null;
      document.onmousemove = null;
      //移除移动端事件
      document.ontouchstart = null;
      document.ontouchmove = null;
    }
  },
  data() {
    return {
      isSuccess: false,
    };
  },
};
</script>
<style>
/*  使用全局样式样式去掉 */
* { touch-action: pan-y; } 
</style>
<style>
#box {
  position: relative;
  width: 300px;
  height: 40px;
  margin: 0 auto;
  margin-top: 10px;
  background-color: #e8e8e8;
  box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.2);
}
.bgColor {
  position: absolute;
  left: 0;
  top: 0;
  width: 40px;
  height: 40px;
  background-color: lightblue;
}
.txt {
  position: absolute;
  width: 100%;
  height: 40px;
  line-height: 40px;
  font-size: 14px;
  color: #000;
  text-align: center;
}
.slider {
  position: absolute;
  left: 0;
  top: 0;
  width: 50px;
  height: 40px;
  /* border: 1px solid #ccc; */
  background: #fff;
  text-align: center;
  cursor: move;
}
.slider > i {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}
</style>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Vue.js 相关文章推荐
vue添加自定义右键菜单的完整实例
Dec 08 Vue.js
vue 导航守卫和axios拦截器有哪些区别
Dec 19 Vue.js
vue 动态创建组件的两种方法
Dec 31 Vue.js
vue3中轻松实现switch功能组件的全过程
Jan 07 Vue.js
Vue如何实现变量表达式选择器
Feb 18 Vue.js
vue-cropper插件实现图片截取上传组件封装
May 27 Vue.js
vue-cropper组件实现图片切割上传
May 27 Vue.js
Vue中foreach数组与js中遍历数组的写法说明
Jun 05 Vue.js
vue Element-ui表格实现树形结构表格
Jun 07 Vue.js
vue判断按钮是否可以点击
Apr 09 Vue.js
解决vue-router的beforeRouteUpdate不能触发
Apr 14 Vue.js
vue ant design 封装弹窗表单的使用
Jun 01 Vue.js
Vue全局事件总线你了解吗
Feb 24 #Vue.js
Vue的生命周期一起来看看
Vue的过滤器你真了解吗
Feb 24 #Vue.js
Vue监视数据的原理详解
Feb 24 #Vue.js
Vue的列表之渲染,排序,过滤详解
Vue3如何理解ref toRef和toRefs的区别
Feb 18 #Vue.js
Vue h函数的使用详解
Feb 18 #Vue.js
You might like
天津市收音机工业发展史
2021/03/04 无线电
php 操作excel文件的方法小结
2009/12/31 PHP
php教程之phpize使用方法
2014/02/12 PHP
php计算给定时间之前的函数用法实例
2015/04/03 PHP
Symfony生成二维码的方法
2016/02/04 PHP
PHP使用Redis实现Session共享的实现示例
2019/05/12 PHP
JSON.parse 解析字符串出错的解决方法
2010/07/08 Javascript
jQuery性能优化的38个建议
2014/03/04 Javascript
js子页面获取父页面数据示例
2014/05/15 Javascript
jquery实现增加删除行的方法
2015/02/03 Javascript
JavaScript获取表单内所有元素值的方法
2015/04/02 Javascript
JavaScript对表格或元素按文本,数字或日期排序的方法
2015/05/26 Javascript
JavaScript实现添加及删除事件的方法小结
2015/08/04 Javascript
jquery实现实时改变网页字体大小、字体背景色和颜色的方法
2015/08/05 Javascript
js编写贪吃蛇的小游戏
2020/08/24 Javascript
详解nodejs与javascript中的aes加密
2016/05/22 NodeJs
浅谈JavaScript中的apply/call/bind和this的使用
2017/02/26 Javascript
vue2.0路由切换后页面滚动位置不变BUG的解决方法
2018/03/14 Javascript
超轻量级的js时间库miment使用解析
2019/08/02 Javascript
JS插件amCharts实现绘制柱形图默认显示数值功能示例
2019/11/26 Javascript
微信小程序开发(二):页面跳转并传参操作示例
2020/06/01 Javascript
用Eclipse写python程序
2018/02/10 Python
Python实现压缩文件夹与解压缩zip文件的方法
2018/09/01 Python
使用 python pyautogui实现鼠标键盘控制功能
2019/08/04 Python
pytorch方法测试详解——归一化(BatchNorm2d)
2020/01/15 Python
Python基于百度AI实现OCR文字识别
2020/04/02 Python
用python爬虫批量下载pdf的实现
2020/12/01 Python
Python爬虫自动化爬取b站实时弹幕实例方法
2021/01/26 Python
JINS眼镜官方网站:日本最大的眼镜邮购
2016/10/14 全球购物
说出一些常用的类,包,接口
2014/09/22 面试题
合作投资意向书
2014/04/01 职场文书
代理人委托书
2014/09/16 职场文书
学校计划生育责任书
2015/05/09 职场文书
2016年教师反腐倡廉心得体会
2016/01/13 职场文书
SpringBoot整合Minio文件存储
2022/04/03 Java/Android
使用CSS实现六边形的图片效果
2022/08/05 HTML / CSS