前端 放大镜 js

放大镜,就是你随便打开个购物网站,查看商品详情,就会出现了。
具体的原理我不多说,网上很多帖子,我的思路跟这个帖子的一样。
在这里插入图片描述
如上图所示,不过放大倍数我搞反了。

不过我把它封装成一个函数,只需要引入css和js文件,并调用函数就好了。

    <div class="bigbox">
    </div>
    <script src="../js/magnifyingGlass.js"></script>
    <script> 
        function callGlass(){
        //要添加放大镜的元素
            let element = document.querySelector('.bigbox');
            //左边图片的大小
            let imgSize = {
                width:450,
                height:450
            };
            //右边显示区域的大小
            let showSize = {
                width:450,
                height:450
            }
            //放大倍数
            let scale = 3;
            //图片路径
            let imgSrc = "../images/ba2fa682e96b7a60.jpg";
            magnifyingGlass(element,imgSize,showSize,scale,imgSrc);
        }
        callGlass();
    </script>

像这样子调用就可以了,你可以决定左边图片以及图片大小,右边显示区域大小,放大倍数,和所要添加放大镜的元素。放大镜大小不能改,它等于 “右边显示区域大小”/“放大倍数”。

引入css样式

<link rel="stylesheet" href="../css/magnifyingGlass.css">

css代码

.bigboxGlass {
    position: relative;
    box-sizing: border-box;
    margin: 100px;
    cursor: move;
    border: 1px solid #dfdfdf;
    background-repeat: no-repeat;
    background-size: 100% 100%;
}

.bigboxGlass .smbox {
    position: absolute;
    display: none;
    pointer-events: none;
    background-color: rgb(174, 177, 176);
    opacity: 0.5;
}

.bigboxGlass .showbox{
    position: absolute;
    box-sizing: border-box;
    display: none;
    pointer-events: none;
    top: -1px;
    border: 1px solid #dfdfdf;
    overflow: hidden;
}
.bigboxGlass .showbox img{
    position: absolute;
    display: block;
}

js代码

// 放大镜
// 要添加放大镜的元素,左边图片大小,右边显示区域大小(对象形式
// {width:xx,height:xx}
// 放大倍数,图片路径
function magnifyingGlass(element, imgSize, showSize, scale, imgSrc) {
    element.classList.add('bigboxGlass');
    let str = `
    <div class="smbox"></div>
    <div class="showbox">
        <img src="${imgSrc}">
    </div>
    `
    // 左边图片大小和路径
    element.insertAdjacentHTML('beforeend', str);
    element.style.width = imgSize.width + 'px';
    element.style.height = imgSize.height + 'px';
    element.style.backgroundImage = `url(${imgSrc})`;


    // 放大镜大小
    let glassEle = element.querySelector('.smbox');
    glassEle.style.width = Number(showSize.width) / Number(scale) + 'px';
    glassEle.style.height = Number(showSize.height) / Number(scale) + 'px';


    // 右边显示区域大小
    let showbox = element.querySelector('.showbox');
    showbox.style.width = showSize.width + 'px';
    showbox.style.height = showSize.height + 'px';
    showbox.style.left = Number(imgSize.width) + 20 + 'px';

    // 右边图片大小
    let bigimg = showbox.querySelector('img');
    bigimg.style.width = Number(imgSize.width) * Number(scale) + 'px';
    bigimg.style.height = Number(imgSize.height) * Number(scale) + 'px';

    addmove(element, glassEle, showbox, scale,bigimg);
    addleave(element,glassEle, showbox);
}

function addmove(element, glassEle, showbox, scale,bigimg) {
    
    let elementWidth = element.offsetWidth;
    let elementHeight = element.offsetHeight;
    // 鼠标相对于大盒子的位置
    let mouseX, mouseY;
    // 放大镜的位置 偏移量
    let x, y;
    glassEle.style.display = 'block';
    let glassWidth = glassEle.getBoundingClientRect().width;
    let glassHeight = glassEle.getBoundingClientRect().height;
    // console.log(glassEle.getBoundingClientRect());
    glassEle.style.display = 'none';
    element.addEventListener('mousemove', function (e) {
        glassEle.style.display = 'block';
        mouseX = e.offsetX;
        mouseY = e.offsetY;
        x = mouseX - glassWidth * 0.5;
        y = mouseY - glassHeight * 0.5;
        x = x <= 0 ? 0 : (x >= elementWidth - glassWidth ? elementWidth - glassWidth : x);
        y = y <= 0 ? 0 : (y >= elementHeight - glassHeight ? elementHeight - glassHeight : y);
        glassEle.style.left = x + 'px';
        glassEle.style.top = y + 'px';

        moveShowImg(showbox, scale, x, y,bigimg);
    })
}

function moveShowImg(showbox, scale, x, y,bigimg) {
    showbox.style.display = 'block';
    // console.log(showbox);
    bigimg.style.left = -1 * Number(scale) * x + 'px';
    bigimg.style.top = -1 * Number(scale) * y + 'px';
}

function addleave(element,glassEle, showbox){
    element.addEventListener('mouseleave',function(){
        glassEle.style.display = 'none';
        showbox.style.display = 'none';
    })
}

效果示意图。
你可以更改一些参数,看看是什么效果
请添加图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值