利用JavaScript實(shí)現(xiàn)仿京東放大鏡效果
功能實(shí)現(xiàn)
1、鼠標(biāo)經(jīng)過小圖片盒子,黃色的遮擋層和大圖片顯示,離開時就隱藏2個盒子功能
2、黃色遮擋層跟著鼠標(biāo)走
把鼠標(biāo)的坐標(biāo)給盒子,不斷地進(jìn)行賦值操作
把鼠標(biāo)地坐標(biāo)給遮擋層不合適,因?yàn)檎趽鯇幼鴺?biāo)以父盒子為準(zhǔn)
首先是獲得鼠標(biāo)在盒子內(nèi)地坐標(biāo)
然后把數(shù)值給遮擋層地left和top值
此時用到鼠標(biāo)移動事件,但是還是在小圖片盒子內(nèi)移動
發(fā)現(xiàn),遮擋層位置不對,需要再減去盒子自身高度和寬度地一半
遮擋層不能超出小圖片盒子范圍
如果小于0,就把坐標(biāo)設(shè)置為0
如果大于遮擋層最大地移動距離,就把坐標(biāo)設(shè)置為最大地移動距離
遮擋層地最大移動距離:小圖片盒子寬度減去遮擋層盒子寬度
3、移動黃色遮擋層,大盒子跟著圖片走



也太難了、、、、
<!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>Document</title>
<style>
.box {
width: 300px;
height: 300px;
position: relative;
border: 1px solid #ccc;
}
.tupian {
width: 100%;
height: 100%;
}
/* 不能是box里面所有地img百分百比例,這樣是無法再大盒子里面移動圖片地 */
.mask {
display: none;
width: 150px;
height: 150px;
background: rgba(228, 248, 138, 0.3);
position: absolute;
top: 0px;
left: 0px;
cursor: move;
}
.big {
display: none;
width: 400px;
height: 400px;
position: absolute;
top: 0px;
left: 310px;
background-color: pink;
overflow: hidden;
}
.big img {
position: absolute;
top: 0px;
left: 400px
}
</style>
</head>
<body>
<div class="box"><img src="http://img14.360buyimg.com/n1/s450x450_jfs/t1/131049/21/21277/105207/61dfcd46E2318f45d/32bd21d7732845bc.jpg" alt="" class="tupian">
<div class="mask"></div>
<div class="big"><img src="http://img14.360buyimg.com/n1/s450x450_jfs/t1/131049/21/21277/105207/61dfcd46E2318f45d/32bd21d7732845bc.jpg" alt="" class="bigimg"></div>
</div>
<script>
//當(dāng)鼠標(biāo)放在box上,箭頭變?yōu)橐苿?
var tupian = document.querySelector('.tupian')
var mask = document.querySelector('.mask')
var big = document.querySelector('.big')
var box = document.querySelector('.box')
var bigimg = document.querySelector('.bigimg')
//鼠標(biāo)放在小圖片上時,黃色遮擋層顯示以及大盒子顯示
box.addEventListener('mouseover', function() { //不能是圖片添加的事件,因?yàn)閙ask一顯示就會把圖片給擋住
mask.style.display = 'block'
big.style.display = 'block'
})
//鼠標(biāo)離開小圖片,就隱藏
box.addEventListener('mouseout', function() {
mask.style.display = 'none'
big.style.display = 'none'
})
box.addEventListener('mousemove', function(e) {
//先計(jì)算出鼠標(biāo)在盒子內(nèi)地坐標(biāo)
var x = e.pageX - box.offsetLeft
var y = e.pageY - box.offsetTop
//減75(盒子地一般)是為了讓鼠標(biāo)位于盒子地中心
//mask移動地距離
var maskx = x - mask.offsetWidth / 2
var masky = y - mask.offsetHeight / 2 //最好這樣賦值一下,就不用考慮if里面地單位情況
//約束--設(shè)置小盒子移動范圍
if (maskx <= 0) {
maskx = 0
} else if (maskx >= box.offsetWidth - mask.offsetWidth) {
maskx = box.offsetWidth - mask.offsetWidth
}
if (masky <= 0) {
masky = 0
} else if (masky >= box.offsetHeight - mask.offsetHeight) {
masky = box.offsetHeight - mask.offsetHeight
}
mask.style.left = maskx + 'px'
mask.style.top = masky + 'px'
var maxMax = box.offsetWidth - mask.offsetWidth //遮擋層地最大移動距離
var bigMax = bigimg.offsetWidth - big.offsetWidth //大圖片地最大移動距離
//大圖片地移動距離
var bigx = maskx * bigMax / maxMax
var bigy = masky * bigMax / maxMax
bigimg.style.left = -bigx + 'px'
bigimg.style.top = -bigy + 'px'
})
// tupian.addEventListener('mouseover', function() {
// tupian.addEventListener('mousemove', function(e1) {
// mask.style.display = 'block'
// var x = e1.pageX - tupian.offsetLeft
// var y = e1.pageY - tupian.offsetTop
// mask.style.left = x - 75 + 'px'
// mask.style.top = y - 75 + 'px'
// if (mask.style.bottom < -10) {
// mask.style.bottom = 0 + 'px'
// }
// })
//讓遮罩層跟隨鼠標(biāo)移動
// div.addEventListener('mousemove', function(e) {
// var a = e.pageX - div.offsetLeft
// var b = e.pageY - div.offsetTop
// if (a > 75) {
// mask.style.left = e.pageX - div.offsetLeft - x + 'px'
// }
// if (mask.style.left < 0) {
// mask.style.left = 0
// }
// if (b > 75) {
// mask.style.top = e.pageY - y + 'px'
// }
// if (mask.style.top < 0) {
// mask.style.top = 0
// }
// mask.style.left = x - 75 + 'px' //鼠標(biāo)并不一定要在mask的正中間
// mask.style.top = y - 75 + 'px'
// div.addEventListener('mousemove', fn)
// function fn(e) { //這個函數(shù)一定要寫在mousedown函數(shù)里面才能取出x和y
// //不能讓白色遮罩層出box盒子
// mask.style.left = e.pageX - x - 75 + 'px'
// mask.style.top = e.pageY - y - 75 + 'px'
// }
// })
//鼠標(biāo)離開盒子就取消移動事件
// div.addEventListener('mouseout', function() {
// div.removeEventListener('mousemove', fn)
// })
// })
</script>
</body>
</html>
復(fù)盤:

<!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>Document</title>
<style>
.box {
width: 300px;
height: 300px;
position: relative;
}
.pre {
width: 100%
}
.mask {
display: none;
position: absolute;
top: 0px;
left: 0px;
width: 100px;
height: 150px;
background-color: pink;
opacity: 0.3;
}
.big {
/* display: none; */
position: absolute;
top: 0px;
left: 310px;
width: 400px;
height: 400px;
background-color: pink;
overflow: hidden;
/* 當(dāng)大盒子里面地圖片出來地時候,就將出來部分地圖片進(jìn)行隱藏 */
}
/* 鼠標(biāo)進(jìn)入小盒子地時候,變?yōu)橐苿?*/
.bigtu {
position: absolute;
top: 0px;
left: 0px;
}
.box:hover {
cursor: move
}
</style>
</head>
<body>
<div class="box">
<img src="http://img14.360buyimg.com/n1/s450x450_jfs/t1/131049/21/21277/105207/61dfcd46E2318f45d/32bd21d7732845bc.jpg" alt="" class="pre">
<div class="mask"></div>
<div class="big"> <img src="http://img14.360buyimg.com/n1/s450x450_jfs/t1/131049/21/21277/105207/61dfcd46E2318f45d/32bd21d7732845bc.jpg" alt="" class="bigtu"></div>
</div>
<script>
//1、鼠標(biāo)進(jìn)入小盒子,遮罩層、大盒子出現(xiàn)
var box = document.querySelector('.box')
var mask = document.querySelector('.mask')
var big = document.querySelector('.big')
var bigtu = document.querySelector('.bigtu')
box.addEventListener('mouseover', function() {
mask.style.display = 'block'
big.style.display = 'block'
})
//2、鼠標(biāo)離開小盒子地時候,遮罩層、大盒子隱藏
box.addEventListener('mouseout', function() {
mask.style.display = 'none'
big.style.display = 'none'
})
//3、添加移動效果,遮罩層跟隨鼠標(biāo)移動,鼠標(biāo)再小盒子地坐標(biāo)就是遮罩層地位置
box.addEventListener('mousemove', function(e) {
//求鼠標(biāo)在小盒子里面地坐標(biāo)
var x = e.pageX - box.offsetLeft
var y = e.pageY - box.offsetTop
//將鼠標(biāo)地坐標(biāo)給遮罩層
// mask.style.left = x + 'px'
// mask.style.top = y + 'px'
//鼠標(biāo)應(yīng)該位于遮罩層地中心位置
var maskx = x - mask.offsetWidth / 2
var masky = y - mask.offsetHeight / 2
//4、應(yīng)該約束遮罩層地移動范圍,也就是約束鼠標(biāo)地位置,maskx、masky要大于0,以及要小于一個值,不能初到底部下面或者右邊地右邊
if (maskx < 0) {
maskx = 0
}
if (maskx > box.offsetWidth - mask.offsetWidth) {
maskx = box.offsetWidth - mask.offsetWidth
}
if (masky < 0) {
masky = 0
}
if (masky > box.offsetHeight - mask.offsetHeight) {
masky = box.offsetHeight - mask.offsetHeight
}
mask.style.left = maskx + 'px'
mask.style.top = masky + 'px'
//5、要讓大盒子里面地圖片移動,加相對定位.原理鼠標(biāo)在小盒子里面移動地距離與鼠標(biāo)在大盒子里面移動地距離是成比例地.其實(shí)就是小盒子圖片地left、top值與大盒子里面地left、top值是成比例地 弄清楚這個比例關(guān)系很重要
var bigtux = maskx * (bigtu.offsetWidth - big.offsetWidth) / (box.offsetWidth - mask.offsetWidth)
var bigtuy = masky * (bigtu.offsetHeight - big.offsetHeight) / (box.offsetHeight - mask.offsetHeight)
bigtu.style.left = -bigtux + 'px'
bigtu.style.top = -bigtuy + 'px'
//應(yīng)該也要對大盒子里面地圖片移動范圍進(jìn)行約束
//忽視了一點(diǎn):bigtu地大小是450*450地,所以大盒子不能直接等于450*450;應(yīng)該小于450*450;這樣圖片在大盒子里面才有移動地余地
//相當(dāng)于左側(cè)地小盒子,對圖片進(jìn)行了縮小,需要在大盒子里面顯示原始圖片,位置對應(yīng)
})
</script>
</body>
</html>以上就是利用JavaScript實(shí)現(xiàn)仿京東放大鏡效果的詳細(xì)內(nèi)容,更多關(guān)于JavaScript放大鏡效果的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
JavaScript中new操作符的原理與實(shí)現(xiàn)詳解
你知道new嗎?你知道new的實(shí)現(xiàn)原理嗎?你能手寫new方法嗎?不要擔(dān)心,這篇文件就來帶大家深入了解一下JavaScript中的new操作符,感興趣的小伙伴可以學(xué)習(xí)一下2022-10-10
Javascript讀取上傳文件內(nèi)容/類型/字節(jié)數(shù)
這篇文章主要為大家詳細(xì)介紹了Javascript讀取上傳文件內(nèi)容/類型/字節(jié)數(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04
JS+cookie實(shí)現(xiàn)購物評價(jià)五星好評功能
這篇文章主要為大家詳細(xì)介紹了JS+cookie實(shí)現(xiàn)購物評價(jià)五星好評功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-09-09
通過實(shí)例了解JS執(zhí)行上下文運(yùn)行原理
這篇文章主要介紹了通過實(shí)例了解JS執(zhí)行上下文運(yùn)行原理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
JavaScript解構(gòu)賦值的5個常見場景與實(shí)例教程
解構(gòu)賦值是一種特殊的語法,它使我們可以將數(shù)組或?qū)ο蟆安鸢睘榈揭幌盗凶兞恐?因?yàn)橛袝r候使用變量更加方便,下面這篇文章主要給大家介紹了關(guān)于JavaScript解構(gòu)賦值的5個常見場景與實(shí)例的相關(guān)資料,需要的朋友可以參考下2021-11-11

