本文實例為大家分享了Vue滑塊解鎖組件的使用
<template>
<div ref="wrap" class="slider-unlock">
<div class="before">請按住滑塊,拖動到最右邊</div>
<div ref="after" class="after">
<div class="after-inner">{{ success?'驗證成功':'請按住滑塊嚎研,拖動到最右邊' }}</div>
</div>
<div ref="slider" class="slider" :class="{'is-success': success}" />
</div>
</template>
<script>
export default {
name: 'SliderUnlock',
data() {
return {
success: false,
clear: null,
}
},
mounted() {
this.init()
},
beforeDestroy() {
this.clear && this.clear()
},
methods: {
init() {
// 獲取 dom
const after = this.$refs.after
const slider = this.$refs.slider
const wrap = this.$refs.wrap
// 設(shè)置after-inner的固定寬度
after.childNodes[0].style.width = wrap.offsetWidth + 'px'
// 滑塊移動最大位置
const limit = wrap.offsetWidth - slider.offsetWidth
// 實時計算滑塊的偏移量
let offsetX
// 點擊滑塊時的鼠標(biāo)X位置
let initX
// 頁面鼠標(biāo)移動事件
const docMousemoveHandler = e => {
// 獲取移動后鼠標(biāo)實時位置
const moveX = e.clientX
// 計算滑塊應(yīng)該移動的偏移量
offsetX = moveX - initX
// 限制上下限
if (offsetX < 0) {
offsetX = 0
} else if (offsetX > limit) {
offsetX = limit
}
// 移動滑塊
slider.style.left = offsetX + 'px'
// 修改高亮背景寬度
after.style.width = offsetX + 'px'
if (offsetX >= limit) {
this.success = true
this.$emit('success')
document.removeEventListener('mousemove', docMousemoveHandler)
slider.removeEventListener('mousedown', sliderMousedownHandler)
}
}
// 頁面鼠標(biāo)松開事件
const docMouseupHandler = e => {
// 解綁事件
document.removeEventListener('mousemove', docMousemoveHandler)
// 重置滑塊
if (offsetX < limit) {
slider.style.left = 0
after.style.width = 0
}
}
// 滑塊點擊事件
const sliderMousedownHandler = e => {
// 獲取鼠標(biāo)位置
initX = e.clientX
// 綁定頁面的鼠標(biāo)移動事件
document.addEventListener('mousemove', docMousemoveHandler)
}
// 綁定滑塊點擊事件
slider.addEventListener('mousedown', sliderMousedownHandler)
// 頁面鼠標(biāo)松開事件
document.addEventListener('mouseup', docMouseupHandler)
// 定義清理方法
this.clear = () => {
document.removeEventListener('mousemove', docMousemoveHandler)
slider.removeEventListener('mousedown', sliderMousedownHandler)
document.removeEventListener('mouseup', docMouseupHandler)
}
},
},
}
</script>
<style lang="less" scoped>
.slider-unlock{
height: 45px;
background: #E1E1E1;
border-radius: 4px;
position: relative;
overflow: hidden;
border: 1px solid #CCCCCC;
box-sizing: border-box;
user-select: none;
.before, .after {
position: absolute;
margin: -1px 0 0 -1px;
top: 0;
left: 0;
z-index: 1;
height: 100%;
box-sizing: content-box;
font-size: 14px;
font-weight: bold;
line-height: 43px;
text-align: center;
}
.before {
width: 100%;
color: #333;
padding: 0 1px 1px 0;
}
.after {
width: 0;
overflow: hidden;
padding: 0 0 1px 0;
&-inner {
position: absolute;
width:100%;
height: 100%;
color: #fff;
background-color: #40C057;
}
}
.slider{
position: absolute;
margin: -1px 0 0 -1px;
top: 0;
left: 0;
z-index: 3;
width: 70px;
height: 45px;
border: 1px solid #CCC;
cursor: pointer;
background: no-repeat center center #fff;
background-image: url(~@/imgs/icon-allow-right.png);
&.is-success {
background-image: url(~@/imgs/icon-success.png);
}
}
}
</style>
使用
<SliderUnlock @success="handler" />