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 封装一个登录注册的验证滑块的更多相关文章

  1. es6 封装一个基础的表单验证

    1, 需求分析 设计一个通用的表单验证,如果后期表单中添加了更多的需求,不需要更改之前的代码逻辑,最好不要改之前的代码,需要加什么直接加就好了. 2,代码分析 此表单验证最好返回一个函数,在api设计 ...

  2. 使用Boostrap框架写一个登录\注册界面

    Bootstrap是一个Web前端开发框架,使用它提供的css.js文件可以简单.方便地美化HTML控件.一般情况下,对控件的美化需要我们自己编写css代码,并通过标签选择器.类选择器.ID选择器为指 ...

  3. iOS开发一个用户登录注册模块需要解决的坑

    最近和另外一位同事负责公司登录和用户中心模块的开发工作,开发周期计划两周,减去和产品和接口的协调时间,再减去由于原型图和接口的问题,导致强迫症纠结症状高发,情绪不稳定耗费的时间,能在两周基本完成也算是 ...

  4. 使用Struts2搭建登录注册示例

    使用Struts2来搭建mvc网站框架还是比较容易的,Struts2提供了各项辅助功能,保证了web开发的快速方便.下面使用struts2来搭建一个登录注册示例. 0 项目结构截图 1 搭建Strut ...

  5. 基于 Vue + Koa2 + MongoDB + Redis 实现一个完整的登录注册

    项目地址:https://github.com/caochangkui/vue-element-responsive-demo/tree/login-register 通过 vue-cli3.0 + ...

  6. 7. Swift 基于Xmpp和openfire实现一个简单的登录注册

    1. 基本步骤:首先导入Xmpp框架,配置环境 ->由于我们使用的是OC的Xmpp框架,再进行Swift开发时需要进行桥接. 具体方法就是创建一个基于c的.h的头文件,然后将我们需要编译OC的语 ...

  7. 用vue开发一个app(4,一个久等了的文章)H5直播平台登录注册(1)

    我上一篇关于vue的文章和这一篇时间隔了有点久了.最近终于写完了. 因为我一直想写个有点实绩的东西,而不是随便写一个教程一样东西.结合最近在项目中学到的经验和我的一点创意. 首先介绍下这是个什么! H ...

  8. Android高效率编码-第三方SDK详解系列(二)——Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能

    Android高效率编码-第三方SDK详解系列(二)--Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能 我的本意是第二篇写Mob的shareSD ...

  9. Python学习:8.小项目之登录注册验证

    简介 本次项目登录注册验证是对之前学习知识点的加深学习,这次项目的练习的知识点有函数.判断语句.循环语句.文件操作等. 项目流程 运行代码之后,输出登录或者注册选项. 当选择登录之后,输入用户名密码, ...

随机推荐

  1. “Device eth0 has different MAC address than expected, ignoring.”问题

    配IP后进行激活的时候提示如下错误:("Device eth0 has different MAC address than expected, ignoring.") 百度了下, ...

  2. PHP数组的详细解读

    数组的定义 数组的本质是管理和操作一组变量,数组中可以存储任意长度的数据,也可以存储任意类型的数据.数组中的单元称为元素,每个元素包括下标(键)和值,访问元素的时候,是通过下标来访问,包括一维数组,二 ...

  3. 运用alarm系统调用检测网络是否断开

    比如对于一个Server/Client程序,Client会每隔一定时间(比如TIME_OUT_CLIENT)会向Server发送“CheckConnect”信息,Server收到这个信息会调用回调函数 ...

  4. python 添加日期

    import pandas as pd applydata['apply_time'] = pd.to_datetime(applydata.apply_time)# applydata.apply_ ...

  5. Luogu 4869 albus就是要第一个出场

    BZOJ 2844 被NOIP模拟赛题弄自闭了QuQ. 因为本题要求异或,所以自然地构造出线性基,假设本题中给出的数有$n$个,而我们构造出的线性基大小为$m$,那么每一个可以异或出来的数相当于出现了 ...

  6. 关于Rest Framework中View、APIView与GenericAPIView的对比分析

    关于Rest Framework中View.APIView与GenericAPIView的对比分析  https://blog.csdn.net/odyssues_lee/article/detail ...

  7. Linux 命令之chcon

    chcon命令:修改对象(文件)的安全上下文.比如:用户:角色:类型:安全级别.主要用在selinux中用来更改安全上下文.命令格式: Chcon [OPTIONS…] CONTEXT FILES…. ...

  8. 关于Flag 老是忘掉的东西

    OrderState enums = OrderState.CustomerCanceled | OrderState.CustomerOrdered | OrderState.CustomerQue ...

  9. 分别实现数组所有元素相加、相乘、相与——FP 风格

    var ops = { "plus": (x,y)=>x+y, "mul" : (x,y)=>x*y, "and" : (x,y ...

  10. day08.2-ssh远程连接服务

    在Linux环境中,部署一个服务的一般步骤: a). 准备环境,包括 关闭防火墙:service   iptables   stop(或chkconfig   iptables   off) 关闭se ...