Vue滑塊解鎖組件使用方法詳解
本文實(shí)例為大家分享了Vue滑塊解鎖組件的使用,供大家參考,具體內(nèi)容如下
依據(jù) JS拖動(dòng)滑塊驗(yàn)證 開發(fā)的 Vue 滑塊解鎖組件。
<template>
? <div ref="wrap" class="slider-unlock">
? ? <div class="before">請(qǐng)按住滑塊,拖動(dòng)到最右邊</div>
? ? <div ref="after" class="after">
? ? ? <div class="after-inner">{{ success?'驗(yàn)證成功':'請(qǐng)按住滑塊,拖動(dòng)到最右邊' }}</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'
? ? ? // 滑塊移動(dòng)最大位置
? ? ? const limit = wrap.offsetWidth - slider.offsetWidth
? ? ? // 實(shí)時(shí)計(jì)算滑塊的偏移量
? ? ? let offsetX
? ? ? // 點(diǎn)擊滑塊時(shí)的鼠標(biāo)X位置
? ? ? let initX
? ? ? // 頁(yè)面鼠標(biāo)移動(dòng)事件
? ? ? const docMousemoveHandler = e => {
? ? ? ? // 獲取移動(dòng)后鼠標(biāo)實(shí)時(shí)位置
? ? ? ? const moveX = e.clientX
? ? ? ? // 計(jì)算滑塊應(yīng)該移動(dòng)的偏移量
? ? ? ? offsetX = moveX - initX
? ? ? ? // 限制上下限
? ? ? ? if (offsetX < 0) {
? ? ? ? ? offsetX = 0
? ? ? ? } else if (offsetX > limit) {
? ? ? ? ? offsetX = limit
? ? ? ? }
? ? ? ? // 移動(dòng)滑塊
? ? ? ? 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)
? ? ? ? }
? ? ? }
? ? ? // 頁(yè)面鼠標(biāo)松開事件
? ? ? const docMouseupHandler = e => {
? ? ? ? // 解綁事件
? ? ? ? document.removeEventListener('mousemove', docMousemoveHandler)
? ? ? ? // 重置滑塊
? ? ? ? if (offsetX < limit) {
? ? ? ? ? slider.style.left = 0
? ? ? ? ? after.style.width = 0
? ? ? ? }
? ? ? }
? ? ? // 滑塊點(diǎn)擊事件
? ? ? const sliderMousedownHandler = e => {
? ? ? ? // 獲取鼠標(biāo)位置
? ? ? ? initX = e.clientX
? ? ? ? // 綁定頁(yè)面的鼠標(biāo)移動(dòng)事件
? ? ? ? document.addEventListener('mousemove', docMousemoveHandler)
? ? ? }
? ? ? // 綁定滑塊點(diǎn)擊事件
? ? ? slider.addEventListener('mousedown', sliderMousedownHandler)
? ? ? // 頁(yè)面鼠標(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" />
效果:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Vite多環(huán)境配置項(xiàng)目高定制化能力詳解
這篇文章主要為大家介紹了Vite多環(huán)境配置項(xiàng)目高定制化能力詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
Vue如何基于vue-i18n實(shí)現(xiàn)多國(guó)語(yǔ)言兼容
這篇文章主要介紹了Vue如何基于vue-i18n實(shí)現(xiàn)多國(guó)語(yǔ)言兼容,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
vue3+ts+vite2項(xiàng)目實(shí)戰(zhàn)踩坑記錄
最近嘗試上手Vue3+TS+Vite,對(duì)比起Vue2有些不適應(yīng),但還是真香,下面這篇文章主要給大家介紹了關(guān)于vue3+ts+vite2項(xiàng)目的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09
vue實(shí)現(xiàn)聊天框自動(dòng)滾動(dòng)的示例代碼
本文主要介紹了vue實(shí)現(xiàn)聊天框自動(dòng)滾動(dòng)的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05
vue3如何實(shí)現(xiàn)錨點(diǎn)定位點(diǎn)擊滾動(dòng)高亮
這篇文章主要介紹了vue3如何實(shí)現(xiàn)錨點(diǎn)定位點(diǎn)擊滾動(dòng)高亮問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04
vue實(shí)現(xiàn)靜態(tài)頁(yè)面點(diǎn)贊和取消點(diǎn)贊功能
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)靜態(tài)頁(yè)面點(diǎn)贊和取消點(diǎn)贊的功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
element中el-table中的el-input校驗(yàn)的實(shí)現(xiàn)
本文主要介紹了element中el-table中的el-input校驗(yàn)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08

