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.小项目之登录注册验证
简介 本次项目登录注册验证是对之前学习知识点的加深学习,这次项目的练习的知识点有函数.判断语句.循环语句.文件操作等. 项目流程 运行代码之后,输出登录或者注册选项. 当选择登录之后,输入用户名密码, ...
随机推荐
- POI 生成exel报表
去官网下载相关jar包 http://poi.apache.org/ package poi.zr.com; import java.io.File; import java.io.FileNot ...
- MySql 获取服务提供的sakila数据库(Example Databases)
关于这个数据库也就是样例数据库,数据库,数据库,最可怕的就是没有数据了,对吧?没有数据你学个什么呀. 可是,没有数据,咱会自己insert,那只能适用于初学者.对于数据库的优化方面的学习,还是有大数据 ...
- Android NDK打印log到logcat的方法
头文件 : <android/log.h> 函数: __android_log_print(ANDROID_LOG_XXX,LOG_TAG,content) 第一个参数是Log级别,比如: ...
- JAVA中mark()和reset()用法
根据JAVA官方文档的描述,mark(int readlimit)方法表示,标记当前位置,并保证在mark以后最多可以读取readlimit字节数据,mark标记仍有效.如果在mark后读取超过rea ...
- 编写高质量代码改善C#程序的157个建议——建议57:实现ISerializable的子类型应负责父类的序列化
建议57:实现ISerializable的子类型应负责父类的序列化 我们将要实现的继承自ISerializable的类型Employee有一个父类Person,假设Person没有实现序列化,而现在子 ...
- 基于HTML5 Ajax文件上传进度条如何实现(jquery版本)
<!DOCTYPE html> <html> <head> <title>html5_2.html</title> <meta htt ...
- MongoDB整理笔记のSharding分片
这是一种将海量的数据水平扩展的数据库集群系统,数据分表存储在sharding 的各个节点上,使用者通过简单的配置就可以很方便地构建一个分布式MongoDB 集群.MongoDB 的数据分块称为 chu ...
- 以太坊系列之十六:golang进行智能合约开发
以太坊系列之十六: 使用golang与智能合约进行交互 以太坊系列之十六: 使用golang与智能合约进行交互 此例子的目录结构 token contract 智能合约的golang wrapper ...
- RealSense R400系列深度相机的图像获取保存和格式转换
关于RealSense的基础使用的博文用的库有点混杂,挺多博文都是早期maneger的那个库,对那个不是很了解,主要记录一下使用最新的函数库的基础使用. 相机型号:RealSense R435 使用函 ...
- iOS APP打包上传到APPstore的最新步骤
一.前言: 作为一名iOS开发者,把辛辛苦苦开发出来的App上传到App Store是件必要的事.但是很多人还是不知道该怎么上传到App Store上 下面就来详细讲解一下具体流程步骤. 二.准备: ...