js详细讲解放大镜的实现

简介: js详细讲解放大镜的实现

实现放大镜的整体思路

1.当鼠标放在图片上的时候,出现蒙层。
2.出现蒙层,让鼠标在蒙层中心
3.限制蒙层移动的范围
4.放大镜移动

最终实现的效果

鼠标放上去的时候,出现一个蒙层。
蒙层的移动范围只能在图片里,不能超出范围。
移动蒙层时,右侧会出现图片的放大部分。
移除图片的范围,放大镜消失。

鼠标放上去时候出现蒙层

<style>
  *{
    padding: 0;
    margin: 0;
  }
  .box{
    margin-left: 400px;
    margin-top: 150px;
    position: relative;
  }
  .small-box{
    position: absolute;
    /* 图片的大小 */
    height: 450px;
    width: 450px;
  }
  .mask {
    position: absolute;
    left: 0;
    top: 0;
    display: none;
    width: 300px;
    height: 300px;
    z-index: 3;
    border: 1px solid #aaa;
    background: 50% top no-repeat #fede4f;
    opacity: .5;
    -moz-opacity: .5;
    -khtml-opacity: .5;
    filter: alpha(Opacity=50);
    cursor: move;
  }
  .big-box{
    position: relative;
    display: none;
    /* 右侧放大镜盒子的大小 */
    width: 500px;
    height: 500px;
    /* 盒子肯定比图片小,然后使用超出裁剪 */
    overflow: hidden;
    /* 定位右侧盒子的位置 */
    top: 0px;
    /* 留了一个单位的像素处来,好区别 */
    left:451px;
  }
  #bigImg{
    position: absolute;
  }
  .small-box:hover .mask{
    display: block;
  }
  .small-box:hover + .big-box{
    display: block;
  }
</style>
<body>
   <div id="box" class="box">
    <!-- 页面上看见的小图 -->
    <div id="smallBox" class="small-box">
      <img src="https://img11.360buyimg.com/n1/s450x450_jfs/t1/125337/25/33944/39827/643cecaaFe632cc8e/b33f7ab378a5c0d3.jpg">
        <div class="mask" id="mask"></div>
      </div>
    </div>
    <!-- 放大的图 -->
    <div class="big-box" id="bigBox">
      <img id="bigImg" src="https://img14.360buyimg.com/n0/jfs/t1/125337/25/33944/39827/643cecaaFe632cc8e/b33f7ab378a5c0d3.jpg.avif" class="">
    </div>
   </div>
</body>

计算蒙层坐标的中心位置

1.我们首先要计算一个坐标点的位置。
获取蒙层坐标点的位置
let mask_x= e.pageX - box.offsetLeft
let mask_y= e.pageY - box.offsetTop
现在我们得到了坐标点的位置。
如何计算蒙层坐标的中心位置呢?
mask_x= mask_x-mask.offsetWidth/2
mask_y= mask_y-mask.offsetHeight/2
也就是将 mask_x 向左移动了mask元素宽度的一半。
特别说明:
offsetLeft 是指当前元素相对其距离自己最近的具有定位属性的父级元素的偏移值。
margin,定位,border也会影响offsetLeft的值。但是padding不会影响。

<body>
   <div id="box" class="box">
    <!-- 页面上看见的小图 -->
    <div id="smallBox" class="small-box">
      <img src="https://img11.360buyimg.com/n1/s450x450_jfs/t1/125337/25/33944/39827/643cecaaFe632cc8e/b33f7ab378a5c0d3.jpg">
      <div class="mask" id="mask"></div>
    </div>
    <!-- 放大的图 -->
    <div class="big-box" id="bigBox">
      <img src="https://img14.360buyimg.com/n0/jfs/t1/125337/25/33944/39827/643cecaaFe632cc8e/b33f7ab378a5c0d3.jpg.avif" class="">
    </div>
   </div>
</body>
<script>
  let smallBox=document.getElementById('smallBox')
  let box=document.getElementById('box')
  let mask=document.getElementById('mask')
  smallBox.onmousemove =function(e){
    // 获取蒙层坐标点的位置
    let mask_x= e.pageX - box.offsetLeft
    let mask_y= e.pageY - box.offsetTop
    // 计算蒙层坐标点的中心位置
    mask_x-= mask.offsetWidth/2
    mask_y-= mask.offsetHeight/2 
    mask.style.left = mask_x+'px'
    mask.style.top = mask_y+'px'
  }
</script>

限制移动的范围

在移动蒙层的的时候,是有范围限制的。
X轴最大的范围是: smallBox.offsetWidth-mask.offsetWidth,最小范围是0;
Y轴的最大范围是: smallBox.offsetHeight-mask.offsetHeight,最小范围是0;

<script>
  let smallBox=document.getElementById('smallBox')
  let box=document.getElementById('box')
  let mask=document.getElementById('mask')
  smallBox.onmousemove =function(e){
    // 获取蒙层坐标点的位置
    let mask_x= e.pageX - box.offsetLeft
    let mask_y= e.pageY - box.offsetTop
    // 计算蒙层坐标点的中心位置
    mask_x-= mask.offsetWidth/2
    // mask_x-= mask.offsetWidth - mask_x /2
    mask_y-= mask.offsetHeight/2 
    // 获取X可以移动的最大值
    let moveMaxX= smallBox.offsetWidth-mask.offsetWidth
    // 获取y可以移动的最大值
    let moveMaxY= smallBox.offsetHeight-mask.offsetHeight
    // X轴最小值和最大值
    if(mask_x<0){
      mask_x=0
    }
    if(mask_x>moveMaxX){
      mask_x=moveMaxX
    }
    // Y轴最小值和最大值
    if(mask_y<0){
      mask_y=0
    }
    if(mask_y>moveMaxY){
      mask_y=moveMaxY
    }
    mask.style.left = mask_x+'px'
    mask.style.top = mask_y+'px'
  }
</script>

大图的移动

当我们的蒙层向右移动的时候,
我们的大图实际上是向左移动的。
移动的公式:
bigImg.style.left= -mask_x *(bigBox.offsetWidth/mask.offsetWidth) + 'px'
bigImg.style.top= -mask_y *(bigBox.offsetHeight/mask.offsetHeight) + 'px'
<script>
let smallBox=document.getElementById('smallBox')
let box=document.getElementById('box')
let mask=document.getElementById('mask')
let bigBox = document.getElementById('bigBox')
smallBox.onmousemove =function(e){
  // 获取蒙层坐标点的位置
  let mask_x= e.pageX - box.offsetLeft
  let mask_y= e.pageY - box.offsetTop
  // 计算蒙层坐标点的中心位置
  mask_x-= mask.offsetWidth/2
  mask_y-= mask.offsetHeight/2
  // 获取X可以移动的最大值
  let moveMaxX= smallBox.offsetWidth-mask.offsetWidth
  // 获取y可以移动的最大值
  let moveMaxY= smallBox.offsetHeight-mask.offsetHeight
  // X轴最小值和最大值
  if(mask_x<0){
    mask_x=0
  }
  if(mask_x>moveMaxX){
    mask_x=moveMaxX
  }
  // Y轴最小值和最大值
  if(mask_y<0){
    mask_y=0
  }
  if(mask_y>moveMaxY){
    mask_y=moveMaxY
  }
  mask.style.left = mask_x+'px'
  mask.style.top = mask_y+'px'
  // 右侧的放大图
  bigImg.style.left= -mask_x *(bigBox.offsetWidth/mask.offsetWidth) + 'px'
  bigImg.style.top= -mask_y *(bigBox.offsetHeight/mask.offsetHeight) + 'px'
}
</script>

遇见问题,这是你成长的机会,如果你能够解决,这就是收获。

相关文章
|
7天前
|
云安全 人工智能 运维
阿里云联动百位企业安全专家,共识Agent防御最佳实践
当Agent成为新员工,你的安全边界在哪里?
1922 6
阿里云联动百位企业安全专家,共识Agent防御最佳实践
|
5天前
|
存储 人工智能 关系型数据库
阿里云AI产品与云产品最新组合套餐:Token Plan、AI coding及云服务器和建站等组合优惠价
阿里云推出全新“算力+模型+应用”一站式云与AI组合套餐活动,覆盖从个人开发者到中大型企业的全场景需求。核心亮点为分三档定价的Token Plan订阅服务,支持Qwen3.8-Max-Preview大模型调用,错峰时段最低可享0.2折优惠。活动同步推出AI Coding、智能体部署、云电脑托管、0代码建站等十余类场景化组合,搭配99元/年的普惠云服务器、88元/年的入门数据库等经典特惠产品,还为企业提供1V1定制化AI转型方案,大幅降低了不同用户群体拥抱AI的技术门槛与采购成本。
652 111
|
15天前
|
人工智能 JSON 安全
Fastjson远程代码执行漏洞,阿里云AI安全为您保驾护航
阿里云AI安全产品联动防御Fastjson攻击
2556 13
Fastjson远程代码执行漏洞,阿里云AI安全为您保驾护航
|
7天前
|
人工智能 弹性计算 数据库
阿里云优惠券种类解析:主要券种区别和适用群体及领取和使用指南
2026年阿里云构建了覆盖全用户的七类优惠券,本文逐一拆解了每类优惠券的核心规则、适用人群与使用技巧:大促限定的阶梯满减券分个人、企业双通道,最高可减800元;学生专属300元无门槛券支持全品类通用;按量付费用户可参与消费达标返券形成循环优惠;新用户有低门槛专享满减券尝鲜;老用户可领取系统自动发放的随机福利券;中大型企业迁云可申请最高100万元的专项补贴;云产品通用券还能在活动价基础上实现折上折。不同身份、不同采购场景的用户均可通过精准匹配对应优惠券,最大化享受优惠力度。
462 110
阿里云优惠券种类解析:主要券种区别和适用群体及领取和使用指南
|
13天前
|
人工智能 前端开发 Linux
Codex 桌面版安装 + CC Switch 接入第三方 API 完整教程(2026 最新)
2026最新教程:手把手教你安装Codex桌面版,通过CC Switch v3.17.0一键接入Fenno等国产API(兼容OpenAI Responses格式),跳过账号登录,完整启用代码审查、多步任务与上下文感知功能。零基础友好,全程图文实操。(239字)
1619 2
|
15天前
|
人工智能 自然语言处理 数据挖掘
Qwen3.8-Max-Preview深度全解析:2.4万亿参数旗舰MoE模型+Token Plan限时优惠完整落地指南
2026年7月,全新旗舰级混合专家大模型Qwen3.8-Max-Preview正式开放抢先体验,作为通义千问Qwen3系列规格最高、综合推理能力顶尖的新一代模型,该模型总参数量达到2.4万亿(2.4T),是当前线上可调用的原生多模态旗舰模型,综合推理水准对标海外顶级Fable 5模型,在复杂工程开发、长文档深度分析、多步骤智能体自治、跨境多语言创作、海量数据挖掘五大高难度业务场景实现跨越式性能提升。
1428 2
|
17天前
|
人工智能
Qwen3.8抢先体验!正式版即将发布并开源!
千问Qwen3.8即将开源,参数达2.4T,进化速度以“天”计,实力媲美Fable 5。预览版Qwen3.8-Max已上线阿里Token Plan等平台,限时优惠:日间Credits低至1折,夜间更优,个人/团队版月付仅35元起!
1499 55
|
2天前
Qoder 一周年 × Qwen3.8-Max 正式上线,多重好礼限时领
8月3日,Qwen3.8-Max 正式上线Qoder,迎来Qoder一周年。新老用户可领800次免费调用,下单再赠2000次;夜间(22:00–08:00)调用5折;邀请好友双方得积分与调用额度。
249 0