javascript實(shí)現(xiàn)簡(jiǎn)單放大鏡效果
一個(gè)大盒子中有一張圖片,鼠標(biāo)放上去會(huì)出現(xiàn)一個(gè)半透明的遮罩層,鼠標(biāo)移動(dòng),遮罩層跟著移動(dòng),盒子旁邊還有一個(gè)放大的圖片,跟著遮罩層移動(dòng)的位置而改變放大圖的位置,鼠標(biāo)離開大盒子,遮罩層和放大圖片消失
實(shí)現(xiàn)思路
1、html、css將盒子,遮罩層、放大圖片頁(yè)面編輯好,設(shè)置遮罩層和放大圖片默認(rèn)隱藏
2、獲取元素對(duì)象,將大盒子綁定鼠標(biāo)事件
鼠標(biāo)經(jīng)過- - -mouseover,鼠標(biāo)經(jīng)過時(shí)設(shè)置遮罩層和放大圖顯示:display設(shè)置成'block'
鼠標(biāo)離開- - -mouseout,鼠標(biāo)經(jīng)過時(shí)設(shè)置遮罩層和放大圖顯示:display設(shè)置成'none'
3、計(jì)算出鼠標(biāo)在大盒子中的位置
4、讓鼠標(biāo)在遮罩層的中間位置:讓遮罩層相對(duì)鼠標(biāo)位置向上向左移動(dòng)一半距離就行
遮罩層的位置- - -給它絕對(duì)定位,賦值相對(duì)盒子中的向上向左偏移量
5、限制遮罩層在大盒子里移動(dòng)- - -判斷偏移量的值,<=0 的時(shí)候,偏移量為0
6、放大圖隨著遮罩層的移動(dòng)而改變位置
遮罩層移動(dòng)值 / 遮罩層移動(dòng)最大距離 = 放大圖移動(dòng)距離 / 放大圖移動(dòng)最大距離
根據(jù)這個(gè)關(guān)系式,得到放大圖的移動(dòng)距離
將移動(dòng)距離賦值給放大圖的偏移量top、left
注意:放大圖的偏移量給成負(fù)值,和遮罩層移動(dòng)方向相反
代碼示例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>手機(jī)詳情頁(yè)</title> <!-- <link rel="stylesheet" href="css/detail.css" > <script src="js/detail.js"></script> --> <style> * { margin: 0; padding: 0; } .detail-content { width: 1200px; margin: 0 auto; } img { border: 0; vertical-align: middle; } .preview_img { position: relative; width: 400px; height: 400px; margin-top: 30px; border: 1px solid #ccc; } .preview_img img { width: 100%; height: 100%; } .mask { display: none; position: absolute; top: 0; left: 0; width: 300px; height: 300px; background-color: pink; opacity: .5; cursor: move; } .big { display: none; position: absolute; top: 0; left: 410px; width: 500px; height: 500px; border: 1px solid #ccc; background-color: pink; z-index: 999; overflow: hidden; } .big img { position: absolute; top: 0; left: 0; width: 800px; height: 800px; } </style> </head> <body> <div class="detail-content"> <div class="preview_img"> <img src="upload/s3.png" alt=""> <div class="mask"></div> <div class="big"> <img src="upload/big.jpg" alt="" class="bigImg"> </div> </div> </div> <script> var previewImg = document.querySelector('.preview_img'); var mask = document.querySelector('.mask'); var big = document.querySelector('.big'); var bigImg = document.querySelector('.bigImg'); // 鼠標(biāo)經(jīng)過盒子事件 previewImg.addEventListener('mouseover', function() { // 設(shè)置遮擋層和放大圖顯示 mask.style.display = 'block'; big.style.display = 'block'; }) // 鼠標(biāo)離開盒子事件 previewImg.addEventListener('mouseout', function() { // 設(shè)置遮擋層和放大圖隱藏 mask.style.display = 'none'; big.style.display = 'none'; }) // 鼠標(biāo)在盒子內(nèi)移動(dòng)事件 previewImg.addEventListener('mousemove', function(e) { // 獲取鼠標(biāo)在盒子中的位置 var x = e.pageX - this.offsetLeft; var y = e.pageY - this.offsetTop; // 計(jì)算出遮擋層的移動(dòng)值,讓鼠標(biāo)在遮擋層中間位置 var maskX = x - mask.offsetWidth / 2; var maskY = y - mask.offsetHeight / 2; // 盒子為正方形,所以只算最大水平方向 X軸 移動(dòng)值就行,Y軸最大移動(dòng)值和 X軸 一致 var maskMax = previewImg.offsetWidth - mask.offsetWidth; // 限制遮擋層在盒子內(nèi)移動(dòng) if (maskX <= 0) { maskX = 0; } else if (maskX >= maskMax) { maskX = maskMax; } if (maskY <= 0) { maskY = 0; } else if (maskY >= maskMax) { maskY = maskMax; } mask.style.left = maskX + 'px'; mask.style.top = maskY + 'px'; // 計(jì)算出放大圖的最大移動(dòng)值,大圖水平移動(dòng)值 = 遮擋層移動(dòng)值 * 大圖最大移動(dòng)距離 / 遮擋層最大移動(dòng)距離 var bigMax = bigImg.offsetWidth - big.offsetWidth; var bigX = maskX * bigMax / maskMax; var bigY = maskY * bigMax / maskMax; bigImg.style.left = -bigX + 'px'; bigImg.style.top = -bigY + 'px'; }) </script> </body> </html>
頁(yè)面效果:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JavaScript實(shí)現(xiàn)短暫提示框功能
這篇文章主要介紹了JavaScript實(shí)現(xiàn)短暫提示框功能,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-04-04js?window.addEventListener?簡(jiǎn)介
window.addEventListener是JavaScript中用于添加事件監(jiān)聽器的方法,允許在發(fā)生特定事件時(shí)執(zhí)行函數(shù),本文給大家介紹js?window.addEventListener?是什么,感興趣的朋友一起看看吧2024-09-09for循環(huán) + setTimeout 結(jié)合一些示例(前端面試題)
最近在學(xué)習(xí)node.js開發(fā)資料,正好碰到了for循環(huán)+settimeout的經(jīng)典例子,下面小編給大家分享for循環(huán) + setTimeout 結(jié)合一些示例代碼,需要的朋友參考下吧2017-08-08JavaScript asp.net 獲取當(dāng)前超鏈接中的文本
今天用到,不會(huì)。網(wǎng)上找到一個(gè)方法,趕快記下來。可以獲取超鏈接的鏈接文本。2009-04-04微信小程序?qū)崿F(xiàn)觸底加載與下拉刷新的示例代碼
本文主要介紹了微信小程序?qū)崿F(xiàn)觸底加載與下拉刷新的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05javascript定義類和類的實(shí)現(xiàn)實(shí)例詳解
這篇文章主要介紹了javascript定義類和類的實(shí)現(xiàn),結(jié)合實(shí)例形式較為詳細(xì)的分析了JavaScript類的定義方式與相關(guān)使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-12-12javaScript中slice函數(shù)用法實(shí)例分析
這篇文章主要介紹了javaScript中slice函數(shù)用法,較為詳細(xì)的分析了javascript中slice函數(shù)的功能、定義及使用方法,需要的朋友可以參考下2015-06-06ES6數(shù)組復(fù)制和填充方法copyWithin()、fill()的具體使用
本文主要介紹了ES6數(shù)組復(fù)制和填充方法copyWithin()、fill()的具體使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10