利用js写出的放大镜效果

利用JavaScript写出放大镜效果(素材由pink老师 黑马程序猿提供)

在一些购物网站上购买一些物品时可以对物品进行放大观看物品,提高用户体验,那么接下来就谈一下如何利用js写出放大镜的效果

首先理清思路,当鼠标移动到晓得图片中,就会出现放大镜效果,随着鼠标的移动,放大镜中的图片也随之移动,所以有三种鼠标事件 onmouseover(鼠标滑过)、 onmouseout(鼠标离开)和onmousemove(鼠标移动)

当鼠标滑过时,放大镜效果出现,当鼠标离开时,放大镜效果消失

html

<div class="preview_wrap fl">
                <div class="preview_img">
                    <img src="upload/ph_02.png" alt="#"/>
                    <div class="mask"></div>
                    <div class="big"><img src="upload/big.jpg" alt="#" class="bigImg"/></div>
                </div>
<div/>

鼠标滑过效果

 var preview_img = document.querySelector('.preview_img');
    var mask = document.querySelector('.mask');
    var big = document.querySelector('.big');
    //当鼠标经过 preview_img 就显示隐藏 mask 和 big
    preview_img.addEventListener('mouseover',function() {
        mask.style.display = 'block';
        big.style.display = 'block';
    });
    preview_img.addEventListener('mouseout',function() {
        mask.style.display = 'none';
        big.style.display = 'none';
    });

在这里插入图片描述
黄色得到遮挡层要跟随鼠标移动:
把鼠标的坐标赋值给黄色的盒子:黄色盒子有定位,要以父盒子为起始坐标,所以要把鼠标在盒子内的坐标赋值给盒子。
获取鼠标在盒子内的坐标要利用鼠标在整个页面的left值-父盒子距离页面的lfet值 也就是

var x = e.pageX - this.offsetLeft;//this为父盒子
var y = e.pageY - this.offsetTop;

把鼠标获取的坐标赋值给黄色盒子,不过要注意的是黄色盒子的起始坐标为左上角,要想鼠标在盒子中间移动,需要让盒子向上向左走高度与宽度的一半即可

 var maskX = x - this.offsetWidth / 2;
 var maskY = y - this.offsetWidth / 2;

在这里插入图片描述
到这里会出现这样的问题 我们没有设置黄色盒子的移动范围,所以会移出父盒子,所以还要给黄色盒子设置一个移动范围

var maskMax = preview_img.offsetWidth - mask.offsetWidth;//最大移动距离是父盒子宽度-子盒子宽度
        if(maskX <= 0) {
            maskX = 0;
        }else if(maskX >= maskMax) {
            maskX = maskMax;
        }
        if(maskY <= 0) {
            maskY = 0;
        }else if(maskY >= maskMax) {
            maskY = maskMax;
        }

最后就可以把鼠标在父盒子里的坐标赋值给黄色盒子

 mask.style.left = maskX  + 'px';
 mask.style.top =  maskY + 'px';

做完黄色盒子移动效果,接下来要让大图片跟随黄色盒子的移动而移动

按照比例移动
大图片的移动距离 = 遮挡层移动距离 * 大图片的最大移动距离 / 遮挡层的最大移动距离

var bigImg = document.querySelector('.bigImg');
        var bigMax = bigImg.offsetWidth - big.offsetWidth;//大图片最大移动距离
        var bigX = maskX * bigMax / maskMax;
        var bigY = maskY * bigMax / maskMax;
        bigImg.style.left = -bigX + 'px';
        bigImg.style.top = -bigY + 'px';

注意最后黄色盒子移动方向和大图移动方向相反,所以最后赋值要加 ’ - ’ 号

完整js代码

var preview_img = document.querySelector('.preview_img');
    var mask = document.querySelector('.mask');
    var big = document.querySelector('.big');
    //当鼠标经过 preview_img 就显示隐藏 mask 和 big
    preview_img.addEventListener('mouseover',function() {
        mask.style.display = 'block';
        big.style.display = 'block';
    });
    preview_img.addEventListener('mouseout',function() {
        mask.style.display = 'none';
        big.style.display = 'none';
    });
    //鼠标位置 鼠标距离页面位置-盒子距离页面位置
    preview_img.addEventListener('mousemove',function(e) {
        var x = e.pageX - this.offsetLeft;
        var y = e.pageY - this.offsetTop;
        var maskX = x - this.offsetWidth / 2;
        var maskY = y - this.offsetWidth / 2;
        var maskMax = preview_img.offsetWidth - mask.offsetWidth;
        if(maskX <= 0) {
            maskX = 0;
        }else if(maskX >= maskMax) {
            maskX = maskMax;
        }
        if(maskY <= 0) {
            maskY = 0;
        }else if(maskY >= maskMax) {
            maskY = maskMax;
        }
        mask.style.left = maskX  + 'px';
        mask.style.top =  maskY + 'px';
        //大图片的移动距离 = 遮挡层移动距离 * 大图片的最大移动距离 / 遮挡层的最大移动距离
       var bigImg = document.querySelector('.bigImg');
        var bigMax = bigImg.offsetWidth - big.offsetWidth;
        var bigX = maskX * bigMax / maskMax;
        var bigY = maskY * bigMax / maskMax;
        bigImg.style.left = -bigX + 'px';
        bigImg.style.top = -bigY + 'px';
    })
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基本的放大镜效果的HTML、CSS和JavaScript代码示例: HTML代码: ```html <div class="container"> <div class="image-zoom"> <img src="image.jpg" alt="Image"> <div class="zoom-overlay"></div> </div> </div> ``` CSS代码: ```css .container { max-width: 800px; margin: 0 auto; } .image-zoom { position: relative; width: 400px; height: 400px; overflow: hidden; } .image-zoom img { display: block; max-width: 100%; height: auto; } .zoom-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; opacity: 0; background: rgba(255, 255, 255, 0.5); cursor: crosshair; z-index: 1; } .zoom-overlay.active { opacity: 1; } .zoom-overlay .zoom { position: absolute; top: 0; left: 0; width: 200px; height: 200px; border: 1px solid #ccc; background: #fff; background-image: url('image.jpg'); background-size: 800px 800px; background-repeat: no-repeat; background-position: 0 0; z-index: 2; pointer-events: none; opacity: 0; transition: opacity 0.2s; } .zoom-overlay.active .zoom { opacity: 1; } ``` JavaScript代码: ```javascript const container = document.querySelector('.container'); const imageZoom = container.querySelector('.image-zoom'); const zoomOverlay = imageZoom.querySelector('.zoom-overlay'); const zoom = zoomOverlay.querySelector('.zoom'); imageZoom.addEventListener('mousemove', (e) => { const { left, top, width, height } = imageZoom.getBoundingClientRect(); const x = e.clientX - left; const y = e.clientY - top; const offsetX = x / width * 100; const offsetY = y / height * 100; zoom.style.backgroundPosition = `${offsetX}% ${offsetY}%`; zoom.style.left = `${x - 100}px`; zoom.style.top = `${y - 100}px`; }); imageZoom.addEventListener('mouseenter', () => { zoomOverlay.classList.add('active'); }); imageZoom.addEventListener('mouseleave', () => { zoomOverlay.classList.remove('active'); }); ``` 这段代码实现了一个基本的放大镜效果。当鼠标移动到图片上时,会在图片下方出现一个放大镜区域,同时在放大镜区域中显示鼠标所在位置的缩放图像。当鼠标移开图片时,放大镜区域会消失。你可以根据需要修改CSS和JavaScript代码来实现更复杂的放大镜效果
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值