vue滑動(dòng)解鎖組件使用方法詳解
本文實(shí)例為大家分享了vue滑動(dòng)解鎖組件的使用,供大家參考,具體內(nèi)容如下
這是一個(gè)pc端的滑動(dòng)解鎖組件
效果圖:

話不多說,直接上代碼
html部分
<template>
? ? <div class="dragVerify">
? ? ? ? <div class="spout" ref="spout">
? ? ? ? ? ? <div
? ? ? ? ? ? ? ? class="slidingBlock"
? ? ? ? ? ? ? ? ref="slidingBlock"
? ? ? ? ? ? ? ? :style="{ left: `${place}%` }"
? ? ? ? ? ? ? ? @mousedown="mousedown($event)"
? ? ? ? ? ? ? ? :class="place < distance ? 'unfinished' : 'complete'"
? ? ? ? ? ? ></div>
? ? ? ? ? ? <div class="succeedBox" :class="place >= distance ? 'succeedText' : ''" :style="{ width: `${place}%` }"></div>
? ? ? ? </div>
? ? </div>
</template>js部分
export default {
? ? name: 'dragVerify',
? ? data() {
? ? ? ? return {
? ? ? ? ? ? place: 0,
? ? ? ? ? ? sliding: {
? ? ? ? ? ? ? ? isDown: true,
? ? ? ? ? ? ? ? X: 0 // 初始X值
? ? ? ? ? ? },
? ? ? ? ? ? move: {
? ? ? ? ? ? ? ? X: 0 // 移動(dòng)X值
? ? ? ? ? ? },
? ? ? ? ? ? spoutW: 0,
? ? ? ? ? ? slidingBlockW: 0,
? ? ? ? ? ? distance: 1 // 要移動(dòng)的距離
? ? ? ? }
? ? },
? ? mounted() {},
? ? methods: {
? ? ? ? // 鼠標(biāo)事件
? ? ? ? mousedown(e) {
? ? ? ? ? ? if (this.place < this.distance) {
? ? ? ? ? ? ? ? this.sliding.isDown = true
? ? ? ? ? ? ? ? // 計(jì)算百分比
? ? ? ? ? ? ? ? this.spoutW = this.$refs.spout.offsetWidth
? ? ? ? ? ? ? ? this.slidingBlockW = this.$refs.slidingBlock.offsetWidth
? ? ? ? ? ? ? ? this.distance = 100 - (this.slidingBlockW / this.spoutW) * 100
? ? ? ? ? ? }
? ? ? ? ? ? this.sliding.X = e.x
? ? ? ? ? ? // 添加鼠標(biāo)的移動(dòng)事件
? ? ? ? ? ? document.addEventListener('mousemove', e => {
? ? ? ? ? ? ? ? if (this.sliding.isDown) {
? ? ? ? ? ? ? ? ? ? this.move.X = e.x
? ? ? ? ? ? ? ? ? ? if (this.place >= this.distance) {
? ? ? ? ? ? ? ? ? ? ? ? this.place = this.distance
? ? ? ? ? ? ? ? ? ? } else if (this.place >= 0 && this.place < this.distance) {
? ? ? ? ? ? ? ? ? ? ? ? this.place = ((this.move.X - this.sliding.X) / this.spoutW) * 100
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? if (this.place <= 0) {
? ? ? ? ? ? ? ? ? ? ? ? this.place = 0
? ? ? ? ? ? ? ? ? ? ? ? document.removeEventListener('mousemove', null, false)
? ? ? ? ? ? ? ? ? ? ? ? return
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? e.preventDefault()
? ? ? ? ? ? })
? ? ? ? ? ? // 松開鼠標(biāo)
? ? ? ? ? ? document.onmouseup = e => {
? ? ? ? ? ? ? ? if (this.place == this.distance) {
? ? ? ? ? ? ? ? ? ? this.$emit('setVerify', true)
? ? ? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? ? ? this.sliding.isDown = false
? ? ? ? ? ? ? ? ? ? this.place = 0
? ? ? ? ? ? ? ? ? ? this.$emit('setVerify', false)
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? }
}css部分
.dragVerify {
? ? border: 1px solid #e1e1e1;
? ? height: 40px;
? ? background: #eeeeee;
}
.spout {
? ? line-height: 40px;
? ? height: 40px;
? ? /* text-align: center; */
? ? position: relative;
? ? width: 293px;
}
.spout::before {
? ? content: '請按住滑塊,拖動(dòng)到最右邊';
? ? width: 233px;
? ? top: 0;
? ? right: 0;
? ? bottom: 0;
? ? color: #919593;
? ? font-size: 16px;
? ? text-align: center;
? ? position: absolute;
}
.succeedText::before {
? ? content: '驗(yàn)證通過';
? ? width: 233px;
? ? top: 0;
? ? right: 0;
? ? bottom: 0;
? ? color: #ffffff;
? ? font-size: 16px;
? ? text-align: center;
? ? position: absolute;
}
.succeedBox {
? ? color: #ffffff;
? ? font-size: 16px;
? ? text-align: center;
? ? line-height: 38px;
? ? height: 38px;
? ? position: absolute;
? ? top: 0;
? ? left: 0;
? ? right: 0;
? ? bottom: 0;
? ? background: #23b14d;
? ? z-index: 8;
}
.slidingBlock {
? ? width: 60px;
? ? /* height: 38px; */
? ? height: calc(100% - 0.1rem);
? ? border: 1px solid #e1e1e1;
? ? border-top: none;
? ? /* border-bottom: none; */
? ? border-left: none;
? ? background: #ffffff;
? ? position: absolute;
? ? top: 0;
? ? bottom: 0;
? ? left: 0;
? ? /* margin-left: -1px; */
? ? cursor: move;
? ? z-index: 9;
}
.slidingBlock::after {
? ? content: '';
? ? position: absolute;
? ? background-size: 100% 100%;
? ? background-repeat: no-repeat;
? ? width: 20px;
? ? height: 20px;
? ? left: 50%;
? ? top: 50%;
? ? margin-left: -10px;
? ? margin-top: -10px;
}
.unfinished::after {
? ? background-image: url(你的圖片);
}
.complete::after {
? ? background-image: url(你的圖片);
}以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
前端VUE雙語實(shí)現(xiàn)方案詳細(xì)教程
在項(xiàng)目需求中我們會(huì)遇到國際化的中英文切換,這篇文章主要給大家介紹了關(guān)于前端VUE雙語實(shí)現(xiàn)方案的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-08-08
Vue全局監(jiān)測錯(cuò)誤并生成錯(cuò)誤日志實(shí)現(xiàn)方法介紹
在做完一個(gè)項(xiàng)目后,之后的維護(hù)尤為重要。這時(shí),如果項(xiàng)目配置了錯(cuò)誤日志記錄,這樣能大大減少維護(hù)難度。雖然不一定能捕獲到全部的錯(cuò)誤,但是一般的錯(cuò)誤還是可以監(jiān)測到的。這樣就不用測試人員去一遍一遍復(fù)現(xiàn)bug了2022-10-10
vue?filters和directives訪問this的問題詳解
這篇文章主要介紹了vue?filters和directives訪問this的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
vsCode安裝配置創(chuàng)建Vue3項(xiàng)目全過程
本文介紹了如何在Windows系統(tǒng)上安裝和配置Vue.js開發(fā)環(huán)境,包括安裝VS Code、Node.js、Vue CLI以及創(chuàng)建和啟動(dòng)一個(gè)Vue項(xiàng)目2025-01-01
詳解Vue組件實(shí)現(xiàn)tips的總結(jié)
這篇文章主要介紹了詳解Vue組件實(shí)現(xiàn)tips的總結(jié),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-11-11
Vuex報(bào)錯(cuò)之[vuex] unknown mutation type: han
這篇文章主要介紹了Vuex報(bào)錯(cuò)之[vuex] unknown mutation type: handlePower問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
Delete `,` 如何解決(vue eslint與prettier沖突)
這篇文章主要介紹了Delete `,` 如何解決(vue eslint與prettier沖突)問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10
vue實(shí)現(xiàn)列表滑動(dòng)下拉加載數(shù)據(jù)的方法
文章介紹了如何使用Vue實(shí)現(xiàn)列表滑動(dòng)下拉加載數(shù)據(jù)的功能,通過監(jiān)聽滾動(dòng)事件,檢測用戶是否滾動(dòng)到底部,然后動(dòng)態(tài)加載更多數(shù)據(jù),附帶了實(shí)現(xiàn)思路和案例代碼,感興趣的朋友一起看看吧2024-11-11
Vue.js使用computed屬性實(shí)現(xiàn)數(shù)據(jù)自動(dòng)更新
在Vue組件中,computed屬性是在組件的選項(xiàng)對象中聲明的,你可以把它們想象成組件的一個(gè)小功能,告訴Vue當(dāng)某些數(shù)據(jù)變化時(shí),如何更新界面,本文給大家介紹了Vue.js使用computed屬性實(shí)現(xiàn)數(shù)據(jù)自動(dòng)更新,需要的朋友可以參考下2024-06-06
elementUI組件中el-date-picker限制時(shí)間范圍精確到小時(shí)的方法
現(xiàn)在需要做一個(gè)時(shí)間選擇器,可以根據(jù)小時(shí)(同時(shí)選天和小時(shí))和天?和月,節(jié)假日等類型控制日歷的選擇樣式,下面這篇文章主要給大家介紹了關(guān)于elementUI組件中el-date-picker限制時(shí)間范圍精確到小時(shí)的相關(guān)資料,需要的朋友可以參考下2023-04-04

