图一为拖拽前效果,图二为拖拽后效果

一、新建文件JcRange.vue,代码如下:

  1、模板代码:

 <template>
<div class="jc-component__range">
<div class="jc-range" :class="rangeStatus?'success':''" >
<i @mousedown="rangeMove" :class="rangeStatus?successIcon:startIcon"></i>
{{rangeStatus?successText:startText}}
</div>
</div>
</template>

  2、js代码

<script>
export default {
props: {
// 成功之后的函数
successFun: {
type: Function
},
//成功图标
successIcon: {
type: String,
default: 'el-icon-success'
},
//成功文字
successText: {
type: String,
default: '验证成功'
},
//开始的图标
startIcon: {
type: String,
default: 'el-icon-d-arrow-right'
},
//开始的文字
startText: {
type: String,
default: '请拖住滑块,拖动到最右边'
},
//失败之后的函数
errorFun: {
type: Function
},
//或者用值来进行监听
status: {
type: String
}
},
data(){
return {
disX : 0,
rangeStatus: false
}
},
methods:{
//滑块移动
rangeMove(e){
let ele = e.target;
let startX = e.clientX;
let eleWidth = ele.offsetWidth;
let parentWidth = ele.parentElement.offsetWidth;
let MaxX = parentWidth - eleWidth;
if(this.rangeStatus){//不运行
return false;
}
document.onmousemove = (e) => {
let endX = e.clientX;
this.disX = endX - startX;
if(this.disX<=0){
this.disX = 0;
}
if(this.disX>=MaxX-eleWidth){//减去滑块的宽度,体验效果更好
this.disX = MaxX;
}
ele.style.transition = '.1s all';
ele.style.transform = 'translateX('+this.disX+'px)';
e.preventDefault();
}
document.onmouseup = ()=> {
if(this.disX !== MaxX){
ele.style.transition = '.5s all';
ele.style.transform = 'translateX(0)';
//执行成功的函数
this.errorFun && this.errorFun();
}else{
this.rangeStatus = true;
if(this.status){
this.$parent[this.status] = true;
}
//执行成功的函数
this.successFun && this.successFun();
}
document.onmousemove = null;
document.onmouseup = null;
}
}
}
};
</script>

  3、css 代码(此处使用了sass)

<style lang="scss" scoped>
@mixin jc-flex{
display: flex;
justify-content: center;
align-items: center;
}
.jc-component__range{
.jc-range{
background-color: #e9e9e9;
position: relative;
transition: 1s all;
user-select: none;
color: #585858;
@include jc-flex;
height: 50px; /*no*/
&.success{
background-color: #3bc923;
color: #fff;
i{
color: #3bc923;
}
}
i{
position: absolute;
left:;
width: 50px;/*no*/
height: 100%;
color: #3fcd26;
background-color: #fff;
border: 1px solid #d8d8d8;
cursor: pointer;
font-size: 24px;
@include jc-flex;
}
}
}
</style>

二、引用方法(加上验证就可以了)

<JcRange  status="ruleForm.status":successFun="onMpanelSuccess":errorFun="onMpanelError"></JcRange>
import JcRange from "@/components/common/JcRange.vue";
 status: [{ validator: checkStatus, trigger: "change" }]

var checkStatus = (rule, value, callback) => {
console.log(value);
if (!value) {
return callback(new Error("请拖动滑块完成验证"));
} else {
callback();
}
};

最新文章

  1. 微软unity 注入mvc
  2. Service and controller in angularJs
  3. 为.NET搭建Linux的开发环境,鄙视那些将简单事情复杂化的人
  4. 在mac下使用brew和brew cask轻松实现软件安装
  5. 为DELL inspiron 14R安装CentOS X64 6.4
  6. 第五十三篇、OC利用AFN上传视频到服务器
  7. TDirectory.Copy复制文件
  8. 集合源码(一)之hashMap、ArrayList
  9. luogu 1291 概率期望递推
  10. Android 获得手机屏幕真实的宽高
  11. Go Example--通道非阻塞
  12. 激活 pycharm
  13. Struts框架之结果页面的跳转
  14. 推荐:Asp.Net MVC 多语言(html+js共用一套资源文件)
  15. 一台机子同时启动两个相同版本的tomcat
  16. Centos下添加PHP对MSSQL的支持
  17. Flash OS images to SD cards &amp; USB drives &amp; TF cards safely and easily using etcher
  18. test20180922 古代龙人的谜题
  19. vue小常识小注意
  20. Centos 7 安装Zabbix

热门文章

  1. RESTORE FILELISTONLY FROM DISK =&#39;D:\DataSQL\BakFile\pubs.bak&#39; _ 数据库安装工具_连载_4
  2. 一文读懂Redis的四种模式,单机、主从、哨兵、集群
  3. 【Azure SQL】数据库性能分析
  4. [搬运]Intellij IDEA 汉化
  5. Optional 容器类
  6. Python 为什么不支持 i++ 自增语法,不提供 ++ 操作符?
  7. Hystrix Stream的监控页面不显示内容
  8. JAVA SOCKET 通信总结 BIO、NIO、AIO ( NIO 2) 的区别和总结
  9. 用Map+函数式接口来实现策略模式
  10. SQL中的ON DUPLICATE KEY UPDATE使用详解