vue實(shí)現(xiàn)拖拽進(jìn)度條
本文實(shí)例為大家分享了vue實(shí)現(xiàn)拖拽進(jìn)度條的具體代碼,供大家參考,具體內(nèi)容如下

組件代碼:
<template>
<div>
<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>
<div>
<button
@click="
() => {
this.per++;
}
"
>
+</button
>{{ per }}%<button
@click="
() => {
if (this.per > 0) {
this.per--;
}
}
"
>
-
</button>
</div>
</div>
</template>
<script>
/*
* min 進(jìn)度條最小值
* max 進(jìn)度條最大值
* v-model 對(duì)當(dāng)前值進(jìn)行雙向綁定實(shí)時(shí)顯示拖拽進(jìn)度
* */
export default {
props: ["min", "max", "value"],
data() {
return {
slider: null, //滾動(dòng)條DOM元素
thunk: null, //拖拽DOM元素
per: this.value, //當(dāng)前值
};
},
//渲染到頁(yè)面的時(shí)候
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
// 當(dāng)value變化的時(shí)候,會(huì)通過(guò)計(jì)算屬性修改left,width
// 拖拽的時(shí)候獲取的新width
var newWidth = e.clientX - disX + width;
// 拖拽的時(shí)候得到新的百分比
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);
_this.$emit("input", _this.per);
};
document.onmouseup = function () {
document.onmousemove = document.onmouseup = null;
};
return false;
};
},
computed: {
// 設(shè)置一個(gè)百分比,提供計(jì)算slider進(jìn)度寬度和trunk的left值
// 對(duì)應(yīng)公式為 當(dāng)前值-最小值/最大值-最小值 = slider進(jìn)度width / slider總width
// trunk left = slider進(jìn)度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 {
user-select: none;
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: #81b159;
}
.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: 0.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: 0.6;
}
</style>
調(diào)用:
<template>
<slider :min="0" :max="100" v-model="per"></slider>
</template>
<script>
import slider from "@/components/slider";
export default {
data() {
return {};
},
computed: {
per: {
get() {
return 0;
},
set(val) {
console.log(val);
},
},
},
components: { slider },
mounted() {},
methods: {},
};
</script>
<style >
</style>
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Vue中使用echarts實(shí)現(xiàn)繪制人體動(dòng)態(tài)圖
這篇文章主要為大家詳細(xì)介紹了Vue中如何使用echarts實(shí)現(xiàn)繪制人體動(dòng)態(tài)圖,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03
vue2.0實(shí)現(xiàn)分頁(yè)組件的實(shí)例代碼
這篇文章主要介紹了vue2.0實(shí)現(xiàn)分頁(yè)組件的實(shí)例代碼,需要的朋友可以參考下2017-06-06
vue 項(xiàng)目打包通過(guò)命令修改 vue-router 模式 修改 API 接口前綴
這篇文章主要介紹了vue 項(xiàng)目打包通過(guò)命令修改 vue-router 模式 修改 API 接口前綴的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2018-06-06
Vue.js?前端項(xiàng)目在常見(jiàn)?Web?服務(wù)器上的部署配置過(guò)程
Web服務(wù)器支持多種編程語(yǔ)言,如 PHP,JavaScript,Ruby,Python 等,并且支持動(dòng)態(tài)生成 Web 頁(yè)面,這篇文章主要介紹了Vue.js?前端項(xiàng)目在常見(jiàn)?Web?服務(wù)器上的部署配置,需要的朋友可以參考下2023-02-02
關(guān)于在Vue中import和require的用法分析
在Vue項(xiàng)目中,我們經(jīng)常需要引入外部的模塊或文件,這時(shí)候就會(huì)用到import和require這兩個(gè)關(guān)鍵字,本文將詳細(xì)分析它們的用法,并提供具體的代碼實(shí)例和解釋,需要的朋友可以參考下2023-06-06
Vue組件中prop屬性使用說(shuō)明實(shí)例代碼詳解
這篇文章主要介紹了Vue組件中prop屬性使用說(shuō)明,非常不錯(cuò)具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-05-05
vue 子組件watch監(jiān)聽(tīng)不到prop的解決
這篇文章主要介紹了vue 子組件watch監(jiān)聽(tīng)不到prop的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08

