使用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 相关文章推荐
[原创]图片分页查看
Aug 28 Javascript
JQuery通过Ajax提交表单并返回结果
Jul 31 Javascript
Mac地址验证的javascript代码
Nov 09 Javascript
原生javascript实现隔行换色
Jan 04 Javascript
JavaScript操作HTML元素和样式的方法详解
Oct 21 Javascript
JavaScript实现按键精灵的原理分析
Feb 21 Javascript
canvas红包照片实例分享
Feb 28 Javascript
easyui简介_动力节点Java学院整理
Jul 14 Javascript
Angular实现模版驱动表单的自定义校验功能(密码确认为例)
May 17 Javascript
Iview Table组件中各种组件扩展的使用
Oct 20 Javascript
js 解析 JSON 数据简单示例
Apr 21 Javascript
js 图片懒加载的实现
Oct 21 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生成网页快照 不用COM不用扩展.
2010/02/11 PHP
PHP数据库调用类调用实例(详细注释)
2012/07/12 PHP
codeigniter框架The URI you submitted has disallowed characters错误解决方法
2014/05/06 PHP
PHP实现正则表达式分组捕获操作示例
2018/02/03 PHP
javascript 处理事件绑定的一些兼容写法
2009/12/24 Javascript
js实现图片放大和拖拽特效代码分享
2015/09/05 Javascript
window.open不被拦截的简单实现代码(推荐)
2016/08/04 Javascript
AngularJS表格详解及示例代码
2016/08/17 Javascript
JS中用childNodes获取子元素换行会产生一个子元素
2016/12/08 Javascript
Vue.js仿Metronic高级表格(二)数据渲染
2017/04/19 Javascript
AngularJs ng-change事件/指令的用法小结
2017/11/01 Javascript
对Angular中单向数据流的深入理解
2018/03/31 Javascript
React Native日期时间选择组件的示例代码
2018/04/27 Javascript
vue.js基于v-for实现批量渲染 Json数组对象列表数据示例
2019/08/03 Javascript
浅谈vue项目用到的mock数据接口的两种方式
2019/10/09 Javascript
vue 项目引入echarts 添加点击事件操作
2020/09/09 Javascript
vue实现简单全选和反选功能
2020/09/15 Javascript
[03:06]2018年度CS GO最具人气解说-完美盛典
2018/12/16 DOTA
python解析文件示例
2014/01/23 Python
python实现查找excel里某一列重复数据并且剔除后打印的方法
2015/05/26 Python
Python实现的最近最少使用算法
2015/07/10 Python
Python 实现文件的全备份和差异备份详解
2016/12/27 Python
详解Python里使用正则表达式的ASCII模式
2017/11/02 Python
用Python将一个列表分割成小列表的实例讲解
2018/07/02 Python
python、PyTorch图像读取与numpy转换实例
2020/01/13 Python
Python MOCK SERVER moco模拟接口测试过程解析
2020/04/13 Python
CSS3盒子模型详解
2013/04/24 HTML / CSS
基于zepto的插件之移动端无缝向上滚动并上下触摸滑动实例代码
2016/12/20 HTML / CSS
什么是反射?如何实现反射?
2016/07/25 面试题
质检部部长职责
2013/12/16 职场文书
《问银河》教学反思
2014/02/19 职场文书
向领导表决心的话
2014/03/11 职场文书
文明班集体申报材料
2014/05/23 职场文书
行政处罚事先告知书
2015/07/01 职场文书
女性健康知识讲座主持词
2015/07/04 职场文书
ubuntu下常用apt命令介绍
2022/06/05 Servers