vue封裝圖片滑塊驗(yàn)證組件的方法
本文實(shí)例為大家分享了vue封裝圖片滑塊驗(yàn)證組件的具體代碼,供大家參考,具體內(nèi)容如下
滑塊驗(yàn)證組件整體不難,主要在于設(shè)置圖片的樣式問題,想要讓背景圖充滿div,就需要滑塊圖片也跟隨等比放大,效果與代碼如下:
HTML:
<template> ? <section class="slider-section"> ? ? <div class="img-box"> ? ? ? <img :src="'data:image/png;base64,' + sliderData.bigImg" class="bg-img" ref="bgImg" /> ? ? ? <img :src="'data:image/png;base64,' + sliderData.smallImg" class="slider-img" ref="sliderImg" /> ? ? </div> ? ? <div class="slider-box"> ? ? ? <span class="slider-text">向右滑動(dòng)滑塊填充拼圖</span> ? ? ? <div class="slider-icon" @mousedown="rangeMove">></div> ? ? </div> ? </section> </template>
JS:
<script> export default { ? props: ['sliderData'], // 父組件傳入的滑塊數(shù)據(jù)對(duì)象 ? watch: { ? ? sliderData: { // 監(jiān)聽滑塊數(shù)據(jù)變化,重置滑塊位置 ? ? ? handler (newVal, oldVal) { ? ? ? ? if (newVal) { ? ? ? ? ? this.init() ? ? ? ? } ? ? ? }, ? ? ? deep: true ? ? } ? }, ? data () { ? ? return { ? ? ? disX: 0 // 滑塊距離背景圖左側(cè)的位置 ? ? } ? }, ? mounted () { ? ? this.init() ? }, ? methods: { ? ? // 初始化滑塊的位置 ? ? init () { ? ? ? this.disX = 0 // 初始化滑塊位置 ? ? ? let bigImg = new Image() // 創(chuàng)建背景圖片 ? ? ? bigImg.src = "data:image/png;base64," + this.sliderData.bigImg ? ? ? bigImg.onload = () => { ? ? ? ? let originWidth = bigImg.width ?// 獲取原始背景圖片的寬度 ? ? ? ? let widthRate = this.$refs.bgImg.width / originWidth // 背景圖片渲染后的實(shí)際寬度/原始圖片寬度 ? ? ? ? let smallImg = new Image() // 創(chuàng)建滑塊圖片 ? ? ? ? smallImg.src = "data:image/png;base64," + this.sliderData.smallImg ? ? ? ? this.$refs.sliderImg.src = 'data:image/png;base64,' + this.sliderData.smallImg // 設(shè)置滑塊圖片地址 ? ? ? ? this.$refs.sliderImg.style.width = smallImg.width * widthRate + 'px' ?// 設(shè)置滑塊圖片寬度 ? ? ? ? this.$refs.sliderImg.style.top = this.sliderData.smallY * this.$refs.bgImg.height + 'px' ?// 設(shè)置滑塊距離背景圖頂部的距離 ? ? ? ? this.$refs.sliderImg.style.left = 0 ?// 設(shè)置滑塊距離背景圖左側(cè)的距離 ? ? ? } ? ? }, ? ? // 移動(dòng)事件觸發(fā) ? ? rangeMove (e) { ? ? ? let ele = e.target ? ? ? let startX = e.clientX ? ? ? let eleWidth = ele.offsetWidth ? ? ? let parentWidth = ele.parentElement.offsetWidth ? ? ? let MaxX = parentWidth - eleWidth ? ? ? document.onmousemove = (e) => { ? ? ? ? let endX = e.clientX ? ? ? ? this.disX = endX - startX ? ? ? ? this.$refs.sliderImg.style.left = this.disX + 'px' ? ? ? ? if (this.disX <= 0) { ? ? ? ? ? this.disX = 0 ? ? ? ? ? this.$refs.sliderImg.style.left = 0 ? ? ? ? } ? ? ? ? if (this.disX >= MaxX - eleWidth) {//減去滑塊的寬度,體驗(yàn)效果更好 ? ? ? ? ? this.disX = MaxX ? ? ? ? ? this.$refs.sliderImg.style.left = (parentWidth - this.$refs.sliderImg.width) + 'px' ? ? ? ? } ? ? ? ? ele.style.transition = '.1s all' ? ? ? ? ele.style.transform = 'translateX(' + this.disX + 'px)' ? ? ? ? e.preventDefault() ? ? ? } ? ? ? document.onmouseup = () => { ? ? ? ? this.$emit('submitPic', this.disX / parentWidth) // 停止滑動(dòng)事件冒泡給父級(jí) ? ? ? ? setTimeout(() => { ? ? ? ? ? ele.style.transition = '.5s all'; // 初始化滑塊位置 ? ? ? ? ? ele.style.transform = 'translateX(0)'; ? ? ? ? }, 200) ? ? ? ? document.onmousemove = null ? ? ? ? document.onmouseup = null ? ? ? } ? ? } ? } } </script>
CSS:
<style scoped lang="less"> .slider-section { ? margin: 20px 0; ? .img-box { ? ? position: relative; ? ? .bg-img { ? ? ? width: 100%; ? ? } ? ? .slider-img { ? ? ? position: absolute; ? ? ? left: 0; ? ? ? top: 0; ? ? } ? } ? ? .slider-box { ? ? margin-top: 20px; ? ? background: #f7f9fa; ? ? color: #666; ? ? border: 1px solid #e4e7eb; ? ? position: relative; ? ? height: 30px; ? ? width: 100%; ? ? &:hover { ? ? ? box-shadow: 0 0 3px #ccc; ? ? } ? ? .slider-text { ? ? ? font-size: 14px; ? ? ? position: absolute; ? ? ? top: 50%; ? ? ? left: 50%; ? ? ? transform: translate(-50%, -50%); ? ? } ? ? .slider-icon { ? ? ? width: 30px; ? ? ? height: 30px; ? ? ? background: #c8923a; ? ? ? text-align: center; ? ? ? font-size: 20px; ? ? ? color: #fff; ? ? ? box-shadow: 0 0 6px #ccc; ? ? } ? } } </style>
注:使用的是mousedown、onmousemove 、onmouseup 事件,僅支持PC端,如果要在移動(dòng)端使用,需要把這些事件改成touch等;
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- vue自定義開發(fā)滑動(dòng)圖片驗(yàn)證組件
- Vue實(shí)現(xiàn)圖片驗(yàn)證碼生成
- vue實(shí)現(xiàn)圖片滑動(dòng)驗(yàn)證
- vue實(shí)現(xiàn)登錄時(shí)的圖片驗(yàn)證碼
- 基于vue實(shí)現(xiàn)圖片驗(yàn)證碼倒計(jì)時(shí)60s功能
- VUE實(shí)現(xiàn)圖片驗(yàn)證碼功能
- vue+elementUI實(shí)現(xiàn)表單和圖片上傳及驗(yàn)證功能示例
- vue驗(yàn)證碼(identify)插件使用方法詳解
- vue+Element實(shí)現(xiàn)登錄隨機(jī)驗(yàn)證碼
- vue3實(shí)現(xiàn)旋轉(zhuǎn)圖片驗(yàn)證
相關(guān)文章
vue 項(xiàng)目全屏插件screenfull使用案例
這篇文章主要介紹了vue 項(xiàng)目全屏插件screenfull使用案例,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-12-12Angular和Vue雙向數(shù)據(jù)綁定的實(shí)現(xiàn)原理(重點(diǎn)是vue的雙向綁定)
這篇文章主要介紹了Angular和Vue雙向數(shù)據(jù)綁定的實(shí)現(xiàn)原理(重點(diǎn)是vue的雙向綁定),非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起看看吧2016-11-11vue 百度地圖(vue-baidu-map)繪制方向箭頭折線實(shí)例代碼詳解
這篇文章主要介紹了vue 百度地圖(vue-baidu-map)繪制方向箭頭折線,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04基于Vue3實(shí)現(xiàn)無限滾動(dòng)組件的示例代碼
如果你在社交媒體上停留的時(shí)間過長(zhǎng),那么,你所在的網(wǎng)站很可能正在使用無限滾動(dòng)組件。這篇文章教你利用Vue3實(shí)現(xiàn)無限滾動(dòng)組件,感興趣的可以參考一下2022-09-09vue移動(dòng)端如何解決click事件延遲,封裝tap等事件
這篇文章主要介紹了vue移動(dòng)端如何解決click事件延遲,封裝tap等事件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03基于elementUI實(shí)現(xiàn)圖片預(yù)覽組件的示例代碼
這篇文章主要介紹了基于elementUI實(shí)現(xiàn)圖片預(yù)覽組件的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03vue中的路由傳值與重調(diào)本路由改變參數(shù)
這篇文章主要介紹了vue中的路由傳值與重調(diào)本路由改變參數(shù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09