0.效果预览
上下方的宽度和高度指的是图片内可移动滑块的长宽,下文以‘放大镜’来称呼该滑块。
基本功能
- 移动放大镜来选择需要放大的区域。
- 可以根据需求调整放大镜尺寸和倍数,默认放大镜尺寸为50px*50px,放大倍数为2倍。
- 上下滑动鼠标滚轮来放大(缩小)放大镜尺寸。
- 下方实时显示放大镜当前尺寸和放大倍数。
eg: 调整放大镜大小来显示一行英文
1.原理讲解
HTML部分
<body>
<div id="parent">
<div id="setting">
<span id="set">Setting</span> <span>宽:</span><input type="text" id="mgfW"><span>高:</span><input type="text" id="mgfH"><span>倍数:</span><input type="text" id="times">
<input type="button" value="确认" id="sure">
</div>
<div id="curPic">
<div id="mgf"></div>
<img src="./0.jpg" />
</div>
<p id="inF">当前宽度:<span id ="curW"></span> 当前高度:<span id="curH"></span> 当前倍数:<span id="curT"></span></p>
<div id="boxEnlarge">
<img src="./0.jpg" />
</div>
</div>
</body>
CSS部分
#parent{
position: relative;
margin: 50px auto;
}
#setting{
position: absolute;
width: 400px;
top:20px;
left: 50px;
text-align: center;
font-family: SimSun;
}
#inF{
position: absolute;
left: 50px;
width: 400px;
top: 440px;
text-align: center;
font-family: Simsun;
}
#curW, #curH, #curT{
color: blue;
}
#set{
font-weight: bold;
font-style: italic;
}
#sure{
font-family: Simsun;
color:red;
}
#mgfH, #mgfW, #times{
width: 50px;
}
#curPic{
position: absolute;
top: 50px;
left: 50px;
}
#curPic:hover{
cursor: move;
}
#curPic img{
width: 400px;
height: 400px;
}
#mgf{
display: none;
position: absolute;
top: 0;
left: 0;
background-color: rgba(255, 230, 93, 0.3);
}
#boxEnlarge{
display: none;
position: absolute;
top: 50px;
left: 550px;
overflow: hidden;
}
准备一张图片(最好是大图),默认显示区和放大区域两部分放入该图片,默认区域和内部的图片大小事先是设置好了的,放大区域和内部的图片大小之后根据放大倍数设置 。
JS部分
①控制放大区域和放大镜的显示与隐藏
var parent = document.getElementById('parent');
var curpic = document.getElementById('curPic');
var mgf = document.getElementById("mgf");
var boxEnlarge = document.getElementById("boxEnlarge");
/*鼠标移至图片范围时,显示‘放大镜’和放大区域*/
curpic.onmouseover = function(){
var mgf = document.getElementById("mgf");
mgf.style.display = "block";
boxEnlarge.style.display = "block";
}
/*鼠标移出图片范围时,隐藏‘放大镜’和放大区域*/
curpic.onmouseout = function(){
var mgf = document.getElementById("mgf");
mgf.style.display = "none";
boxEnlarge.style.display = "none";
}
②放大镜的倍数和尺寸设置
/*默认‘放大镜’尺寸和放大倍数*/
var times = 2;
var mgfW = 50;
var mgfH = 50;
var curT = document.getElementById('curT');
var curW = document.getElementById('curW');
var curH = document.getElementById('curH');
curT.innerText = 2+'倍';
curW.innerText = 50+'px';
curH.innerText = 50+'px;'
mgf.style.width = mgfW + 'px';
mgf.style.height = mgfH + 'px';
/*自定义‘放大镜’尺寸和放大倍数*/
var button = document.getElementById('sure');
button.onclick = function (){//点击确认按钮触发事件
times = document.getElementById('times').value;
mgfH = document.getElementById('mgfH').value;
mgfW = document.getElementById('mgfW').value;
if(mgfH > curpic.offsetHeight){
mgfH = curpic.offsetHeight;
}
if(mgfW > curpic.offsetWidth){
mgfW = curpic.offsetWidth;
}
mgf.style.width = mgfW + 'px';
mgf.style.height = mgfH + 'px';
curH.innerText = mgfH + 'px';
curW.innerText = mgfW + 'px';
curT.innerText = times + '倍';
}
③放大镜随鼠标移动
/*‘放大镜’随鼠标移动*/
curpic.onmousemove = function(){
Move();
}
function Move(e){
/*根据‘放大镜’和放大倍数设置放大区域大小*/
boxEnlarge.style.width = mgf.offsetWidth*times + 'px';
boxEnlarge.style.height = mgf.offsetHeight*times + 'px';
/*鼠标移至‘放大镜’中心*/
e = e || event;
var mgfx = e.clientX - curpic.offsetLeft - parent.offsetLeft - mgf.offsetWidth/2;
var mgfy = e.clientY - curpic.offsetTop - parent.offsetTop - mgf.offsetHeight/2;
if(mgfx<0){
mgfx = 0;
}
if(mgfx >= curpic.offsetWidth-mgf.offsetWidth){
mgfx = curpic.offsetWidth-mgf.offsetWidth;
}
if(mgfy<0){
mgfy = 0;
}
if(mgfy >= curpic.offsetHeight-mgf.offsetHeight){
mgfy = curpic.offsetHeight-mgf.offsetHeight;
}
mgf.style.left = mgfx + 'px';
mgf.style.top = mgfy + 'px';
/*设置放大的图片尺寸并根据‘放大镜’的移动调整显示区域*/
var pic = boxEnlarge.children[0];
pic.style.width = curpic.offsetWidth*times + 'px';
pic.style.height = curpic.offsetHeight*times + 'px';
pic.style.marginLeft = ((-1)*mgf.offsetLeft*times)+'px';
pic.style.marginTop = ((-1)*mgf.offsetTop*times)+'px';
}
④鼠标滚动放大(缩小)放大镜
//未设置兼容性
curpic.onmousewheel = function(e){
if(e.wheelDelta>0){
if(mgf.offsetWidth*1.5 > curpic.offsetWidth){
mgf.style.width = curpic.offsetWidth + 'px';
return;
}
if(mgf.offsetHeight*1.5 > curpic.offsetHeight){
mgf.style.height = curpic.offsetHeight + 'px';
return;
}
mgf.style.width=mgf.offsetWidth*1.5 +'px';
mgf.style.height=mgf.offsetHeight*1.5 +'px';
}
if(e.wheelDelta<0){
mgf.style.width= parseInt(mgf.offsetWidth/1.5) +'px';
mgf.style.height=parseInt(mgf.offsetHeight/1.5) +'px';
}
curH.innerText = mgf.offsetHeight + 'px';
curW.innerText = mgf.offsetWidth + 'px';
Move();
}
2.完整代码
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>放大镜</title>
<style>
#parent{
position: relative;
margin: 50px auto;
}
#setting{
position: absolute;
width: 400px;
top:20px;
left: 50px;
text-align: center;
font-family: SimSun;
}
#inF{
position: absolute;
left: 50px;
width: 400px;
top: 440px;
text-align: center;
font-family: Simsun;
}
#curW, #curH, #curT{
color: blue;
}
#set{
font-weight: bold;
font-style: italic;
}
#sure{
font-family: Simsun;
color:red;
}
#mgfH, #mgfW, #times{
width: 50px;
}
#curPic{
position: absolute;
top: 50px;
left: 50px;
}
#curPic:hover{
cursor: move;
}
#curPic img{
width: 400px;
height: 400px;
}
#mgf{
display: none;
position: absolute;
top: 0;
left: 0;
background-color: rgba(255, 230, 93, 0.3);
}
#boxEnlarge{
display: none;
position: absolute;
top: 50px;
left: 550px;
overflow: hidden;
}
</style>
<script>
window.onload = function(){
var parent = document.getElementById('parent');
var curpic = document.getElementById('curPic');
var mgf = document.getElementById("mgf");
var boxEnlarge = document.getElementById("boxEnlarge");
curpic.onmouseover = function(){
var mgf = document.getElementById("mgf");
mgf.style.display = "block";
boxEnlarge.style.display = "block";
}
curpic.onmouseout = function(){
var mgf = document.getElementById("mgf");
mgf.style.display = "none";
boxEnlarge.style.display = "none";
}
var times = 2;
var mgfW = 50;
var mgfH = 50;
var curT = document.getElementById('curT');
var curW = document.getElementById('curW');
var curH = document.getElementById('curH');
curT.innerText = 2+'倍';
curW.innerText = 50+'px';
curH.innerText = 50+'px;'
mgf.style.width = mgfW + 'px';
mgf.style.height = mgfH + 'px';
var button = document.getElementById('sure');
button.onclick = function (){
times = document.getElementById('times').value;
mgfH = document.getElementById('mgfH').value;
mgfW = document.getElementById('mgfW').value;
if(mgfH > curpic.offsetHeight){
mgfH = curpic.offsetHeight;
}
if(mgfW > curpic.offsetWidth){
mgfW = curpic.offsetWidth;
}
mgf.style.width = mgfW + 'px';
mgf.style.height = mgfH + 'px';
curH.innerText = mgfH + 'px';
curW.innerText = mgfW + 'px';
curT.innerText = times + '倍';
}
curpic.onmousewheel = function(e){
if(e.wheelDelta>0){
if(mgf.offsetWidth*1.5 > curpic.offsetWidth){
mgf.style.width = curpic.offsetWidth + 'px';
return;
}
if(mgf.offsetHeight*1.5 > curpic.offsetHeight){
mgf.style.height = curpic.offsetHeight + 'px';
return;
}
mgf.style.width=mgf.offsetWidth*1.5 +'px';
mgf.style.height=mgf.offsetHeight*1.5 +'px';
}
if(e.wheelDelta<0){
mgf.style.width= parseInt(mgf.offsetWidth/1.5) +'px';
mgf.style.height=parseInt(mgf.offsetHeight/1.5) +'px';
}
curH.innerText = mgf.offsetHeight + 'px';
curW.innerText = mgf.offsetWidth + 'px';
Move();
}
curpic.onmousemove = function(){
Move();
}
function Move(e){
boxEnlarge.style.width = mgf.offsetWidth*times + 'px';
boxEnlarge.style.height = mgf.offsetHeight*times + 'px';
e = e || event;
var mgfx = e.clientX - curpic.offsetLeft - parent.offsetLeft - mgf.offsetWidth/2;
var mgfy = e.clientY - curpic.offsetTop - parent.offsetTop - mgf.offsetHeight/2;
if(mgfx<0){
mgfx = 0;
}
if(mgfx >= curpic.offsetWidth-mgf.offsetWidth){
mgfx = curpic.offsetWidth-mgf.offsetWidth;
}
if(mgfy<0){
mgfy = 0;
}
if(mgfy >= curpic.offsetHeight-mgf.offsetHeight){
mgfy = curpic.offsetHeight-mgf.offsetHeight;
}
mgf.style.left = mgfx + 'px';
mgf.style.top = mgfy + 'px';
var pic = boxEnlarge.children[0];
pic.style.width = curpic.offsetWidth*times + 'px';
pic.style.height = curpic.offsetHeight*times + 'px';
pic.style.marginLeft = ((-1)*mgf.offsetLeft*times)+'px';
pic.style.marginTop = ((-1)*mgf.offsetTop*times)+'px';
}
}
</script>
</head>
<body>
<div id="parent">
<div id="setting">
<span id="set">Setting</span> <span>宽:</span><input type="text" id="mgfW"><span>高:</span><input type="text" id="mgfH"><span>倍数:</span><input type="text" id="times">
<input type="button" value="确认" id="sure">
</div>
<div id="curPic">
<div id="mgf"></div>
<img src="./0.jpg" />
</div>
<p id="inF">当前宽度:<span id ="curW"></span> 当前高度:<span id="curH"></span> 当前倍数:<span id="curT"></span></p>
<div id="boxEnlarge">
<img src="./0.jpg" />
</div>
</div>
</body>
</html>
如有错误,欢迎指正~