前言:在拿到一個(gè)需求之前赏壹,我們要先進(jìn)行分析帜乞,再設(shè)計(jì),最后實(shí)現(xiàn)代碼的編寫以及調(diào)試牡昆。
放大鏡的原理分析
- 鼠標(biāo)在小圖片上移動(dòng)時(shí),通過捕獲鼠標(biāo)在小圖片上的位置,定位大圖片的相應(yīng)位置
放大鏡特效設(shè)計(jì)
- 頁面元素
- 技術(shù)點(diǎn):事件捕獲、定位
- 難點(diǎn):計(jì)算
代碼編寫,Github源碼下載 [https://github.com/galyean-gong/function.git ]
<!DOCTYPE html>
<html>
<head>
<title>放大鏡特效</title>
</head>
<style type="text/css">
* {
margin: 0;
padding: 0
}
#demo {
display: block;
width: 400px;
height: 255px;
margin: 50px;
position: relative;
border: 1px solid #ccc;
}
#small-box {
position: relative;
z-index: 1;
}
#float-box {
display: none;
width: 160px;
height: 120px;
position: absolute;
background: #ffffcc;
border: 1px solid #ccc;
filter: alpha(opacity=50);
opacity: 0.5;
}
#mark {
position: absolute;
display: block;
width: 400px;
height: 255px;
background-color: #fff;
filter: alpha(opacity=0);
opacity: 0;
z-index: 10;
}
#big-box {
display: none;
position: absolute;
top: 0;
left: 460px;
width: 400px;
height: 300px;
overflow: hidden;
border: 1px solid #ccc;
z-index: 1;;
}
#big-box img {
position: absolute;
z-index: 5
}
</style>
<body>
<div id="demo">
<div id="small-box">
<div id="mark"></div>
<div id="float-box"></div>

</div>
<div id="big-box">

</div>
</div>
<!-- offsetLeft 子元素想當(dāng)父元素的左位移
offsetTop 子元素想當(dāng)父元素的上位移
offsetWidth 盒子本身的寬高 不包括滾動(dòng)條
event.clientX 鼠標(biāo)的X憔辫,Y軸相對(duì)與整個(gè)頁面,而非子元素
-->
<script type="text/javascript">
//頁面加載完畢后執(zhí)行
window.onload = function () {
var objDemo = document.getElementById("demo");
var objSmallBox = document.getElementById("small-box");
var objMark = document.getElementById("mark");
var objFloatBox = document.getElementById("float-box");
var objBigBox = document.getElementById("big-box");
var objBigBoxImage = objBigBox.getElementsByTagName("img")[0];
objMark.onmouseover = function () {
objFloatBox.style.display = "block"
objBigBox.style.display = "block"
}
objMark.onmouseout = function () {
objFloatBox.style.display = "none"
objBigBox.style.display = "none"
}
objMark.onmousemove = function (ev) {
var _event = ev || window.event; //兼容多個(gè)瀏覽器的event參數(shù)模式
var left = _event.clientX - objDemo.offsetLeft - objSmallBox.offsetLeft - objFloatBox.offsetWidth / 2;
var top = _event.clientY - objDemo.offsetTop - objSmallBox.offsetTop - objFloatBox.offsetHeight / 2;
if (left < 0) {
left = 0;
} else if (left > (objMark.offsetWidth - objFloatBox.offsetWidth)) {
left = objMark.offsetWidth - objFloatBox.offsetWidth;
}
if (top < 0) {
top = 0;
} else if (top > (objMark.offsetHeight - objFloatBox.offsetHeight)) {
top = objMark.offsetHeight - objFloatBox.offsetHeight;
}
objFloatBox.style.left = left + "px"; //oSmall.offsetLeft的值是相對(duì)什么而言
objFloatBox.style.top = top + "px";
var percentX = left / (objMark.offsetWidth - objFloatBox.offsetWidth);
var percentY = top / (objMark.offsetHeight - objFloatBox.offsetHeight);
objBigBoxImage.style.left = -percentX * (objBigBoxImage.offsetWidth - objBigBox.offsetWidth) + "px";
objBigBoxImage.style.top = -percentY * (objBigBoxImage.offsetHeight - objBigBox.offsetHeight) + "px";
}
}
</script>
</body>
</html>