html中放大镜案列,HTML放大镜的一种实现及原理讲解(js)

0.效果预览

499ddf24c49c

预览.png

上下方的宽度和高度指的是图片内可移动滑块的长宽,下文以‘放大镜’来称呼该滑块。

基本功能

移动放大镜来选择需要放大的区域。

可以根据需求调整放大镜尺寸和倍数,默认放大镜尺寸为50px*50px,放大倍数为2倍。

上下滑动鼠标滚轮来放大(缩小)放大镜尺寸。

下方实时显示放大镜当前尺寸和放大倍数。

eg: 调整放大镜大小来显示一行英文

499ddf24c49c

image.png

1.原理讲解

HTML部分

Setting 宽:高:倍数:

0.jpg

当前宽度: 当前高度: 当前倍数:

0.jpg

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.完整代码

放大镜

#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;

}

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';

}

}

Setting 宽:高:倍数:

0.jpg

当前宽度: 当前高度: 当前倍数:

0.jpg

如有错误,欢迎指正~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值