首页 > 其他分享 >js详细讲解放大镜的实现

js详细讲解放大镜的实现

时间:2023-09-10 18:55:27浏览次数:46  
标签:box smallBox 放大镜 蒙层 mask js let 讲解 offsetWidth

实现放大镜的整体思路

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>

标签:box,smallBox,放大镜,蒙层,mask,js,let,讲解,offsetWidth
From: https://www.cnblogs.com/IwishIcould/p/17674318.html

相关文章

  • pixi.js 的头像制作功能【函数】
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><scriptsrc="https://cdn.jsdel......
  • Golang 初识: 函数调用与定义丶字符串处理丶Json的处理
    一.基本函数调用与定义1packagemain23import(4"encoding/json"5"errors"6"fmt"7"math/rand"8"mylib/pkg/student"9"mylib/pkg/utils"10"sort"11......
  • Node.js+Express+Koa2开发接口学习笔记(二)
    搭建开发环境从0开始搭建,不适用任何框架使用nodemon监测文件变化,自动重启node使用cross-env设置环境变量,兼容maxlinux和windows创建项目文件夹blog-1,在终端输入命令npminit-y在根目录下创建bin=>www.js文件,将初次运行的文件www.js存放在bin目录下。同时需要修改pack......
  • 使用Node.js和Express.js构建RESTful API
    Express.js简介Express.js是一个流行的Node.jsWeb应用程序框架,它提供了用于构建Web和API应用程序的核心功能。Express.js是一个轻量级、快速和灵活的框架,让你能够轻松处理路由、请求和响应。以下是一些关键Express.js特点:路由:Express.js允许你定义HTTP路由,以便处理不同的URL请求。......
  • 使用Node.js和MongoDB构建RESTful API
    Node.js和Express.js简介Node.js是一个流行的服务器端JavaScript运行环境,用于构建高性能的网络应用程序。Express.js是一个Node.js的Web应用程序框架,它提供了用于创建Web和API应用程序的核心功能,如路由、中间件和HTTP请求处理。以下是一些关键Node.js和Express.js特点:非阻塞和事件......
  • 较真:js判断中文字符串长度的正确方法
    对于使用javascript编程的人来说,判断字符串长度应该是常用又简单的操作,但在判断包含有中文字符或其他非asci字符的字符串长度时,却有些坑在里面。错误做法1先看看最常用的做法,也就是使用String.length判断:letstr="你好奥";letlen=str.length;console.log(len);//打印出来......
  • postgresql数据库安装日志解析插件wal2json
    postgresql数据库安装日志解析插件wal2json一、编译安装wal2json插件cdwal2jsonexportPATH=/data/home/fei.yang4/moudle/postgresql/bin:$PATHmakemakeinstall二、直接导入wal2json插件查看pg进程确定pgsql库和配置文件存放目录ps-ef|greppostgresqlubuntu24975248......
  • Vue.js 官方脚手架 create-vue 是怎么实现的?
    Vue.js官方脚手架create-vue是怎么实现的?摘要本文共分为四个部分,系统解析了vue.js官方脚手架create-vue的实现细节。第一部分主要是一些准备工作,如源码下载、项目组织结构分析、依赖分析、功能点分析等;第二部分分析了create-vue脚手架是如何执行的,执行文件的生成细节......
  • 原生JavaScript框架设计(一):整合JS函数
    本篇为回顾js时总结,诣在整理JS中常用知识点,剖析其规律。模仿jQuery,简单一些,特定功能,像apply函数、getElementXXX函数等浏览器函数都没有实现,直接套用。创建common.js://自定义实现push函数varmyPush=function(target,els){ varj=target.length, i=0; while((target[j++]=e......
  • chrome插件:content.js、background.js, options.js, popup.js之间的通信
    目录content.js向background.js发送消息background.js向content.js发送消息options.js或popup.js向background.js传递数据总结content.js向background.js发送消息消息方向://content.js一般不直接与options.js,popup.js通信,而是与常驻的background.js通信content.js=>[back......