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 相关文章推荐
vue3.0实现点击切换验证码(组件)及校验
Nov 18 Vue.js
Vue 打包的静态文件不能直接运行的原因及解决办法
Nov 19 Vue.js
Vue开发中常见的套路和技巧总结
Nov 24 Vue.js
Vue3配置axios跨域实现过程解析
Nov 25 Vue.js
Vue与React的区别和优势对比
Dec 18 Vue.js
vue 实现基础组件的自动化全局注册
Dec 25 Vue.js
vue3.0自定义指令(drectives)知识点总结
Dec 27 Vue.js
vue实现登录功能
Dec 31 Vue.js
Vue实现图书管理案例
Jan 20 Vue.js
vue-cropper组件实现图片切割上传
May 27 Vue.js
vue项目proxyTable配置和部署服务器
Apr 14 Vue.js
vue 给数组添加新对象并赋值
Apr 20 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
Zend公司全球首推PHP认证
2006/10/09 PHP
解析yii数据库的增删查改
2013/06/20 PHP
php接口数据加密、解密、验证签名
2015/03/12 PHP
Windows2003下php5.4安装配置教程(Apache2.4)
2016/06/30 PHP
php中的依赖注入实例详解
2019/08/14 PHP
Javascript下的keyCode键码值表
2007/04/10 Javascript
JavaScript面向对象编程
2008/03/02 Javascript
window.onload和$(function(){})的区别介绍
2013/10/30 Javascript
JavaScript中window.showModalDialog()用法详解
2014/12/18 Javascript
JavaScript 浏览器对象模型BOM使用介绍
2015/04/13 Javascript
浅谈javascript alert和confirm的美化
2016/12/15 Javascript
vue.js 左侧二级菜单显示与隐藏切换的实例代码
2017/05/23 Javascript
JS设计模式之命令模式概念与用法分析
2018/02/06 Javascript
AngularJS实现动态切换样式的方法分析
2018/06/26 Javascript
layui实现给某一列加点击事件
2019/10/26 Javascript
JavaScript 类的封装操作示例详解
2020/05/16 Javascript
Vue+Java+Base64实现条码解析的示例
2020/09/23 Javascript
小程序实现左滑删除的效果的实例代码
2020/10/19 Javascript
vant中的toast层级改变操作
2020/11/04 Javascript
[40:29]2018DOTA2亚洲邀请赛 4.7总决赛 LGD vs Mineski 第一场
2018/04/10 DOTA
对于Python中线程问题的简单讲解
2015/04/03 Python
Python实现列表删除重复元素的三种常用方法分析
2017/11/24 Python
对python中大文件的导入与导出方法详解
2018/12/28 Python
Python实现微信翻译机器人的方法
2019/08/13 Python
Python帮你微信头像任意添加装饰别再@微信官方了
2019/09/25 Python
python 利用turtle库绘制笑脸和哭脸的例子
2019/11/23 Python
python3.6.5基于kerberos认证的hive和hdfs连接调用方式
2020/06/06 Python
Python生成器传参数及返回值原理解析
2020/07/22 Python
python中二分查找法的实现方法
2020/12/06 Python
判断单链表中是否存在环
2012/07/16 面试题
下面关于"联合"的题目的输出是什么
2013/08/06 面试题
商场开业庆典策划方案
2014/06/02 职场文书
鲁迅故居导游词
2015/02/05 职场文书
财政局长个人总结
2015/03/04 职场文书
党小组意见范文
2015/06/08 职场文书
七年级作文之下雨天
2019/12/23 职场文书