用javascript實(shí)現(xiàn)放大鏡效果
我們經(jīng)常在一些詳情頁(yè)上可以見(jiàn)到放大鏡效果,今天我們也來(lái)做一個(gè)放大鏡樣式。
先來(lái)看一下效果:
圖中的圖片選的不是很好,有些糊了,各位可以重新選擇圖片進(jìn)行做放大鏡案例
這個(gè)案例可以分為三個(gè)功能模塊
1.鼠標(biāo)經(jīng)過(guò)小圖片盒子,黃色的遮擋層和大圖片盒子顯示,離開(kāi)隱藏2個(gè)盒子功能
2.黃色的遮擋層跟隨鼠標(biāo)功能。
3.移動(dòng)黃色遮擋層,大圖片跟隨移動(dòng)功能。
這是我們的html主體部分:
<div class="product_intro clearfix"> ?? ??? ??? ?<!-- 預(yù)覽區(qū)域 --> ?? ??? ??? ?<div class="preview_wrap fl"> ?? ??? ??? ??? ?<div class="preview_img"> ?? ??? ??? ??? ??? ?<img src="img/big5.jpg" class="smallImg"> ?? ??? ??? ??? ??? ?<div class="mask"> ? ?? ??? ??? ??? ??? ?</div> ?? ??? ??? ??? ??? ?<div class="big"> ?? ??? ??? ??? ??? ??? ?<img src="img/big5.jpg" class="bigImg"> ?? ??? ??? ??? ??? ?</div> ?? ??? ??? ??? ?</div> ? ? ?</div> </div>
接下來(lái)是css樣式部分,這里要注意放大鏡部分大圖和小圖部分的隱藏雨顯示以及定位問(wèn)題
.preview_wrap { ? ? ? width: 400px; ? ? ? height: 590px; ?? ??? ??? ?} ? .preview_img { ? ? ? position: relative; ? ? ? height: 398px; ? ? ? border: 1px solid #CCCCCC; ? ? ? background-color: pink;text-align: center; ?? ??? ??? ??? ? ?? ??? ??? ?} ? .preview_img .smallImg { ? ? ? margin-top: 25%; ? ? ? width: 200px; ?? ??? ??? ?} ? .mask { ? ? ? ? display: none; ? ? ? ? position: absolute; ? ? ? ? top: left: 0; ? ? ? ? width: 300px; ? ? ? ? height: 300px; ? ? ? ? background-color: yellow; ? ? ? ?opacity: .5; ? ? ? ?border: 1px solid #CCCCCC; ? ? ? ? cursor: move; ?} ? .big { ? ? ? ?display: none; ? ? ? ?position: absolute; ? ? ? ?left: 410px; ? ? ? ?top: 0; ? ? ? ?width: 500px; ? ? ? ?height: 500px; ? ? ? ?z-index: 999; ? ? ? ?border: 1px solid #ccc; ? ? ? ?overflow: hidden; } .big img { ? ? ? ?position: absolute; ? ? ? ?top: 0; ? ? ? ?left: 0; }
最后來(lái)看javascript部分:
如果重新連接一個(gè)javascript頁(yè)面的話要記得寫(xiě)好<script src="" type="text/javascript" ></script>
并且要加上window.addEventListener('load', function() {},它的作用是當(dāng)頁(yè)面全部加載執(zhí)行完畢后再執(zhí)行js代碼
接下來(lái)是代碼步驟及思路,并且在js代碼里也會(huì)標(biāo)注好
1.鼠標(biāo)經(jīng)過(guò)小圖片盒子,黃色的遮擋層和大圖片盒子顯示,離開(kāi)隱藏2個(gè)盒子功能,就是顯示與隱藏
2.鼠標(biāo)移動(dòng)的時(shí)候,讓黃色的盒子跟著鼠標(biāo)來(lái)走
3.把鼠標(biāo)坐標(biāo)給遮擋層不合適。因?yàn)檎诋?dāng)層坐標(biāo)以父盒子為準(zhǔn)。
4.首先是獲得鼠標(biāo)在盒子的坐標(biāo)
5.之后把數(shù)值給遮擋層做為left和top值。盒子高度 300的一半 150
6.此時(shí)用到鼠標(biāo)移動(dòng)事件,但是還是在小圖片盒子內(nèi)移動(dòng)。mask移動(dòng)的距離
7.遮擋層不能超出小圖片盒子范圍
8.大圖片的移動(dòng)距離=遮擋層移動(dòng)距離*大圖片最大移動(dòng)距離/遮擋層的最大移動(dòng)距離
// 整個(gè)案例可以分為三個(gè)功能模塊 // 鼠標(biāo)經(jīng)過(guò)小圖片盒子,黃色的遮擋層和大圖片盒子顯示,離開(kāi)隱藏2個(gè)盒子功能 // 黃色的遮擋層跟隨鼠標(biāo)功能。 // 移動(dòng)黃色遮擋層,大圖片跟隨移動(dòng)功能。 ? // 1.鼠標(biāo)經(jīng)過(guò)小圖片盒子,黃色的遮擋層和大圖片盒子顯示,離開(kāi)隱藏2個(gè)盒子功能 // 就是顯示與隱藏 ? // 當(dāng)頁(yè)面全部加載執(zhí)行完畢后再執(zhí)行js代碼 window.addEventListener('load', function() { ?? ??? ??? ?var preview_img = document.querySelector('.preview_img'); ?? ??? ??? ?var mask = document.querySelector('.mask'); ?? ??? ??? ?var big = document.querySelector('.big'); ? ?? ??? ??? ?//2.當(dāng)我們鼠標(biāo)經(jīng)過(guò) preview_img 就顯示和隱藏mask遮擋層和 big 大盒子 ?? ??? ??? ?preview_img.addEventListener('mouseover', function() { ?? ??? ??? ??? ?mask.style.display = 'block'; ?? ??? ??? ??? ?big.style.display = 'block'; ?? ??? ??? ?}) ?? ??? ??? ?preview_img.addEventListener('mouseout', function() { ?? ??? ??? ??? ?mask.style.display = 'none'; ?? ??? ??? ??? ?big.style.display = 'none'; ?? ??? ??? ?}) ? ?? ??? ??? ?// 黃色的遮擋層跟隨鼠標(biāo)功能。 ?? ??? ??? ?// 把鼠標(biāo)坐標(biāo)給遮擋層不合適。因?yàn)檎诋?dāng)層坐標(biāo)以父盒子為準(zhǔn)。 ?? ??? ??? ?// 首先是獲得鼠標(biāo)在盒子的坐標(biāo) ?? ??? ??? ?// 之后把數(shù)值給遮擋層做為left和top值。 ?? ??? ??? ?// 此時(shí)用到鼠標(biāo)移動(dòng)事件,但是還是在小圖片盒子內(nèi)移動(dòng)。 ? ?? ??? ??? ?// 2.鼠標(biāo)移動(dòng)的時(shí)候,讓黃色的盒子跟著鼠標(biāo)來(lái)走 ?? ??? ??? ?preview_img.addEventListener('mousemove', function(e) { ?? ??? ??? ??? ?//(1).先計(jì)算出鼠標(biāo)在盒子里的坐標(biāo) ?? ??? ??? ??? ?// 先算出鼠標(biāo)在頁(yè)面中的坐標(biāo),減去盒子距離左側(cè)的距離,就是鼠標(biāo)在盒子里的坐標(biāo) ?? ??? ??? ??? ?// 但是這里要注意: ?? ??? ??? ??? ?// 要看他有沒(méi)有父元素,并且父元素有沒(méi)有定位 ? ?? ??? ??? ??? ?var x = e.pageX - this.offsetLeft; ?? ??? ??? ??? ?var y = e.pageY - this.offsetTop; ?? ??? ??? ??? ?// console.log(x,y) ?? ??? ??? ??? ?//(2)盒子高度 300的一半 150 ?? ??? ??? ??? ?// (3)mask移動(dòng)的距離 ?? ??? ??? ??? ?var maskX = x - mask.offsetWidth / 2; ?? ??? ??? ??? ?var maskY = y - mask.offsetHeight / 2; ? ?? ??? ??? ??? ?// (4)遮擋層不能超出小圖片盒子范圍 ?? ??? ??? ??? ?// 如果小于0,就把坐標(biāo)設(shè)置為0 ? ?? ??? ??? ??? ?//遮擋層的最大一定距離,因?yàn)槎际钦叫?所以高也適用 ?? ??? ??? ??? ?var maskMax = preview_img.offsetWidth - mask.offsetWidth; ?? ??? ??? ??? ?if (maskX <= 0) { ?? ??? ??? ??? ??? ?maskX = 0 ?? ??? ??? ??? ??? ?//如果大于遮擋層最大的移動(dòng)距離,就把坐標(biāo)設(shè)置為最大的移動(dòng)距離 ?? ??? ??? ??? ??? ?//遮擋層的最大移動(dòng)距離:小圖片盒子寬度減去遮擋層盒子寬度 ?? ??? ??? ??? ?} else if (maskX >= maskMax) { ?? ??? ??? ??? ??? ?maskX = maskMax; ?? ??? ??? ??? ?} ?? ??? ??? ??? ?if (maskY <= 0) { ?? ??? ??? ??? ??? ?maskY = 0; ?? ??? ??? ??? ??? ?//如果大于遮擋層最大的移動(dòng)距離,就把坐標(biāo)設(shè)置為最大的移動(dòng)距離 ?? ??? ??? ??? ??? ?//遮擋層的最大移動(dòng)距離:小圖片盒子寬度減去遮擋層盒子寬度 ?? ??? ??? ??? ?} else if (maskY >= maskMax) { ?? ??? ??? ??? ??? ?maskY = maskMax; ?? ??? ??? ??? ?} ? ?? ??? ??? ??? ?mask.style.left = maskX + 'px'; ?? ??? ??? ??? ?mask.style.top = maskY + 'px'; ? ? ?? ??? ??? ??? ?// 移動(dòng)黃色遮擋層, 大圖片跟隨移動(dòng)功能 ?? ??? ??? ??? ?// 求大圖片的移動(dòng)距離公式: ?? ??? ??? ??? ?// ?? ?遮擋層移動(dòng)距離 / 遮擋層最大移動(dòng)距離 = 大圖片移動(dòng)距離 / 大圖片最大移動(dòng)距離 ?? ??? ??? ??? ?// 3.大圖片的移動(dòng)距離=遮擋層移動(dòng)距離*大圖片最大移動(dòng)距離/遮擋層的最大移動(dòng)距離 ?? ??? ??? ??? ?var bigImg = document.querySelector('.bigImg'); //大圖 ?? ??? ??? ??? ?//大圖片最大移動(dòng)距離 ?? ??? ??? ??? ?var bigMax = bigImg.offsetWidth - big.offsetWidth; ?? ??? ??? ??? ?//大圖片最大移動(dòng)距離 ?? ??? ??? ??? ?var bigX = maskX * bigMax / maskMax; ?? ??? ??? ??? ?var bigY = maskY * bigMax / maskMax; ?? ??? ??? ??? ?bigImg.style.left = -bigX + 'px'; ?? ??? ??? ??? ?bigImg.style.top = -bigY + 'px'; ?? ??? ??? ?}) ? ?})
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JavaScript實(shí)現(xiàn)簡(jiǎn)單的Markdown語(yǔ)法解析器
Markdown 是一種輕量級(jí)標(biāo)記語(yǔ)言, 它允許人們使用易讀易寫(xiě)的純文本格式編寫(xiě)文檔,然后轉(zhuǎn)換成有效的 XHTML(或者HTML)文檔。本文將利用JavaScript實(shí)現(xiàn)簡(jiǎn)單的Markdown語(yǔ)法解析器,感興趣的可以了解一下2023-03-03JavaScript+Canvas實(shí)現(xiàn)簡(jiǎn)單的柱狀圖
這篇文章主要為大家詳細(xì)介紹了JavaScript如何利用Canvas實(shí)現(xiàn)繪制簡(jiǎn)單的柱狀圖,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-10-10JsRender for object語(yǔ)法簡(jiǎn)介
這篇文章主要介紹了JsRender for object語(yǔ)法,以實(shí)例形式講述了for Object的用法,需要的朋友可以參考下2014-10-10Rxjs?中處理錯(cuò)誤和抓取錯(cuò)誤的代碼案例
這篇文章主要介紹了Rxjs?中怎么處理和抓取錯(cuò)誤,本文,我們學(xué)習(xí)了如何使用?catchError?在數(shù)據(jù)流中抓取錯(cuò)誤,怎么去修改和返回?observable,或者使用?EMPTY?不去觸發(fā)組件中的錯(cuò)誤,需要的朋友可以參考下2022-08-08js實(shí)現(xiàn)點(diǎn)擊每個(gè)li節(jié)點(diǎn),都彈出其文本值及修改
本篇文章主要分享了js實(shí)現(xiàn)點(diǎn)擊每個(gè)li節(jié)點(diǎn),都彈出其文本值及修改的實(shí)例代碼,具有很好的參考價(jià)值,需要的朋友一起來(lái)看下吧2016-12-12基于js實(shí)現(xiàn)抽紅包并分配代碼實(shí)例
這篇文章主要介紹了基于js實(shí)現(xiàn)抽紅包并分配代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09js實(shí)現(xiàn)固定區(qū)域內(nèi)的不重疊隨機(jī)圓
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)固定區(qū)域內(nèi)的不重疊隨機(jī)圓,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-10-10