前端页面用原生JavaScript实现放大镜效果

在逛购物网站时,经常会有我们移动到图片上时,图片旁边出现局部放大的图像。那么怎么实现这种放大镜的效果呢?这里给出两种方式,一种时原生js实现的,一种使用react来实现。

原生JavaScript实现代码:

point.png: 

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>magnifying glass</title>
  <style>
    #magnifying {
      display: block;
      width: 400px;
      height: 400px;
      margin: 50px;
      position: relative;
      border: 1px solid rgba(0,0,0,.05);
    }

    #origin {
      position: relative;
      z-index: 1;
    }

    #float {
      display: none;
      width: 160px;
      height: 160px;
      background: #ffffcc;
      border: 1px solid #ccc;
      /*兼容ie浏览器*/
      filter: alpha(opacity=30);
      opacity: 0.3;
      /*background: url("./point.png") scroll repeat 0 0;*/
      position: absolute;
      overflow: hidden;
    }

    #mark {
      position: absolute;
      display: block;
      width: 400px;
      height: 400px;
      z-index: 10;
      cursor: move;
    }

    #zoom {
      display: none;
      position: absolute;
      top: 0;
      left: 420px;
      width: 400px;
      height: 400px;
      overflow: hidden;
      z-index: 1;;
    }

    #zoom img {
      position: absolute;
      z-index: 5
    }
  </style>

</head>
<body>
<div id="magnifying">
  <div id="origin">
    <div id="mark"></div>
    <span id="float"></span>
    <img width="400px" src="./portrait.jpg"/>
  </div>
  <div id="zoom">
    <img src="./portrait.jpg"/>
  </div>
</div>
<script>
  window.onload = function () {
    const Magnifying = document.getElementById("magnifying");
    const Origin = document.getElementById("origin");
    const Mark = document.getElementById("mark");
    const Float = document.getElementById("float");
    const Zoom = document.getElementById("zoom");
    const ZoomImage = Zoom.getElementsByTagName("img")[0];

    Mark.onmouseover = function () {
      Float.style.display = "block";
      Zoom.style.display = "block";
    };

    Mark.onmouseout = function () {
      Float.style.display = "none";
      Zoom.style.display = "none";
    };

    Mark.onmousemove = function (ev) {

      const _event = ev || window.event;  //兼容多个浏览器的event参数模式

      let left = _event.clientX - Magnifying.offsetLeft - Origin.offsetLeft - Float.offsetWidth / 2;
      let top = _event.clientY - Magnifying.offsetTop - Origin.offsetTop - Float.offsetHeight / 2;

      //设置边界处理,防止移出小图片
      if (left < 0) {
        left = 0;
      } else if (left > (Mark.offsetWidth - Float.offsetWidth)) {
        left = Mark.offsetWidth - Float.offsetWidth;
      }

      if (top < 0) {
        top = 0;
      } else if (top > (Mark.offsetHeight - Float.offsetHeight)) {
        top = Mark.offsetHeight - Float.offsetHeight;

      }

      Float.style.left = left + "px";
      Float.style.top = top + "px";

      //求比值
      const percentX = left / (Mark.offsetWidth - Float.offsetWidth);
      const percentY = top / (Mark.offsetHeight - Float.offsetHeight);

      //方向相反,故而是负值
      ZoomImage.style.left = -percentX * (ZoomImage.offsetWidth - Zoom.offsetWidth) + "px";
      ZoomImage.style.top = -percentY * (ZoomImage.offsetHeight - Zoom.offsetHeight) + "px";
    }
  }
</script>
</body>
</html>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值