vue开发拖拽进度条滑动组件


Posted in Javascript onSeptember 21, 2019

分享一个最近写的进度条滑动组件,以前都是用jq写,学会了vue,尝试着拿vue来写觉得非常简单,代码复用性很强!

效果图如下:

vue开发拖拽进度条滑动组件

vue开发拖拽进度条滑动组件

调用组件如下:

<slider :min=0 :max=100 v-model = "per"></slider>
<template>
 <div class="slider" ref="slider">
 <div class="process" :style="{width}"></div>
 <div class="thunk" ref="trunk" :style="{left}">
  <div class="block"></div>
  <div class="tips">
  <span>{{scale*100}}</span>
  <i class="fas fa-caret-down" ></i>
 </div>
 </div>
 </div>
</template>
<script>
 /*
 * min 进度条最小值
 * max 进度条最大值
 * v-model 对当前值进行双向绑定实时显示拖拽进度
 * */
 export default{
 props:['min','max','value'],
 data(){
 return{
  slider:null, //滚动条DOM元素
  thunk:null,  //拖拽DOM元素
  per:this.value, //当前值
 }
 },
 //渲染到页面的时候
 mounted () {
 this.slider = this.$refs.slider;
 this.thunk = this.$refs.trunk;
 var _this = this;
 this.thunk.onmousedown = function (e) {
  var width = parseInt(_this.width);
  var disX = e.clientX;
  document.onmousemove = function(e){
  // value, left, width
  // 当value变化的时候,会通过计算属性修改left,width

  // 拖拽的时候获取的新width
  var newWidth = e.clientX - disX + width;
  // 拖拽的时候得到新的百分比
  var scale = newWidth / _this.slider.offsetWidth;
  _this.per = Math.ceil((_this.max - _this.min) * scale + _this.min);
  _this.per = Math.max(_this.per,_this.min);
  _this.per = Math.min(_this.per,_this.max);
  }
  document.onmouseup = function(){
  document.onmousemove = document.onmouseup = null;
  }
  return false;
 }
 },
 computed:{
 // 设置一个百分比,提供计算slider进度宽度和trunk的left值
 // 对应公式为 当前值-最小值/最大值-最小值 = slider进度width / slider总width
 // trunk left = slider进度width + trunk宽度/2
 scale(){
  return (this.per - this.min) / (this.max - this.min);
 },
 width(){
  if(this.slider){
  return this.slider.offsetWidth * this.scale + 'px';
  }else{
  return 0 + 'px'
  }
 },
 left(){
  if(this.slider){
  return this.slider.offsetWidth * this.scale - this.thunk.offsetWidth/2 + 'px';
  }else{
  return 0 + 'px'
  }
 }
 },
 }
</script>
<style>
 .box{margin:100px auto 0;width:80%}
 .clear:after{content:'';display:block;clear:both}
 .slider{position:relative;margin:20px 0;width:400px;height:10px;background:#e4e7ed;border-radius:5px;cursor:pointer}
 .slider .process{position:absolute;left:0;top:0;width:112px;height:10px;border-radius:5px;background:#409eff}
 .slider .thunk{position:absolute;left:100px;top:-7px;width:20px;height:20px}
 .slider .block{width:20px;height:20px;border-radius:50%;border:2px solid #409eff;background:rgba(255,255,255,1);transition:.2s all}
 .slider .tips{position:absolute;left:-7px;bottom:30px;min-width:15px;text-align:center;padding:4px 8px;background:#000;border-radius:5px;height:24px;color:#fff}
 .slider .tips i{position:absolute;margin-left:-5px;left:50%;bottom:-9px;font-size:16px;color:#000}
 .slider .block:hover{transform:scale(1.1);opacity:.6}
</style>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js继承的实现代码
Aug 05 Javascript
js中将URL中的参数提取出来作为对象的实现代码
Aug 16 Javascript
精心挑选的15款优秀jQuery 本特效插件和教程
Aug 06 Javascript
使用GruntJS构建Web程序之构建篇
Jun 04 Javascript
js匿名函数的调用示例(形式多种多样)
Aug 20 Javascript
jQuery学习笔记之基础中的基础
Jan 19 Javascript
js简单判断flash是否加载完成的方法
Jun 21 Javascript
vue.js组件vue-waterfall-easy实现瀑布流效果
Aug 22 Javascript
浅谈AngularJS中$http服务的简单用法
May 15 Javascript
Vue.js 时间转换代码及时间戳转时间字符串
Oct 16 Javascript
layer.confirm点击第一个按钮关闭弹出框的方法
Sep 09 Javascript
vue中的.$mount('#app')手动挂载操作
Sep 02 Javascript
layui点击弹框页面 表单请求的方法
Sep 21 #Javascript
使用vue制作滑动标签
Sep 21 #Javascript
layui 数据表格+分页+搜索+checkbox+缓存选中项数据的方法
Sep 21 #Javascript
Vue插件之滑动验证码
Sep 21 #Javascript
Layui tree 下拉菜单树的实例代码
Sep 21 #Javascript
layui 图片上传+表单提交+ Spring MVC的实例
Sep 21 #Javascript
layui layer select 选择被遮挡的解决方法
Sep 21 #Javascript
You might like
用PHP进行MySQL删除记录操作代码
2008/06/07 PHP
php入门学习知识点一 PHP与MYSql连接与查询
2011/07/14 PHP
table标签的结构与合并单元格的实现方法
2013/07/24 PHP
PHP实现QQ快速登录的方法
2016/09/28 PHP
PHP编程获取图片的主色调的方法【基于Imagick扩展】
2017/08/02 PHP
浅析PHP中json_encode与json_decode的区别
2020/07/15 PHP
js加解密 脚本解密
2008/02/22 Javascript
jquery 锁定弹出层实现代码
2010/02/23 Javascript
js仿百度有啊通栏展示效果实现代码
2013/05/28 Javascript
javascript实现文字图片上下滚动的具体实例
2013/06/28 Javascript
php与js的区别是什么
2013/08/05 Javascript
jQuery的text()方法用法分析
2014/12/20 Javascript
javascript下拉列表中显示树形菜单的实现方法
2015/11/17 Javascript
jQuery.form插件的使用及跨域异步上传文件
2016/04/27 Javascript
AngularJS ng-style中使用filter
2016/09/21 Javascript
正则表达式替换html元素属性的方法
2016/11/26 Javascript
利用select实现年月日三级联动的日期选择效果【推荐】
2016/12/13 Javascript
bootstrap时间控件daterangepicker使用方法及各种小bug修复
2017/10/25 Javascript
JS实现压缩上传图片base64长度功能
2019/12/03 Javascript
vue实现移动端拖动排序
2020/08/21 Javascript
[47:04]EG vs RNG 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
[45:34]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第一场 12.18
2020/12/19 DOTA
简介Django框架中可使用的各类缓存
2015/07/23 Python
致Python初学者 Anaconda入门使用指南完整版
2018/04/05 Python
Python实现时钟显示效果思路详解
2018/04/11 Python
对tensorflow中的strides参数使用详解
2020/01/04 Python
下载与当前Chrome对应的chromedriver.exe(用于python+selenium)
2020/01/14 Python
python语言实现贪吃蛇游戏
2020/11/13 Python
Django URL参数Template反向解析
2020/11/24 Python
利用HTML5+CSS3实现3D转换效果实例详解
2017/05/02 HTML / CSS
校园报刊亭创业计划书
2014/01/02 职场文书
酒店销售主管岗位职责
2014/01/04 职场文书
高二历史教学反思
2014/01/25 职场文书
医院标语大全
2014/06/23 职场文书
2015年圣诞节活动总结
2015/03/24 职场文书
抢劫罪辩护词
2015/05/21 职场文书