" />

最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue3實現(xiàn)淘寶放大鏡效果的示例代碼

 更新時間:2022年06月06日 11:09:14   作者:Ayanokouji  
放大鏡效果在很多購物網(wǎng)站都可以看到,本文主要介紹了vue3實現(xiàn)淘寶放大鏡效果的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

實現(xiàn)效果

實現(xiàn)思路

我們實現(xiàn)動圖的淘寶放大鏡的效果需要4步。

1.完成小圖盒子、遮罩、大圖盒子布局
2.實現(xiàn)鼠標(biāo)移動到小圖盒子顯示遮罩和大圖盒子
3.實現(xiàn)鼠標(biāo)移動遮罩在小圖盒子移動
4.實現(xiàn)遮罩的移動范圍不能超出小圖盒子,且移動時帶動大圖圖片移動

完成小圖盒子、遮罩、大圖盒子布局

我的布局小圖盒子包裹圖片、遮罩、大圖盒子。
小圖盒子為相對定位。遮罩、大圖盒子、大圖圖片都為絕對定位(大圖圖片沒定位不能移動)。mask要設(shè)置透明度。只要能實現(xiàn)效果即可。

實現(xiàn)鼠標(biāo)移動到小圖盒子顯示遮罩和大圖盒子

小圖盒子綁定mouseout鼠標(biāo)移到事件和mouseover鼠標(biāo)移出事件。每次觸發(fā)事件的時候切換狀態(tài)。

實現(xiàn)鼠標(biāo)移動遮罩在小圖盒子移動

小圖盒子綁定mousemove鼠標(biāo)移動事件。鼠標(biāo)在頁面的x坐標(biāo)減去小圖盒子的offersetLeft就是鼠標(biāo)在盒子的左邊這就是遮罩要移動的坐標(biāo),想要鼠標(biāo)在mask的中間要除以2。同理y坐標(biāo)也是。
實現(xiàn)遮罩的移動范圍不能超出小圖盒子,且移動時帶動大圖圖片移動
邊界值的判斷,如果小于等于0,則將mask的left等于0,x的有邊界值其實就是小盒子的寬度減去mask的寬度的值。同理y軸就是小盒子的高度減去mask的高度。
帶動大圖移動有個比例關(guān)系。大圖片移動距離 = mask的移動距離*大盒子最大移動距離 / mask的x最大移動距離,

完整代碼

<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最大移動距離
? ? ? 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";
? ? ? // 大圖片移動距離 = mask的移動距離*大盒子最大移動距離 / mask的x最大移動距離
? ? ? 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事件的運用
  • v-show顯示隱藏
  • vue3獲取ref兩種方式其中一種通過setup創(chuàng)建ref響應(yīng)式數(shù)據(jù),暴露出去賦予ref元素的值。第二種是getCurrentInstance方法。
  • offsetWidth、offsetHeight、offsetLeft、offsetTop、pageX、pageY的概念

到此這篇關(guān)于vue3實現(xiàn)淘寶放大鏡效果的示例代碼的文章就介紹到這了,更多相關(guān)vue3 淘寶放大鏡內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • ant design中upload組件上傳大文件,顯示進(jìn)度條進(jìn)度的實例

    ant design中upload組件上傳大文件,顯示進(jìn)度條進(jìn)度的實例

    這篇文章主要介紹了ant design中upload組件上傳大文件,顯示進(jìn)度條進(jìn)度的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • 淺談vue的踩坑路

    淺談vue的踩坑路

    下面小編就為大家?guī)硪黄獪\談vue的踩坑路。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • elementplus實現(xiàn)多級表格(最后一級展示圖片)

    elementplus實現(xiàn)多級表格(最后一級展示圖片)

    本文主要介紹了elementplus實現(xiàn)多級表格(最后一級展示圖片),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • Element-plus表格數(shù)據(jù)延遲加載的實現(xiàn)方案

    Element-plus表格數(shù)據(jù)延遲加載的實現(xiàn)方案

    本文介紹了在前端展示大量數(shù)據(jù)時遇到的加載卡頓問題,并提供了一種解決方案:延遲加載,具體做法是設(shè)置加載數(shù)量,對于數(shù)據(jù)量較大的情況,進(jìn)行分批加載數(shù)據(jù),通過類選擇器找到表格滾動條并進(jìn)行監(jiān)聽綁定事件,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • 9102年webpack4搭建vue項目的方法步驟

    9102年webpack4搭建vue項目的方法步驟

    這篇文章主要介紹了9102年webpack4搭建vue項目的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • vue實現(xiàn)主題切換的多種思路分享

    vue實現(xiàn)主題切換的多種思路分享

    最近一段時間,一直在做主題方面的工作。我們的主題,并不是簡單切換一下顏色,或者排版變化這些,而是變化比較大的主題。比如說:主題1和主題2看起來完全不一樣,功能甚至都不一樣。這樣,通過切換css就無法做到了,因此我思考良久,使用了如下2種方法
    2021-06-06
  • VUE+Element UI實現(xiàn)簡單的表格行內(nèi)編輯效果的示例的代碼

    VUE+Element UI實現(xiàn)簡單的表格行內(nèi)編輯效果的示例的代碼

    這篇文章主要介紹了VUE+Element UI實現(xiàn)簡單的表格行內(nèi)編輯效果的示例的代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-10-10
  • Vue項目依賴包安裝及配置過程

    Vue項目依賴包安裝及配置過程

    這篇文章主要介紹了Vue項目依賴包安裝及配置過程,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-12-12
  • vue3中router路由以及vuex的store使用解析

    vue3中router路由以及vuex的store使用解析

    這篇文章主要介紹了vue3中router路由以及vuex的store使用解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • vue form check 表單驗證的實現(xiàn)代碼

    vue form check 表單驗證的實現(xiàn)代碼

    這篇文章主要介紹了vue form check 表單驗證的實現(xiàn)代碼,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-12-12

最新評論

盐源县| 平山县| 四川省| 兰西县| 河源市| 平顺县| 泽州县| 罗定市| 托里县| 广西| 宁乡县| 宝山区| 盖州市| 江陵县| 兴业县| 读书| 宿迁市| 台南市| 江源县| 渝北区| 尉氏县| 潮州市| 福州市| 呼图壁县| 双辽市| 万年县| 徐闻县| 龙里县| 蒙城县| 合川市| 张北县| 瑞丽市| 瓦房店市| 丰城市| 鄂温| 西吉县| 元氏县| 克山县| 山西省| 贡嘎县| 突泉县|