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 相关文章推荐
深入理解JavaScript 闭包究竟是什么
Apr 12 Javascript
解决javascript:window.close()在chrome,Firefox下失效的问题
May 07 Javascript
json格式的时间显示为正常年月日的方法
Sep 08 Javascript
JS获取CSS样式(style/getComputedStyle/currentStyle)
Jan 19 Javascript
Ubuntu系统下Angularjs开发环境安装
Sep 01 Javascript
node.js 抓取代理ip实例代码
Apr 30 Javascript
Mac中安装nvm的教程分享
Dec 11 Javascript
Vue2.x中利用@font-size引入字体图标报错的解决方法
Sep 28 Javascript
在 Angular-cli 中使用 simple-mock 实现前端开发 API Mock 接口数据模拟功能的方法
Nov 28 Javascript
在Web关闭页面时发送Ajax请求的实现方法
Mar 07 Javascript
vue实现购物车小案例
Sep 27 Javascript
Vue的data、computed、watch源码浅谈
Apr 04 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的SQL注入实现(测试代码安全不错)
2011/02/27 PHP
PHP输出图像imagegif、imagejpeg与imagepng函数用法分析
2016/11/14 PHP
ff下JQuery无法监听input的keyup事件的解决方法
2013/12/12 Javascript
jquery教程ajax请求json数据示例
2014/01/13 Javascript
本人自用的global.js库源码分享
2015/02/28 Javascript
jquery超简单实现手风琴效果的方法
2015/06/05 Javascript
js+canvas简单绘制圆圈的方法
2016/01/28 Javascript
Vue.js每天必学之表单控件绑定
2016/09/05 Javascript
React教程之Props验证的具体用法(Props Validation)
2017/09/04 Javascript
Javascript中从学习bind到实现bind的过程
2018/01/05 Javascript
简述vue状态管理模式之vuex
2018/08/29 Javascript
基于vue2.0的活动倒计时组件countdown(附源码下载)
2018/10/09 Javascript
vue鼠标悬停事件实例详解
2019/04/01 Javascript
今天,小程序正式支持 SVG
2019/04/20 Javascript
微信小程序实现form表单本地储存数据
2019/06/27 Javascript
js微信分享接口调用详解
2019/07/23 Javascript
Vue组件模板的几种书写形式(3种)
2020/02/19 Javascript
iview实现图片上传功能
2020/06/29 Javascript
如何使用JS console.log()技巧提高工作效率
2020/10/14 Javascript
Python 中迭代器与生成器实例详解
2017/03/29 Python
python实现简易云音乐播放器
2018/01/04 Python
对python中矩阵相加函数sum()的使用详解
2019/01/28 Python
python使用for...else跳出双层嵌套循环的方法实例
2020/05/17 Python
学python需要去培训机构吗
2020/07/01 Python
HTML5本地存储之Web Storage详解
2016/07/04 HTML / CSS
意大利在线购买隐形眼镜网站:VisionDirect.it
2019/03/18 全球购物
Linux面试题LINUX系统类
2014/11/19 面试题
研究生自荐信
2013/10/09 职场文书
大学生职业生涯规划书模版
2013/12/30 职场文书
四年级科学教学反思
2014/02/10 职场文书
文明寝室申报材料
2014/05/12 职场文书
2014年科技工作总结
2014/11/26 职场文书
爱国电影观后感
2015/06/19 职场文书
欠款证明
2015/06/24 职场文书
公司备用金管理制度
2015/08/04 职场文书
感谢信的技巧及范例
2019/05/15 职场文书