es6 封装一个登录注册的验证滑块
1,需求分析
滑块从左滑到右,开始滑、结束滑两种状态。两种状态显示的内容和样式的不同。

这是淘宝注册验证滑块的示例图
2,代码分析
const render = Symbol('render')
const event = Symbol('event')
class Slider {
constructor (options) {
this.options = options
if (!options.container) {
throw new Error('slider需要一个提供一个容器配置')
}
this[render](options)
this[event](options)
}
}
这里定义了一个Slider类,用symbol定义了render 渲染和event事件的初始化函数
在渲染函数中,我们需要将滑块的模板直接放到页面上,所以可以这样做:
[render] (options) {
const unsuccessTip = options.unsuccessTip || '请拖动滑块到最右边'
const template = `
<div class="sliderBox" id="box"> /
<div class="slide-part" id="slide-part"></div>
<div class="slide-btn" id="slide-btn">>></div>
<span class="notice" id="notice">${unsuccessTip}</span>
</div>`
options.container.innerHTML = template
}
.sliderBox{
width:350px;
height:40px;
border:1px solid #aaa;
position:relative;
background:#E7E7E7;
}
.slide-btn{
position:absolute;
height:40px;
width:40px;
border-right:1px solid #aaa;
background:rgba(255,255,255,.9);
top:;
left:;
z-index:;
cursor: default;
line-height:40px;
text-align: center;
color:#aaaaaa;
user-select:none;
}
.notice {
position:absolute;
top:50%;
left:50%;
transform:translate(-50%,-50%);
z-index:;
display: inline-block;
font-size:14px;
text-align: center;
user-select:none;
}
.slide-part{
width:;
height:100%;
position:absolute;
top:;
left:;
background:#23dbd1;
z-index:;
}
因为这里的模板和样式都是我提前写好的,所以这里直接用就可以了,写的蛮简单的,有需求的同学可以根据自己的需求修改。
模板和样式写完了 ,我们这里可以先new一下,看看初始效果。
<div id="container"></div>
<script>
......Slider类
const container = document.getElementById('container')
let slider = new Slider({
container: container
})
</script>

页面的渲染完成了,这时候该处理事件的绑定了, 这里为滑动块绑定mousedown,为window绑定mousemove和mouseup事件。
function $ (el) {
return document.getElementById(el)
}
[event] (options) {
const box = $('box')
const slidePart = $('slide-part')
const btn = $('slide-btn')
const notice = $('notice')
const reset = () => { //如果没有滑到底,那么重新回到头部
this.start = false
this.end =false
this.startX = 0
this.startY = 0
this.movedSite = []
btn.style.left = 0
slidePart.style.width = 0
}
const mouseDown = (e) => { //mousedown 的事件函数
this.start = true
this.startX = e.clientX //将鼠标点下的时候的位置记录下来
this.startY = e.clientY
this.movedSite = [] //鼠标移动的所有距离的坐标,要传给后台 ,让后台判断是否是活人拖动的....
}
const mouseMove = (e) => { //mousemove的事件函数
if (this.start) {
let movedX = e.clientX - this.startX //鼠标移动的横坐标距离
let movedY = e.clientY - this.startY //鼠标移动的纵坐标距离
this.movedSite.push(movedX + ',' + movedY) //将距离push到 上面定义的数组中,
if (movedX < 0) { //滑块不能向左移动
movedX = 0
}
btn.style.left = movedX + 'px' //滑块的left值为已经移动的X距离
slidePart.style.width = movedX + 'px' // 滑过区域的宽度为已经移动的x距离
let maxWidth = parseInt(window.getComputedStyle(box).width) - parseInt(window.getComputedStyle(btn).width) //滑块能滑的最大距离为外层box的距离减去 滑块的宽度。
if (movedX >= maxWidth) { //如果滑过的距离大于等于上面的最大距离,说明已经滑到头了
this.start = false
this.end = true
btn.style.left = maxWidth + 'px'
slidePart.style.width = maxWidth + 'px'
btn.innerHTML = '√'
btn.style.color = '#23dbd1'
options.success && options.success(notice, this.movedSite) //如果options里面有成功的回调函数 则调用,参数为显示文字的dom和坐标距离的数组,
}
}
}
const mouseUp = (e) => { //mouseup的事件函数
if (!this.end) { //如果没有滑到头,那么就从新reset,从头再来
reset()
} else { //滑到头的话 就将这三个事件移除掉
btn.removeEventListener('mousedown', mouseDown)
window.removeEventListener('mousemove', mouseMove)
window.removeEventListener('mouseup', mouseUp)
}
}
btn.addEventListener('mousedown', mouseDown) //绑定监听事件
window.addEventListener('mousemove', mouseMove)
window.addEventListener('mouseup', mouseUp)
}
我们还需要对外提供一个重置的接口:
reset () {
this[render](this.options)
this[event](this.options)
this.end =false
}
这样,一个滑动验证的类就完成了。全部代码如下:
<style>
#box{
margin: 300px auto;
}
.sliderBox{
width:350px;
height:40px;
border:1px solid #aaa;
position:relative;
background:#E7E7E7;
}
.slide-btn{
position:absolute;
height:40px;
width:40px;
border-right:1px solid #aaa;
background:rgba(255,255,255,.9);
top:0;
left:0;
z-index:5;
cursor: default;
line-height:40px;
text-align: center;
color:#aaaaaa;
user-select:none;
}
.notice {
position:absolute;
top:50%;
left:50%;
transform:translate(-50%,-50%);
z-index:2;
display: inline-block;
font-size:14px;
text-align: center;
user-select:none;
}
.slide-part{
width:0;
height:100%;
position:absolute;
top:0;
left:0;
background:#23dbd1;
z-index:1;
}
</style> <body> <div id="container"> </div> <script>
function $(dom) {
return document.getElementById(dom)
} const event = Symbol('event')
const render = Symbol('render') class Slider {
constructor(options) {
this.options = options
if (!options.container) {
throw new Error ('slide必须传入container配置')
} else {
this[render](options)
this[event](options)
}
} [render] (options) {
const unsuccessTip = options.unsuccessTip || '请拖动滑块到最右边'
const template = `
<div class="sliderBox" id="box">
<div class="slide-part" id="slide-part"></div>
<div class="slide-btn" id="slide-btn">>></div>
<span class="notice" id="notice">${unsuccessTip}</span>
</div>`
options.container.innerHTML = template
} [event] (options) {
const box = $('box')
const slidePart = $('slide-part')
const btn = $('slide-btn')
const notice = $('notice')
const reset = () => {
this.start = false
this.end =false
this.startX = 0
this.startY = 0
this.movedSite = []
btn.style.left = 0
slidePart.style.width = 0
}
const mouseDown = (e) => {
this.start = true
this.startX = e.clientX
this.startY = e.clientY
this.movedSite = []
}
const mouseMove = (e) => {
if (this.start) {
let movedX = e.clientX - this.startX
let movedY = e.clientY - this.startY
this.movedSite.push(movedX + ',' + movedY)
if (movedX < 0) {
movedX = 0
}
btn.style.left = movedX + 'px'
slidePart.style.width = movedX + 'px'
let maxWidth = parseInt(window.getComputedStyle(box).width) - parseInt(window.getComputedStyle(btn).width)
if (movedX >= maxWidth) {
this.start = false
this.end = true
btn.style.left = maxWidth + 'px'
slidePart.style.width = maxWidth + 'px'
btn.innerHTML = '√'
btn.style.color = '#23dbd1'
options.success && options.success(notice, this.movedSite)
}
}
}
const mouseUp = (e) => {
if (!this.end) {
reset()
} else {
btn.removeEventListener('mousedown', mouseDown)
window.removeEventListener('mousemove', mouseMove)
window.removeEventListener('mouseup', mouseUp)
}
}
btn.addEventListener('mousedown', mouseDown)
window.addEventListener('mousemove', mouseMove)
window.addEventListener('mouseup', mouseUp) } reset () {
this[render](this.options)
this[event](this.options)
this.end =false
}
} const container = $('container')
let slide = new Slider({
container: container,
success: (notice, arr) => {
console.log(notice)
console.log(arr)
}
})
</script> </body>
这样我们通过success函数就可以获取到 显示文字的dom元素和滑动距离的数组 。 将滑动距离的数组传给后台,判断是否为活人滑动的,将结果显示在显示文字的dom元素里面,就大功告成了。
需要重置滑动验证的话,可以直接调用 slide.reset()
es6 封装一个登录注册的验证滑块的更多相关文章
- es6 封装一个基础的表单验证
1, 需求分析 设计一个通用的表单验证,如果后期表单中添加了更多的需求,不需要更改之前的代码逻辑,最好不要改之前的代码,需要加什么直接加就好了. 2,代码分析 此表单验证最好返回一个函数,在api设计 ...
- 使用Boostrap框架写一个登录\注册界面
Bootstrap是一个Web前端开发框架,使用它提供的css.js文件可以简单.方便地美化HTML控件.一般情况下,对控件的美化需要我们自己编写css代码,并通过标签选择器.类选择器.ID选择器为指 ...
- iOS开发一个用户登录注册模块需要解决的坑
最近和另外一位同事负责公司登录和用户中心模块的开发工作,开发周期计划两周,减去和产品和接口的协调时间,再减去由于原型图和接口的问题,导致强迫症纠结症状高发,情绪不稳定耗费的时间,能在两周基本完成也算是 ...
- 使用Struts2搭建登录注册示例
使用Struts2来搭建mvc网站框架还是比较容易的,Struts2提供了各项辅助功能,保证了web开发的快速方便.下面使用struts2来搭建一个登录注册示例. 0 项目结构截图 1 搭建Strut ...
- 基于 Vue + Koa2 + MongoDB + Redis 实现一个完整的登录注册
项目地址:https://github.com/caochangkui/vue-element-responsive-demo/tree/login-register 通过 vue-cli3.0 + ...
- 7. Swift 基于Xmpp和openfire实现一个简单的登录注册
1. 基本步骤:首先导入Xmpp框架,配置环境 ->由于我们使用的是OC的Xmpp框架,再进行Swift开发时需要进行桥接. 具体方法就是创建一个基于c的.h的头文件,然后将我们需要编译OC的语 ...
- 用vue开发一个app(4,一个久等了的文章)H5直播平台登录注册(1)
我上一篇关于vue的文章和这一篇时间隔了有点久了.最近终于写完了. 因为我一直想写个有点实绩的东西,而不是随便写一个教程一样东西.结合最近在项目中学到的经验和我的一点创意. 首先介绍下这是个什么! H ...
- Android高效率编码-第三方SDK详解系列(二)——Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能
Android高效率编码-第三方SDK详解系列(二)--Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能 我的本意是第二篇写Mob的shareSD ...
- Python学习:8.小项目之登录注册验证
简介 本次项目登录注册验证是对之前学习知识点的加深学习,这次项目的练习的知识点有函数.判断语句.循环语句.文件操作等. 项目流程 运行代码之后,输出登录或者注册选项. 当选择登录之后,输入用户名密码, ...
随机推荐
- keystone部署及操作
目录 一 版本信息 二 部署keystone 三 keystone操作 四 验证 五 创建脚本 六 keystone使用套路总结 一.版本信息 官网http://docs.openstac ...
- c语言实践 打印数字三角形
效果如下图: 思路就是外层循环控制要打印的行数,里层循环控制每行打印的数字个数. int val = 65; for (int i = 0; i < 6; i++) { for (int j = ...
- Linux xclip命令
一.简介 xclip命令建立了终端和剪切板之间通道,可以用于以命令的方式将终端输出或文件的内容保存到剪切板中,也可以用于将剪切板的内容输出到终端或文件中. 在 X 系统里面,从一个窗口复制一段文字到另 ...
- jq获取table总行数
var rows = $('table').find("tr").length;
- Django框架 之 form组件
Django框架 之 form组件 浏览目录 Form介绍 普通的登录 使用form组件 Form详情 常用字段 校验 进阶 使用Django Form流程 一.Form介绍 我们之前在HTML页面中 ...
- rpmbuild SPEC语法
rpmbuild SPEC语法 摘自:http://bbs.chinaunix.net/thread-4179207-1-1.html spec文件写作规范 2008-09-28 11:52:17 分 ...
- Vim编码知识,乱码问题
原文:http://demi-panda.com/2012/12/26/vim-encoding/ 在vim的初始学习阶段,乱码经常是困扰新手的一个比较烦躁的问题,本文试图阐述Vim的编码知识,及设置 ...
- Android Bundle传递数据
1.传递普通数据 Intent intent=new Intent(MainActivity.this,TwoActivity.class); Bundle bundle=new Bundle(); ...
- android 优秀图表库之MPAndroidChart
MPAndroidChart 1.在项目当中很多时候要对数据进行分析就要用到图表,在gitHub上有很多优秀的图表开源库,这里就简单介绍一下MPAndroidChart. 他可以实现图表的拖动,3D, ...
- C++初始化,之不明白篇 cout<<x<<endl 与 cout<<"x = "<<cout<<x<<endl的输出的值会不一样
代码如下 #include <iostream> using namespace std; class point { public : int x; int y; ...