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. Rails 和 Django 的深度技术对比

    我想以一个免责声明来开始下面的内容.我使用 Django开发网站已经有三年了,众所周知,我喜欢Django.我已经写了一个开源的应用程序( app),并且我已经将补丁发送到了Django.然而,我以尽 ...

  2. npm 升级

    当我们运行某个项目是 会提示 > my-first-vue-project@1.0.0 dev C:\Users\ASUS\my-project > node build/dev-serv ...

  3. 现代C++学习笔记之二入门篇2,数据转换

    static_cast:    这种强制转换只会在编译时检查. 如果编译器检测到您尝试强制转换完全不兼容的类型,则static_cast会返回错误. 您还可以使用它在基类指针和派生类指针之间强制转换, ...

  4. 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 ...

  5. eWebEditor9.x整合教程-Xproer.WordPaster

    版权所有 2009-2017 荆门泽优软件有限公司 保留所有权利 官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webplug/wordpa ...

  6. 第07章-Spring MVC 的高级技术

    Spring MVC 的高级技术 1. Spring MVC配置的替代方案 1.1 自定义DispatcherServlet配置 AbstractAnnotationConfigDispatcherS ...

  7. Android内置和外置SD卡的位置获取

    public class StorageUtils { private static String TAG="123"; // 获取主存储卡路径 内置内存卡路径 public st ...

  8. 【转】微信中MMAlert(半透明底部弹出菜单)的使用介绍

    原文地址:http://blog.csdn.net/singwhatiwanna/article/details/8892930 果大家时常用过微信或者用过iphone,就会发现有种从底部弹出的半透明 ...

  9. Sharepoint2013搜索学习笔记之搜索构架简单概述(一)

    Sharepoint搜索引擎主要由6种组件构成,他们分别是爬网组件,内容处理组件,分析处理组件,索引组件,查询处理组件,搜索管理组件.可以将这6种组件分别部署到Sharepoint场内的多个服务器上, ...

  10. Eclipse平台下配置Go语言开发环境(Win7)

    <Go语言编程>中写到:“从功能和易用性等方面考虑, Eclipse+GoEclipse.LiteIDE这两个环境在所有IDE里面是表现最好的”,所以笔者打算采用Eclipse+GoEcl ...