vue3實(shí)現(xiàn)淘寶放大鏡效果的示例代碼
實(shí)現(xiàn)效果
實(shí)現(xiàn)思路
我們實(shí)現(xiàn)動(dòng)圖的淘寶放大鏡的效果需要4步。
1.完成小圖盒子、遮罩、大圖盒子布局
2.實(shí)現(xiàn)鼠標(biāo)移動(dòng)到小圖盒子顯示遮罩和大圖盒子
3.實(shí)現(xiàn)鼠標(biāo)移動(dòng)遮罩在小圖盒子移動(dòng)
4.實(shí)現(xiàn)遮罩的移動(dòng)范圍不能超出小圖盒子,且移動(dòng)時(shí)帶動(dòng)大圖圖片移動(dòng)
完成小圖盒子、遮罩、大圖盒子布局
我的布局小圖盒子包裹圖片、遮罩、大圖盒子。
小圖盒子為相對(duì)定位。遮罩、大圖盒子、大圖圖片都為絕對(duì)定位(大圖圖片沒(méi)定位不能移動(dòng))。mask要設(shè)置透明度。只要能實(shí)現(xiàn)效果即可。
實(shí)現(xiàn)鼠標(biāo)移動(dòng)到小圖盒子顯示遮罩和大圖盒子
小圖盒子綁定mouseout鼠標(biāo)移到事件和mouseover鼠標(biāo)移出事件。每次觸發(fā)事件的時(shí)候切換狀態(tài)。
實(shí)現(xiàn)鼠標(biāo)移動(dòng)遮罩在小圖盒子移動(dòng)
小圖盒子綁定mousemove鼠標(biāo)移動(dòng)事件。鼠標(biāo)在頁(yè)面的x坐標(biāo)減去小圖盒子的offersetLeft就是鼠標(biāo)在盒子的左邊這就是遮罩要移動(dòng)的坐標(biāo),想要鼠標(biāo)在mask的中間要除以2。同理y坐標(biāo)也是。
實(shí)現(xiàn)遮罩的移動(dòng)范圍不能超出小圖盒子,且移動(dòng)時(shí)帶動(dòng)大圖圖片移動(dòng)
邊界值的判斷,如果小于等于0,則將mask的left等于0,x的有邊界值其實(shí)就是小盒子的寬度減去mask的寬度的值。同理y軸就是小盒子的高度減去mask的高度。
帶動(dòng)大圖移動(dòng)有個(gè)比例關(guān)系。大圖片移動(dòng)距離 = mask的移動(dòng)距離*大盒子最大移動(dòng)距離 / mask的x最大移動(dòng)距離,
完整代碼
<template> ? <div ? ? class="tb-booth" ? ? @mouseover="onMouseOver" ? ? @mouseout="onMouseOut" ? ? @mousemove="onMouseMove" ? ? ref="boothRef" ? > ? ? <img ? ? ? src="https://img.alicdn.com/imgextra/i3/1917047079/O1CN01lkG2pf22AEUi1owve_!!1917047079.png_430x430q90.jpg" ? ? /> ? ? <div class="mask" ref="mask" v-show="boxShow" /> ? ? <div class="big-img_box" ref="bigImgBox" v-show="boxShow"> ? ? ? <img ? ? ? ? class="big-img" ? ? ? ? ref="bigImg" ? ? ? ? src="https://img.alicdn.com/imgextra/i3/1917047079/O1CN01lkG2pf22AEUi1owve_!!1917047079.png" ? ? ? /> ? ? </div> ? </div> </template> <script> import { reactive, toRefs, ref } from "vue"; export default { ? setup() { ? ? const boothRef = ref(null); ? ? const mask = ref(null); ? ? const bigImg = ref(null); ? ? const bigImgBox = ref(null); ? ? const state = reactive({ ? ? ? boxShow: false ? ? }); ? ? const onMouseOver = () => { ? ? ? state.boxShow = true; ? ? }; ? ? const onMouseOut = () => { ? ? ? state.boxShow = false; ? ? }; ? ? const onMouseMove = (e) => { ? ? ? let x = e.pageX - boothRef.value.offsetLeft; ? ? ? let y = e.pageY - boothRef.value.offsetTop; ? ? ? let maskX = x - mask.value.offsetWidth / 2; ? ? ? let maskY = y - mask.value.offsetHeight / 2; ? ? ? // mask的x最大移動(dòng)距離 ? ? ? let maskXMaxMove = boothRef.value.offsetWidth - mask.value.offsetWidth; ? ? ? let maskYMaxMove = boothRef.value.offsetHeight - mask.value.offsetHeight; ? ? ? let bigImgXMaxMove = ? ? ? ? bigImgBox.value.offsetWidth - bigImg.value.offsetWidth; ? ? ? let bigImgYMaxMove = ? ? ? ? bigImgBox.value.offsetHeight - bigImg.value.offsetHeight; ? ? ? if (maskX <= 0) { ? ? ? ? maskX = 0; ? ? ? } else if (maskX >= maskXMaxMove) { ? ? ? ? maskX = maskXMaxMove; ? ? ? } ? ? ? if (maskY <= 0) { ? ? ? ? maskY = 0; ? ? ? } else if (maskY >= maskYMaxMove) { ? ? ? ? maskY = maskYMaxMove; ? ? ? } ? ? ? mask.value.style.left = maskX + "px"; ? ? ? mask.value.style.top = maskY + "px"; ? ? ? // 大圖片移動(dòng)距離 = mask的移動(dòng)距離*大盒子最大移動(dòng)距離 / mask的x最大移動(dòng)距離 ? ? ? let bixImgXMove = (maskX * bigImgXMaxMove) / maskXMaxMove; ? ? ? let bixImgYMove = (maskY * bigImgYMaxMove) / maskYMaxMove; ? ? ? bigImg.value.style.left = bixImgXMove + "px"; ? ? ? bigImg.value.style.top = bixImgYMove + "px"; ? ? }; ? ? return { ? ? ? ...toRefs(state), ? ? ? boothRef, ? ? ? mask, ? ? ? bigImg, ? ? ? bigImgBox, ? ? ? onMouseOver, ? ? ? onMouseOut, ? ? ? onMouseMove, ? ? }; ? }, }; </script> <style scoped> .tb-booth { ? width: 430px; ? height: 430px; ? position: relative; ? border: 1px solid #cccccc; } .mask { ? position: absolute; ? top: 0; ? left: 0; ? width: 200px; ? height: 200px; ? background-color: rgb(61, 110, 206); ? opacity: 0.5; ? cursor: move; } .big-img_box { ? position: absolute; ? top: 0; ? left: 530px; ? width: 500px; ? height: 500px; ? background-color: #fff; ? border: 1px solid #cccccc; ? overflow: hidden; } .big-img { ? position: absolute; ? left: 0; ? top: 0; } </style>
總結(jié)
- mouseover、mouseout、mousemove事件的運(yùn)用
- v-show顯示隱藏
- vue3獲取ref兩種方式其中一種通過(guò)setup創(chuàng)建ref響應(yīng)式數(shù)據(jù),暴露出去賦予ref元素的值。第二種是getCurrentInstance方法。
- offsetWidth、offsetHeight、offsetLeft、offsetTop、pageX、pageY的概念
到此這篇關(guān)于vue3實(shí)現(xiàn)淘寶放大鏡效果的示例代碼的文章就介紹到這了,更多相關(guān)vue3 淘寶放大鏡內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何在Vue單頁(yè)面中進(jìn)行業(yè)務(wù)數(shù)據(jù)的上報(bào)
為什么要在標(biāo)題里加上一個(gè)業(yè)務(wù)數(shù)據(jù)的上報(bào)呢,因?yàn)樵谠蹅兦岸隧?xiàng)目中,可上報(bào)的數(shù)據(jù)維度太多,比如還有性能數(shù)據(jù)、頁(yè)面錯(cuò)誤數(shù)據(jù)、console捕獲等。這里我們只講解業(yè)務(wù)數(shù)據(jù)的埋點(diǎn)。2021-05-05vue實(shí)現(xiàn)動(dòng)態(tài)給data函數(shù)中的屬性賦值
這篇文章主要介紹了vue實(shí)現(xiàn)動(dòng)態(tài)給data函數(shù)中的屬性賦值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09vue3中獲取dom元素和操作實(shí)現(xiàn)方法
ref是Vue3中一個(gè)非常重要的功能,它可以用來(lái)獲取DOM節(jié)點(diǎn),從而實(shí)現(xiàn)對(duì)DOM節(jié)點(diǎn)的操作,下面這篇文章主要給大家介紹了關(guān)于vue3中獲取dom元素和操作實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2023-06-06解決vue運(yùn)行報(bào)錯(cuò)Error:Cannot?find?module?'@vue/cli-plugin-b
解決了因?yàn)榘姹締?wèn)題在創(chuàng)建項(xiàng)目時(shí)出現(xiàn)的各種報(bào)錯(cuò)問(wèn)題,這次在運(yùn)行時(shí)出現(xiàn)的問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于解決vue運(yùn)行報(bào)錯(cuò)Error:Cannot?find?module?'@vue/cli-plugin-babel'的相關(guān)資料,需要的朋友可以參考下2023-04-04Ant?Design?Vue?走馬燈實(shí)現(xiàn)單頁(yè)多張圖片輪播效果
這篇文章主要介紹了Ant?Design?Vue?走馬燈實(shí)現(xiàn)單頁(yè)多張圖片輪播,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07Vue實(shí)現(xiàn)用戶沒(méi)有登陸時(shí),訪問(wèn)后自動(dòng)跳轉(zhuǎn)登錄頁(yè)面的實(shí)現(xiàn)思路
這篇文章主要介紹了Vue實(shí)現(xiàn)用戶沒(méi)有登陸時(shí),訪問(wèn)后自動(dòng)跳轉(zhuǎn)登錄頁(yè)面,定義路由的時(shí)候配置屬性,這里使用needLogin標(biāo)記訪問(wèn)頁(yè)面是否需要登錄,本文通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02vue2項(xiàng)目使用element-ui的el-tabs組件導(dǎo)致瀏覽器崩潰卡死問(wèn)題
這篇文章主要介紹了vue2項(xiàng)目使用element-ui的el-tabs組件導(dǎo)致瀏覽器崩潰卡死問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07websocket+Vuex實(shí)現(xiàn)一個(gè)實(shí)時(shí)聊天軟件
這篇文章主要利用websocked 建立長(zhǎng)連接,利用Vuex全局通信的特性,以及watch,computed函數(shù)監(jiān)聽(tīng)消息變化,并驅(qū)動(dòng)頁(yè)面變化實(shí)現(xiàn)實(shí)時(shí)聊天,感興趣的可以了解一下2021-08-08vue中v-if和v-for一起使用的弊端及解決辦法(同時(shí)使用 v-if 和 v-for不
當(dāng) v-if 和 v-for 同時(shí)存在于一個(gè)元素上的時(shí)候,v-if 會(huì)首先被執(zhí)行,這篇文章主要介紹了vue中v-if和v-for一起使用的弊端及解決辦法,需要的朋友可以參考下2023-07-07