javascript實(shí)現(xià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將盒子,遮罩層、放大圖片頁面編輯好,設(shè)置遮罩層和放大圖片默認(rèn)隱藏
2、獲取元素對象,將大盒子綁定鼠標(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)在遮罩層的中間位置:讓遮罩層相對鼠標(biāo)位置向上向左移動(dòng)一半距離就行
遮罩層的位置- - -給它絕對定位,賦值相對盒子中的向上向左偏移量
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ī)詳情頁</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>
頁面效果:

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JavaScript實(shí)戰(zhàn)(原生range和自定義特效)簡單實(shí)例
下面小編就為大家?guī)硪黄狫avaScript實(shí)戰(zhàn)(原生range和自定義特效)簡單實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-08-08
移動(dòng)端H5開發(fā) Turn.js實(shí)現(xiàn)很棒的翻書效果
這篇文章主要為大家詳細(xì)介紹了Turn.js實(shí)現(xiàn)很棒的翻書效果,對Turn.js翻書效果的實(shí)現(xiàn)進(jìn)行總結(jié),感興趣的小伙伴們可以參考一下2016-06-06
JavaScript中this的9種應(yīng)用場景及三種復(fù)合應(yīng)用場景
本文通過9中應(yīng)用場景給大家分析this關(guān)鍵字的用法,需要了解的朋友可以參考下本文2015-09-09
javascript如何實(shí)現(xiàn)create方法
這篇文章主要介紹了javascript如何實(shí)現(xiàn)create方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
前端微信H5公眾號實(shí)現(xiàn)授權(quán)登錄的方法總結(jié)
這篇文章主要介紹了如何在微信公眾號中實(shí)現(xiàn)網(wǎng)頁授權(quán)功能,包括創(chuàng)建微信服務(wù)公眾號、配置重定向地址、調(diào)試和開發(fā)使用等步驟,文中通過圖文及代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-01-01
微信小程序:報(bào)錯(cuò)(in promise) MiniProgramError
這篇文章主要介紹了微信小程序:報(bào)錯(cuò)(in promise) MiniProgramError,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
如何在javascript 中使用 xmlHttpRequest 發(fā)送 POST
本文將通過不同的示例解釋如何使用JavaScript代碼在AJAX編程中發(fā)送 XMLHttpRequest post 請求,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-07-07

