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 判断字符串是否为数字的简单方法
Jul 25 Javascript
前端开发的开始---基于面向对象的Ajax类
Sep 17 Javascript
jQuery学习笔记[1] jQuery中的DOM操作
Dec 03 Javascript
jquery中push()的用法(数组添加元素)
Nov 25 Javascript
Vue.js绑定HTML class数组语法错误的原因分析
Oct 19 Javascript
js 中获取制定的cook信息实现方法
Nov 19 Javascript
详解react-router 4.0 下服务器如何配合BrowserRouter
Dec 29 Javascript
微信小程序组件传值图示过程详解
Jul 31 Javascript
vue 翻页组件vue-flip-page效果
Feb 05 Javascript
jQuery实现中奖播报功能(让文本滚动起来) 简单设置数值即可
Mar 20 jQuery
JavaScript JSON使用原理及注意事项
Jul 30 Javascript
vue将data恢复到初始状态 &amp;&amp; 重新渲染组件实例
Sep 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简单提示框alert封装函数
2010/08/08 PHP
php中使用session防止用户非法登录后台的方法
2015/01/27 PHP
微信公众平台之快递查询功能用法实例
2015/04/14 PHP
PHP基于双向链表与排序操作实现的会员排名功能示例
2017/12/26 PHP
javascript 动态参数判空操作
2008/12/22 Javascript
读jQuery之十二 删除事件核心方法
2011/07/31 Javascript
从URL中提取参数与将对象转换为URL查询参数的实现代码
2012/01/12 Javascript
jQuery根据纬度经度查看地图处理程序
2013/05/08 Javascript
js获取页面及个元素高度、宽度的代码
2016/04/26 Javascript
DOM 事件的深入浅出(二)
2016/12/05 Javascript
微信小程序 Toast自定义实例详解
2017/01/20 Javascript
深入理解js 中async 函数的含义和用法
2018/05/13 Javascript
node.js 基于cheerio的爬虫工具的实现(需要登录权限的爬虫工具)
2019/04/10 Javascript
node.js express框架简介与实现
2019/07/23 Javascript
如何换个角度使用VUE过滤器详解
2019/09/11 Javascript
[01:22:42]2014 DOTA2华西杯精英邀请赛 5 24 DK VS LGD
2014/05/26 DOTA
分分钟入门python语言
2018/03/20 Python
简单谈谈Python的pycurl模块
2018/04/07 Python
mac下给python3安装requests库和scrapy库的实例
2018/06/13 Python
python中字符串内置函数的用法总结
2018/09/13 Python
python3实现在二叉树中找出和为某一值的所有路径(推荐)
2019/12/26 Python
Internal修饰符有什么含义
2013/07/10 面试题
解除合同协议书
2014/04/17 职场文书
辞旧迎新演讲稿
2014/09/15 职场文书
组织生活会表态发言材料
2014/10/17 职场文书
村党组织公开承诺书
2015/04/30 职场文书
2015仓库保管员年终工作总结
2015/05/13 职场文书
2015年幼儿教师个人工作总结
2015/05/20 职场文书
教师节随笔
2015/08/15 职场文书
运动会广播稿50字
2015/08/19 职场文书
检举信的写法
2019/04/10 职场文书
大学生饮品店创业计划书范文
2019/07/10 职场文书
Django使用channels + websocket打造在线聊天室
2021/05/20 Python
vue-element-admin项目导入和导出的实现
2021/05/21 Vue.js
再也不用花钱买漫画!Python爬取某漫画的脚本及源码
2021/06/09 Python
uniapp引入支付宝原生扫码插件步骤详解
2022/07/23 Javascript