使用konva和vue-konva库实现拖拽滑块验证功能


Posted in Javascript onApril 27, 2020

1. 在vue项目中安装konvavue-konva

npm install konva vue-konva --save-dev

2. 引入vue-konva

import VueKonva from ‘vue-konva';

Vue.use(VueKonva)

3. 创建单独的滑块验证组件 Captcha.vue,在相应的页面中引入使用即可

<template>
 <v-stage :config="Config.stage">
  <v-layer ref="layer">
   <!-- 背景组 -->
   <v-group :config="Config.group">
    <v-rect :config="Config.rect"></v-rect>
    <v-text :config="Config.text"></v-text>
   </v-group>
   <!-- 遮罩层组 -->
   <v-group :config="Config.group">
    <v-rect :config="Config.coverRect" ref="coverRect"></v-rect>
    <v-text :config="Config.coverText" v-if="success" ref="coverText"></v-text>
   </v-group>
   <!-- 滑块组 -->
   <v-group :config="Config.moveGroup" ref="moveGroup" @mouseover="moveGroupMouseOver" @mouseout="moveGroupMouseOut" @mousedown="moveGroupMouseDown" @mouseup="moveGroupStop">
    <v-rect :config="Config.moveRect" ref="moveRect"></v-rect>
    <!-- 验证成功组 -->
    <v-group :config="Config.group" v-if="success">
     <v-circle :config="Config.succCircle" ref="succCircle"></v-circle>
     <v-line :config="Config.succLine"></v-line>
    </v-group>
    <v-group :config="Config.moveGroup_l" v-else>
     <v-line :config="Config.moveLine1"></v-line>
     <v-line :config="Config.moveLine2"></v-line>
    </v-group>
   </v-group>
  </v-layer>
 </v-stage>
</template>
<script>
/*
 * captchaConfig // 属性 {width:330, height: 36} 组件的宽高
 * eventCaptcha  // 验证成功的回调
 */
let _$mouseDown = false; // 鼠标是否在滑块组中按下,因为和html没有绑定,所以没有放在data中,并以_$开头
export default {
 props: {
  captchaConfig: {
   type: Object,
   default: () => ({
    width: 330, // 宽度
    height: 36, // 高度
   }),
  },
 },
 data() {
  const { width, height } = this.captchaConfig;
  let Config = {
   stage: {
    width: width,
    height: height,
   },
   group: {
    x: 0,
    y: 0,
   },
   rect: {
    width: width,
    height: height,
    fill: '#e8e8e8',
   },
   text: {
    x: 0,
    y: 0,
    width: width,
    height: height,
    text: '请按住滑块,拖动到最右边',
    fontSize: 14,
    fontFamily: '微软雅黑',
    align: 'center',
    lineHeight: parseFloat(height / 14),
   },
   //滑块组
   moveGroup: {
    draggable: true,
   },
   moveRect: {
    x: 0.5,
    y: 0.5,
    width: height - 1,
    height: height - 1,
    fill: '#fff',
    stroke: '#8d92a1',
    strokeWidth: 1,
   },
   moveGroup_l: {
    x: height / 3,
    y: height / 3,
   },
   moveLine1: {
    x: 0,
    y: 0,
    points: [0, 0, height / 6, height / 6, 0, height / 3],
    stroke: '#8d92a1',
    strokeWidth: 1,
    lineCap: 'round',
    lineJoin: 'round',
   },
   moveLine2: {
    x: height / 6,
    y: 0,
    points: [0, 0, height / 6, height / 6, 0, height / 3],
    stroke: '#8d92a1',
    strokeWidth: 1,
    lineCap: 'round',
    lineJoin: 'round',
   },
   //创建遮罩层组
   coverRect: {
    width: height / 2,
    height: height,
    fill: '#8d92a1',
    opacity: 0.8,
   },
   coverText: {
    x: 0,
    y: 0,
    width: width - height,
    height: height,
    align: 'center',
    text: '验证成功',
    fontSize: 14,
    fontFamily: '微软雅黑',
    fontStyle: 'bold',
    fill: '#fff',
    lineHeight: parseFloat(height / 14),
   },
   //验证成功组
   succCircle: {
    x: height / 2,
    y: height / 2,
    radius: height / 4,
    fill: '#8d92a1',
   },
   succLine: {
    points: [height / 2 - height / 4 / 2, height / 2, height / 2 - height / 4 / 8, height / 2 + height / 4 / 2, height / 2 + height / 4 / 2, height / 2 - height / 4 / 2],
    stroke: '#fff',
    strokeWidth: 1,
    lineCap: 'round',
    lineJoin: 'round',
   },
  };
  return {
   Config,
   success: 0, // 标记是否验证成功 0 失败 1 成功
  };
 },
 mounted() {
  // 给document绑定鼠标抬起事件
  document.addEventListener('mouseup', this.moveGroupStop);
  // 在组件注销的时候取消绑定
  this.$once('hook:beforeDestroy', () => {
   document.removeEventListener('mouseup', this.moveGroupStop);
  });
  // 给滑块组绑定拖拽监听
  this.$refs.moveGroup.getNode().dragBoundFunc((pos) => {
   const { width, height } = this.captchaConfig;
   let moveGroup = this.$refs.moveGroup.getNode();
   let moveRect = this.$refs.moveRect.getNode();
   let coverRect = this.$refs.coverRect.getNode();
 
   let moveX = moveGroup.getAttrs().x ? moveGroup.getAttrs().x : 0;
   coverRect.width(moveX + height / 2);
   if (pos.x >= width - height) {
    if (this.success == 0) {
     this.success = 1;
     this.$emit('eventCaptcha');
    }
    coverRect.opacity(1);
   }
   if (this.success == 0) {
    if (pos.x < 0) {
     return {
      x: 0,
      y: moveGroup.getAbsolutePosition().y,
     };
    } else if (pos.x > width - height) {
     return {
      x: width - height,
      y: moveGroup.getAbsolutePosition().y,
     };
    } else {
     return {
      x: pos.x,
      y: moveGroup.getAbsolutePosition().y,
     };
    }
   } else {
    return {
     x: width - height,
     y: moveGroup.getAbsolutePosition().y,
    };
   }
  });
 },
 methods: {
  // 鼠标进入滑块组
  moveGroupMouseOver() {
   document.body.style.cursor = 'pointer';
  },
  // 鼠标移出滑块组
  moveGroupMouseOut() {
   document.body.style.cursor = 'default';
  },
  // 鼠标按下
  moveGroupMouseDown() {
   _$mouseDown = true; // 只有在滑块组点击鼠标才被视作要点击滑动验证
  },
  // 鼠标抬起
  moveGroupStop(e) {
   if (!_$mouseDown) return;
   _$mouseDown = false;
   document.body.style.cursor = 'default'; // 鼠标恢复指针状态
   if (this.success == 0) {
    this.$refs.moveGroup.getNode().to({
     x: 0,
     duration: 0.3,
    });
    this.$refs.coverRect.getNode().to({
     width: this.captchaConfig.height / 2,
     duration: 0.3,
    });
   }
  },
 },
};
</script>

4. 最终效果

使用konva和vue-konva库实现拖拽滑块验证功能

使用konva和vue-konva库实现拖拽滑块验证功能

使用konva和vue-konva库实现拖拽滑块验证功能

简单的滑块验证功能实现,可直接在vue页面中引入使用。konva库:https://konvajs.org/

到此这篇关于使用konva和vue-konva完成前端拖拽滑块验证功能的实现代码的文章就介绍到这了,更多相关konva和vue-konva拖拽滑块验证内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
用Javascript做flash做的事..才完成的一个类.Auntion Action var 0.1
Feb 23 Javascript
如何用js控制css中的float的代码
Aug 16 Javascript
几个比较经典常用的jQuery小技巧
Mar 01 Javascript
javascript中的parseInt和parseFloat区别
Jul 12 Javascript
AngularJS的一些基本样式初窥
Jul 27 Javascript
JS+CSS实现自动切换的网页滑动门菜单效果代码
Sep 14 Javascript
JQuery Ajax 异步操作之动态添加节点功能
May 24 jQuery
js+html5实现侧滑页面效果
Jul 15 Javascript
浅析vue-cli3配置webpack-bundle-analyzer插件【推荐】
Oct 23 Javascript
vue Tab切换以及缓存页面处理的几种方式
Nov 05 Javascript
node使用mysql获取数据库数据中文乱码问题的解决
Dec 02 Javascript
JavaScript交换变量常用4种方法解析
Sep 02 Javascript
JS浏览器BOM常见操作实例详解
Apr 27 #Javascript
Vue CLI3移动端适配(px2rem或postcss-plugin-px2rem)
Apr 27 #Javascript
js HTML DOM EventListener功能与用法实例分析
Apr 27 #Javascript
JS严格模式原理与用法实例分析
Apr 27 #Javascript
详解使用mocha对webpack打包的项目进行&quot;冒烟测试&quot;的大致流程
Apr 27 #Javascript
详解elementUI中input框无法输入的问题
Apr 27 #Javascript
基于jsbarcode 生成条形码并将生成的条码保存至本地+源码
Apr 27 #Javascript
You might like
彻底杜绝PHP的session cookie错误
2009/08/09 PHP
PHP实现模拟http请求的方法分析
2017/12/20 PHP
详细解读php的命名空间(一)
2018/02/21 PHP
搜索附近的人PHP实现代码
2018/02/11 PHP
纯CSS3实现质感细腻丝滑按钮
2021/03/09 HTML / CSS
模仿JQuery.extend函数扩展自己对象的js代码
2009/12/09 Javascript
jquery.Jwin.js 基于jquery的弹出层插件代码
2012/05/23 Javascript
JS原型对象通俗&quot;唱法&quot;
2012/12/27 Javascript
Jquery ajax执行顺序 返回自定义错误信息(实例讲解)
2013/11/06 Javascript
JQuery中层次选择器用法实例详解
2015/05/18 Javascript
JavaScript中反正弦函数Math.asin()的使用简介
2015/06/14 Javascript
基于jQuery仿淘宝产品图片放大镜特效
2020/10/19 Javascript
javascript特殊文本输入框网页特效
2016/09/13 Javascript
利用javascript实现的三种图片放大镜效果实例(附源码)
2017/01/23 Javascript
详解为Bootstrap Modal添加拖拽的方法
2018/01/05 Javascript
layui表格checkbox选择全选样式及功能的实例
2018/03/07 Javascript
vue异步axios获取的数据渲染到页面的方法
2018/08/09 Javascript
详解Vue2 添加对scss的支持
2019/01/02 Javascript
Node.js Windows Binary二进制文件安装方法
2019/05/16 Javascript
谈谈IntersectionObserver懒加载的具体使用
2019/10/15 Javascript
python执行子进程实现进程间通信的方法
2015/06/02 Python
python基础教程之五种数据类型详解
2017/01/12 Python
使用apidocJs快速生成在线文档的实例讲解
2018/02/07 Python
Python 比较文本相似性的方法(difflib,Levenshtein)
2018/10/15 Python
Python3.4解释器用法简单示例
2019/03/22 Python
python 中xpath爬虫实例详解
2019/08/26 Python
Python 在函数上添加包装器
2020/07/28 Python
中国高端家电购物商城:顺电
2018/03/04 全球购物
施华洛世奇中国官网:SWAROVSKI中国
2020/06/16 全球购物
导购员的岗位职责
2014/02/08 职场文书
市场营销求职信范文
2014/02/21 职场文书
销售人员工作自我评价
2014/09/21 职场文书
电工实训心得体会
2016/01/14 职场文书
nginx+lua单机上万并发的实现
2021/05/31 Servers
为什么代码规范要求SQL语句不要过多的join
2021/06/23 MySQL
SQL bool盲注和时间盲注详解
2022/07/23 SQL Server