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.小项目之登录注册验证
简介 本次项目登录注册验证是对之前学习知识点的加深学习,这次项目的练习的知识点有函数.判断语句.循环语句.文件操作等. 项目流程 运行代码之后,输出登录或者注册选项. 当选择登录之后,输入用户名密码, ...
随机推荐
- Rails 和 Django 的深度技术对比
我想以一个免责声明来开始下面的内容.我使用 Django开发网站已经有三年了,众所周知,我喜欢Django.我已经写了一个开源的应用程序( app),并且我已经将补丁发送到了Django.然而,我以尽 ...
- npm 升级
当我们运行某个项目是 会提示 > my-first-vue-project@1.0.0 dev C:\Users\ASUS\my-project > node build/dev-serv ...
- 现代C++学习笔记之二入门篇2,数据转换
static_cast: 这种强制转换只会在编译时检查. 如果编译器检测到您尝试强制转换完全不兼容的类型,则static_cast会返回错误. 您还可以使用它在基类指针和派生类指针之间强制转换, ...
- Which Uri Encoding method should i use in C#/.net?
June 19, 2015 This too is one of the boring "factual" posts. Sorry Lachlan. I never know w ...
- eWebEditor9.x整合教程-Xproer.WordPaster
版权所有 2009-2017 荆门泽优软件有限公司 保留所有权利 官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webplug/wordpa ...
- 第07章-Spring MVC 的高级技术
Spring MVC 的高级技术 1. Spring MVC配置的替代方案 1.1 自定义DispatcherServlet配置 AbstractAnnotationConfigDispatcherS ...
- Android内置和外置SD卡的位置获取
public class StorageUtils { private static String TAG="123"; // 获取主存储卡路径 内置内存卡路径 public st ...
- 【转】微信中MMAlert(半透明底部弹出菜单)的使用介绍
原文地址:http://blog.csdn.net/singwhatiwanna/article/details/8892930 果大家时常用过微信或者用过iphone,就会发现有种从底部弹出的半透明 ...
- Sharepoint2013搜索学习笔记之搜索构架简单概述(一)
Sharepoint搜索引擎主要由6种组件构成,他们分别是爬网组件,内容处理组件,分析处理组件,索引组件,查询处理组件,搜索管理组件.可以将这6种组件分别部署到Sharepoint场内的多个服务器上, ...
- Eclipse平台下配置Go语言开发环境(Win7)
<Go语言编程>中写到:“从功能和易用性等方面考虑, Eclipse+GoEclipse.LiteIDE这两个环境在所有IDE里面是表现最好的”,所以笔者打算采用Eclipse+GoEcl ...