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 相关文章推荐
asp javascript 实现关闭窗口时保存数据的办法
Nov 24 Javascript
jQuery中:disabled选择器用法实例
Jan 04 Javascript
jQuery使用hide方法隐藏页面上指定元素的方法
Mar 30 Javascript
jQuery的css() 方法使用指南
May 03 Javascript
JavaScript:Date类型全面解析
May 19 Javascript
canvas实现绘制吃豆鱼效果
Jan 12 Javascript
canvas实现图像截取功能
Feb 06 Javascript
jQuery文字轮播特效
Feb 12 Javascript
Angular 4依赖注入学习教程之ValueProvider的使用(七)
Jun 04 Javascript
使用json-server简单完成CRUD模拟后台数据的方法
Jul 12 Javascript
Vue中this.$nextTick的作用及用法
Feb 04 Javascript
JavaScript对象访问器Getter及Setter原理解析
Dec 08 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数组函数序列之array_slice() - 在数组中根据条件取出一段值,并返回
2011/11/07 PHP
PHP把MSSQL数据导入到MYSQL的方法
2014/12/27 PHP
基于ThinkPHP+uploadify+upload+PHPExcel 无刷新导入数据
2015/09/23 PHP
smarty中改进truncate使其支持中文的方法
2016/05/30 PHP
php基于dom实现读取图书xml格式数据的方法
2017/02/03 PHP
PHP实现数据库的增删查改功能及完整代码
2018/04/18 PHP
Yii 访问 Gii(脚手架)时出现 403 错误
2018/06/06 PHP
php实现银联商务公众号+服务窗支付的示例代码
2019/10/12 PHP
PHP设计模式之装饰器(装饰者)模式(Decorator)入门与应用详解
2019/12/13 PHP
详解AngularJS的通信机制
2015/06/18 Javascript
jquery专业的导航菜单特效代码分享
2015/08/29 Javascript
JQuery的常用选择器、过滤器、方法全面介绍
2016/05/25 Javascript
Javascript OOP之面向对象
2016/07/31 Javascript
详解照片瀑布流效果(js,jquery分别实现与知识点总结)
2017/01/01 Javascript
mockjs+vue页面直接展示数据的方法
2018/12/19 Javascript
vue实现移动端轻量日期组件不依赖第三方库的方法
2019/04/28 Javascript
使用vue实现多规格选择实例(SKU)
2019/08/23 Javascript
js实现蒙版效果
2020/01/11 Javascript
[39:18]完美世界DOTA2联赛PWL S3 Forest vs LBZS 第二场 12.17
2020/12/19 DOTA
python之yield表达式学习
2014/09/02 Python
基于python中的TCP及UDP(详解)
2017/11/06 Python
Python实现求解括号匹配问题的方法
2018/04/17 Python
python 数字类型和字符串类型的相互转换实例
2018/07/17 Python
解决PyCharm import torch包失败的问题
2018/10/13 Python
pytorch nn.Conv2d()中的padding以及输出大小方式
2020/01/10 Python
python3+selenium获取页面加载的所有静态资源文件链接操作
2020/05/04 Python
使用Keras画神经网络准确性图教程
2020/06/15 Python
浅谈pytorch中的BN层的注意事项
2020/06/23 Python
英国和世界各地鲜花速递专家:Arena Flowers
2018/02/10 全球购物
FC-Moto瑞典:欧洲最大的摩托车服装和头盔商店之一
2018/11/27 全球购物
项目投资建议书
2014/05/16 职场文书
小学生感恩父母演讲稿
2014/08/28 职场文书
先进班组材料范文
2014/12/25 职场文书
2015年社区综治工作总结
2015/04/21 职场文书
免职通知
2015/04/23 职场文书
装修公司管理制度
2015/08/05 职场文书