0.效果預(yù)覽
預(yù)覽.png
上下方的寬度和高度指的是圖片內(nèi)可移動滑塊的長寬般甲,下文以‘放大鏡’來稱呼該滑塊免钻。
基本功能
- 移動放大鏡來選擇需要放大的區(qū)域另患。
- 可以根據(jù)需求調(diào)整放大鏡尺寸和倍數(shù)凭语,默認放大鏡尺寸為50px*50px,放大倍數(shù)為2倍薄啥。
- 上下滑動鼠標(biāo)滾輪來放大(縮性稹)放大鏡尺寸。
- 下方實時顯示放大鏡當(dāng)前尺寸和放大倍數(shù)垄惧。
eg: 調(diào)整放大鏡大小來顯示一行英文
image.png
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>倍數(shù):</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">當(dāng)前寬度:<span id ="curW"></span> 當(dāng)前高度:<span id="curH"></span> 當(dāng)前倍數(shù):<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;
}
準備一張圖片(最好是大圖)刁愿,默認顯示區(qū)和放大區(qū)域兩部分放入該圖片,默認區(qū)域和內(nèi)部的圖片大小事先是設(shè)置好了的到逊,放大區(qū)域和內(nèi)部的圖片大小之后根據(jù)放大倍數(shù)設(shè)置 铣口。
JS部分
①控制放大區(qū)域和放大鏡的顯示與隱藏
var parent = document.getElementById('parent');
var curpic = document.getElementById('curPic');
var mgf = document.getElementById("mgf");
var boxEnlarge = document.getElementById("boxEnlarge");
/*鼠標(biāo)移至圖片范圍時,顯示‘放大鏡’和放大區(qū)域*/
curpic.onmouseover = function(){
var mgf = document.getElementById("mgf");
mgf.style.display = "block";
boxEnlarge.style.display = "block";
}
/*鼠標(biāo)移出圖片范圍時觉壶,隱藏‘放大鏡’和放大區(qū)域*/
curpic.onmouseout = function(){
var mgf = document.getElementById("mgf");
mgf.style.display = "none";
boxEnlarge.style.display = "none";
}
②放大鏡的倍數(shù)和尺寸設(shè)置
/*默認‘放大鏡’尺寸和放大倍數(shù)*/
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';
/*自定義‘放大鏡’尺寸和放大倍數(shù)*/
var button = document.getElementById('sure');
button.onclick = function (){//點擊確認按鈕觸發(fā)事件
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 + '倍';
}
③放大鏡隨鼠標(biāo)移動
/*‘放大鏡’隨鼠標(biāo)移動*/
curpic.onmousemove = function(){
Move();
}
function Move(e){
/*根據(jù)‘放大鏡’和放大倍數(shù)設(shè)置放大區(qū)域大小*/
boxEnlarge.style.width = mgf.offsetWidth*times + 'px';
boxEnlarge.style.height = mgf.offsetHeight*times + 'px';
/*鼠標(biāo)移至‘放大鏡’中心*/
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';
/*設(shè)置放大的圖片尺寸并根據(jù)‘放大鏡’的移動調(diào)整顯示區(qū)域*/
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';
}
④鼠標(biāo)滾動放大(縮心蕴狻)放大鏡
//未設(shè)置兼容性
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>倍數(shù):</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">當(dāng)前寬度:<span id ="curW"></span> 當(dāng)前高度:<span id="curH"></span> 當(dāng)前倍數(shù):<span id="curT"></span></p>
<div id="boxEnlarge">
<img src="./0.jpg" />
</div>
</div>
</body>
</html>
如有錯誤,歡迎指正~