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 相关文章推荐
jQuery新闻滚动插件 jquery.roller.js
Jun 27 Javascript
实现图片预加载的三大方法及优缺点分析
Nov 19 Javascript
Ajax中解析Json的两种方法对比分析
Jun 25 Javascript
JavaScript中循环遍历Array与Map的方法小结
Mar 12 Javascript
js注入 黑客之路必备!
Sep 14 Javascript
js数字计算 误差问题的快速解决方法
Feb 28 Javascript
vue mixins组件复用的几种方式(小结)
Sep 06 Javascript
微信小程序之页面拦截器的示例代码
Sep 07 Javascript
jQuery实现checkbox的简单操作
Nov 18 jQuery
jQuery实现的页面弹幕效果【测试可用】
Aug 17 jQuery
JS常见面试试题总结【去重、遍历、闭包、继承等】
Aug 27 Javascript
node+vue实现文件上传功能
May 28 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 远程关机实现代码
2009/11/10 PHP
php表单提交问题的解决方法
2011/04/12 PHP
关于PHP结束标签的使用细节探讨及联想
2013/03/04 PHP
php class中public,private,protected的区别以及实例分析
2013/06/18 PHP
yii用户注册表单验证实例
2015/12/26 PHP
PHP使用redis位图bitMap 实现签到功能
2019/10/08 PHP
javascript之更有效率的字符串替换
2008/08/02 Javascript
javascript中的array数组使用技巧
2010/01/31 Javascript
JS上传图片前的限制包括(jpg jpg gif及大小高宽)等
2012/12/19 Javascript
动态加载dtree.js树treeview(示例代码)
2013/12/17 Javascript
ajax如何实现页面局部跳转与结果返回
2015/08/24 Javascript
js+css绘制颜色动态变化的圈中圈效果
2016/01/27 Javascript
node.js中 stream使用教程
2016/08/28 Javascript
HTML5 canvas 9绘制图片实例详解
2016/09/06 Javascript
Vue2.0实现将页面中表格数据导出excel的实例
2017/08/09 Javascript
vue 项目中使用Loading组件的示例代码
2018/08/31 Javascript
解决vue脚手架项目打包后路由视图不显示的问题
2018/09/20 Javascript
vue单文件组件lint error自动fix与styleLint报错自动fix详解
2019/01/08 Javascript
node.js中ws模块创建服务端和客户端,网页WebSocket客户端
2019/03/06 Javascript
Vue+Express实现登录注销功能的实例代码
2019/05/05 Javascript
在node环境下parse Smarty模板的使用示例代码
2019/11/15 Javascript
JavaScript禁止右击保存图片,禁止拖拽图片的实现代码
2020/04/28 Javascript
JavaScript如何使用插值实现图像渐变
2020/06/28 Javascript
Python类的动态修改的实例方法
2017/03/24 Python
Python使用jsonpath-rw模块处理Json对象操作示例
2018/07/31 Python
python3人脸识别的两种方法
2019/04/25 Python
TensorFlow实现checkpoint文件转换为pb文件
2020/02/10 Python
Python编程快速上手——Excel表格创建乘法表案例分析
2020/02/28 Python
浅谈keras中loss与val_loss的关系
2020/06/22 Python
html5唤起app的方法
2017/11/30 HTML / CSS
SheIn俄罗斯:时尚女装网上商店
2017/02/28 全球购物
乌克兰在线药房:Аптека24
2019/10/30 全球购物
毕业生求职找工作的自我评价范文
2013/11/27 职场文书
结婚喜宴家长答谢词
2014/01/15 职场文书
2014年社区宣传工作总结
2014/12/02 职场文书
大学生创业计划书常用模板
2019/08/07 职场文书