js實現放大鏡效果

本文在網上找的,爲方便學習可隨意轉載,不必註明作者!


<!DOCTYPE html>

<html>
<head>
<meta charset="gb2312"/>
<title>放大鏡</title>
<style>
img {
vertical-align: bottom;
}


.mod_zoom {
overflow: hidden;
zoom: 1;
}


.mod_zoom .p1 {
float: left;
position: relative;
height: 336px;
width: 350px;
margin-right: 5px;
}


.mod_zoom .p1 .mask {
position: absolute;
left: 0;
top: 0;
width: 175px;
height: 175px;
background-color: #ffffff;
opacity: 0.2;
filter: alpha(opacity=100);
display: none;
}


.mod_zoom .p2 {
position: relative;
width: 400px;
height: 400px;
overflow: hidden;
display: block;
}


.mod_zoom .p2 .img {
position: absolute;
left: 0;
top: 0;
}


.mod_zoom .ph {
width: 100%;
height: 350px;
position: absolute;
top: 0;
left: 0;
cursor: crosshair;
/*background-color:red*/
/*如果給它綁定事件處理函數,IE中不設置background-color屬性就不觸發事件*/
}
</style>
</head>
<body>
<div>
<div class="mod_zoom">
<div class="p1" id="p1">
<img src="2.png" id="z1"/>
<span class="mask" id="m"></span>
<span class="ph" id="eventproxy"></span>
</div>
<div class="p2" id="p2"><!--大圖div-->
<img src="1.png" class="img" id="z2"/>
</div>
</div>
</div>
<script>
function PhotoZoomer(elements) {
this.mask = elements.mask; //蒙版<span class="mask" id="m"></span>
this.container = elements.container; //原圖容器
this.originimg = elements.originimg; //原圖
this.eventproxy = elements.eventproxy;
this.bigContainer = elements.bigContainer; //大圖容器
this.bigimg = elements.bigimg; //大圖
this.visible = false;
this._bind();
}
PhotoZoomer.prototype = {
display: function (style) {
var self = this;
self.mask.style.display = style;
self.bigContainer.style.display = style;
},
//計算放大蒙版位置
zoom: function (clientX, clientY) {
var self = this,
//位置比例
rate = {},
//放大蒙版最大活動範圍
maxrange = {
offsetLeft: self.container.offsetWidth - self.mask.offsetWidth,//原圖容器的寬-蒙版的寬
offsetTop: self.container.offsetHeight - self.mask.offsetHeight
},
//mask left
left = clientX - self.container.offsetLeft - self.mask.offsetWidth / 2,
//mask top
top = clientY - self.container.offsetTop - self.mask.offsetHeight / 2;
if (left < 0) {
left = 0;
} else if (left > maxrange.offsetLeft) {
left = maxrange.offsetLeft;
}
if (top < 0) {
top = 0;
} else if (top > maxrange.offsetTop) {
top = maxrange.offsetTop;
}
//alert(maxrange.offsetTop);
rate.left = left / maxrange.offsetLeft;
rate.top = top / maxrange.offsetTop;
self.mask.style.left = left + 'px';
self.mask.style.top = top + 'px';
self.bigimg.style.left = -rate.left * (self.bigimg.offsetWidth - self.bigContainer.offsetWidth) + "px";
self.bigimg.style.top = -rate.top * (self.bigimg.offsetHeight - self.bigContainer.offsetHeight) + "px";
},
_bind: function () {
var self = this;
self.container.onmouseover = function (e) {
e = e || window.event;
var target = e.targe || e.srcElement;
self.display("block");
this.visible = true;
};
self.container.onmouseout = function (e) {
e = e || window.event;
var target = e.targe || e.srcElement;
self.display("none");
this.visible = false;
};
self.container.onmousemove = function (e) {
e = e || window.event;
if (!this.visible)return;//防止元素大小計算錯誤
self.zoom(e.clientX, e.clientY);
};
}
};
function get(id) {
return document.getElementById(id)
}
var elements = {
mask: get("m"),
container: get("p1"),
originimg: get("z1"),
bigContainer: get("p2"),
bigimg: get("z2"),
eventproxy: get("eventproxy")
};
var zoomer = new PhotoZoomer(elements);
// alert(elements.container.offsetParent.tagName)
</script>
</body>
</html>
發佈了28 篇原創文章 · 獲贊 9 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章