前端放大镜效果实现

news2024/12/24 8:59:51

放大镜效果实现

放大图片的需求,一般是在原有的渲染之上,额外添加一个放大框,当鼠标在原图上移动,放大框内就以当前的鼠标为中心,局部放大一定范围,在淘宝商城中是常有的实现。下面将用两种实现。

1、使用div + img 标签,原理是放大框中有一个图片,这个图片是放大后的,放大框大小固定,图片超出的部分隐层overflow: hidden,只需要调整图片的位置即可

2、使用两个canvas 其中一个用于渲染原图,另外一个做放大框,通过找到鼠标在原图位置,再选择出需要放大的范围,通过canvas方法渲染到放大框中

原图:这个可以下载下来去测试代码

在这里插入图片描述

效果图: 红色框是手动标注,如果需要可以额外实现,左边的框是原图,右边的框是放大后的图,这里放大的倍数 代码里面抽离出去用一个变量zoom 控制,免得难缠的产品经理对放大的大小有意见,切来切去也方便

1、div img实现放大镜

  1. 初始化:初始化放大倍数zoom、原图canvas1、放大图canvas2

  2. 加载图片:引入放大的图片,在图片加载成功后获取宽高,依次设置原图canvas1宽高并渲染、放大图canvas2宽高、鼠标监听事件

  3. 开始监听:监听鼠标在原图canvas1中的相对于左上角的位置,再计算出需要放大的范围,在放大图canvas2中渲染,注意每次渲染新的放大图要把画布清空,否则在边界的时候会出现重影

  4. 效果图:在这里插入图片描述

// html
    <canvas id="canvas1"></canvas>
    <canvas id="canvas2" style="background: #eee;"></canvas>
// js
  // 1、初始化
  let zoom = 2
  let canvas1 = document.querySelector("#canvas1");
  let ctx1 = canvas1.getContext("2d");
  let canvas2 = document.querySelector("#canvas2");
  let ctx2 = canvas2.getContext("2d");

  // 2、加载图片
  let img = new Image();
  img.src = "./good.png";
  img.onload = () => {
    let { width, height } = img
    //设置原图 
    canvas1.width = width
    canvas1.height = height
    ctx1.drawImage(img, 0, 0, width, height);
    // 设置放大图
    canvas2.width = width
    canvas2.height = height
    // 开起鼠标监听,移动的时候放大图片
    canvas1.addEventListener("mousemove", mouseHandler)
  }

  // 3、放大图片
  function mouseHandler(e) {
    let x = e.clientX
    let y = e.clientY
    // 每次清空整个画布
    let { width, height } = canvas2
    ctx2.clearRect(0, 0, canvas2.width, canvas2.height);
    ctx2.drawImage(img, x-width/2/zoom, y-height/2/zoom, width/zoom, height/zoom, 0, 0, width, height);
    // 第1个参数 确定原图
    // 第2、3个参数 确定鼠标所在放大范围左上角
    // 第4、5个参数 确定裁剪的大小,为放大范围
    // 第6、7、8、9个参数 确定绘制的位置和大小
  }

2、canvas 实现放大镜

  1. 初始化:初始化放大倍数zoom、原图img1、放大图盒子img2Box、放大图img2

  2. 加载图片:获取图片的大小后,设置dom大小,开起鼠标监听

  3. 放大图片:通过放大倍数计算放大的范围,计算相对位置移动放大图到指定位置

  4. 效果图:在这里插入图片描述

//html
    <img id="img1" src="./good.png" alt="">
    <div id="img2-box">
      <img id="img2" src="./good.png" alt="">
    </div>
//js
  // 1、初始化
  let zoom = 3
  let img1 = document.querySelector("#img1");
  let img2Box = document.querySelector("#img2-box");
  let img2 = document.querySelector("#img2");
  
  // 2、加载图片
  let img = new Image();
  img.src = "./good.png";
  img.onload = () => {
    let { width, height } = img
    img1.width = width
    img1.height = height
    img2Box.style.width = width
    img2Box.style.height = height
    img2.width = width * zoom
    img2.height = height * zoom
    // 开起鼠标监听,移动的时候放大图片
    img1.addEventListener("mousemove", mouseHandler)
  }

  // 3、放大图片
  function mouseHandler(e) {
    let { width, height } = img
    let x = e.clientX
    let y = e.clientY
    img2.style.left = -x*zoom + width/2
    img2.style.top = -y*zoom + height/2
  }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/623849.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

是德 DSOX1202A示波器技术参数

KEYSIGHT是德科技 lnfiniiVision 1000 X 系列示波器是具有专业级功能的入门级示波器&#xff0c;配备的联网软件可提供远程控制和数据记录等功能。 它集 6 种仪器的功能于一身&#xff0c;属于是德科技智能测试台必备仪器之一。该系列包含 4 款独具特长的仪器&#xff0c;通过同…

5年功能测试要18K,一问三不知,还反过来怼我,真是醉了····

最近看了很多简历&#xff0c;很多候选人年限不小&#xff0c;但是做的都是一些非常传统的项目&#xff0c;想着也不能通过简历就直接否定一个人&#xff0c;何况现在大环境越来 越难&#xff0c;大家找工作也不容易&#xff0c;于是就打算见一见。 在沟通中发现&#xff0c;由…

坚持#第418天~久违了,二维码系统

公司有了一个新客户&#xff0c;这家客户的货物都是用铁架框装的&#xff0c;铁架框长得都一样&#xff0c;不好区分&#xff0c;只能看标签来识别&#xff0c;而且发货时需要一一核对发货单上的交货单号对应的货物&#xff0c;标签上的发货单号必须要一致才行&#xff0c;导致…

【干货】Kali Linux渗透基础知识大全,零基础入门必看!

最近好多朋友问我&#xff1a;不会编程&#xff0c;英语也不好&#xff0c;dos命令也记不住&#xff0c;能学习黑客技术么&#xff1f; 我可以明确告诉大家&#xff0c;可以的&#xff01; 相信每一个少年心中&#xff0c;曾经都有过一个黑客梦&#xff01; 有人觉得黑客霸气…

常用的开源自定义表单有哪几大优势特点?

当前&#xff0c;办公已经进入流程化和自动化的阶段&#xff0c;要想跟随着社会发展&#xff0c;引用开源自定义表单工具可以使办公协作效率得到快速提升&#xff0c;它的灵活、便捷、易操作等特点&#xff0c;使得该表单工具深受当今职场的喜爱&#xff0c;是做好数据管理&…

Flutter 库:强大的下拉刷新上拉加载框架——EasyRefresh

Flutter 库&#xff1a;强大的下拉刷新上拉加载框架——EasyRefresh 文章目录 Flutter 库&#xff1a;强大的下拉刷新上拉加载框架——EasyRefresh一、概述1、简介2、特征3、在线演示4、APK下载5、接口参考 二、官方示例1、默认构造函数2、生成器构造函数3、指示器定位4、使用指…

2023年网络安全HW攻防技术总结(珍藏版)

2022年护网正当时&#xff0c;相信不少网安人都已经进入了状态。 我们都知道&#xff0c; 护网行动 是国家应对网络安全问题所做的重要布局之一。至今已经是7个年头了&#xff0c;很多公司在这时候人手不够&#xff0c;因此不得不招募一些网安人员来参加护网。 红队 扮演攻击…

Linux搭建Java环境——安装JDK

一、上传jdk1.8文件 首先通过Xftp 7软件&#xff0c;将jdk文件传输到Linux上&#xff08;连接和Xshell 7方法相同&#xff0c;软件资源在首页中的下载栏处免费获取&#xff09;当然需要在opt文件夹下先新建jdk的文件夹 二、解压jdk文件 解压完成后可以发现蓝色的jdk1.8的目录生…

Android Studio实现五子棋小游戏

项目目录 一、项目概述二、开发环境三、详细设计1、布局设计2、验证码3、AI人机4、背景音乐 四、运行演示五、项目总结 一、项目概述 五子棋是一种两人对弈的策略型棋类游戏&#xff0c;本次五子棋小游戏具有人机对战和人人对战两种玩法。人机对战可以单人挑战AI&#xff0c;实…

SQL语言的规则与规范

SQL语言的规则与规范 前言一、SQL概述1、SQL背景知识2、SQL语言排行榜3、SQL 分类 二、SQL语言的规则与规范1、基本规则2、SQL大小写规范 &#xff08;建议遵守&#xff09;3、注 释4、命名规则&#xff08;暂时了解&#xff09;5、数据导入指令 前言 本博主将用CSDN记录软件开…

怎么用pe系统重装系统,如何用pe重装系统

其实&#xff0c;电脑装系统并没有这么难&#xff0c;尤其是u盘pe系统相对来说比较简单一点。但是&#xff0c;现在还有很多朋友一直在问这个是怎么装系统的&#xff0c;关键是装系统耗的时间比较长&#xff0c;步骤好像很复杂的样子&#xff0c;担心自己操作出现失误。确实&am…

Ansys Zemax | 如何以数据的方式定义网格矢高表面

引言 本文示范了如何输入表面起伏数据&#xff0c;以定义Zemax OpticStudio中的网格矢高 (Grid Sag) 类型表面&#xff0c;表面起伏数据应为Z坐标轴上的矢高 (Sag)。(联系我们获取文章附件) 正文 表面起伏数据格式是这样定义的&#xff1a; 第一行&#xff0c;由7个数字表示。 …

ASEMI代理英飞凌TDK5100F射频模块的性能与应用分析

编辑-Z 本文将对TDK5100F射频模块进行详细的介绍与分析&#xff0c;包括其性能特点、应用领域、使用方法。通过对这三个方面的阐述&#xff0c;希望能够帮助读者更好地了解TDK5100F射频模块的优势和应用场景。 1、TDK5100F射频模块的性能特点 TDK5100F射频模块是一款高性能的…

IPV6地址基础

IPv6是英文“Internet Protocol Version 6”&#xff08;互联网协议第6版&#xff09;的缩写&#xff0c;是互联网工程任务组&#xff08;IETF&#xff09;设计的用于替代IPv4的下一代IP协议。其地址数量号称可以为全世界的每一粒沙子编上一个地址 1. ipv6地址表示方法 IPv6的…

【前端播放器】前端播放器的时延问题小总结

目录 结论 播放器的优化测试与小结论 结论 根据理论知识&#xff0c;及代码查看&#xff0c;实验后 【ZLM】ZLM源码阅读三----延时问题_dualven_in_csdn的博客-CSDN博客 发现&#xff0c;结论大概与文中相同 &#xff1a;主要的延时&#xff0c;主要是播放器端形成的。 播放…

科技数据分析,2022年授权通过的专利数高达近80万项

哈喽大家好&#xff0c;中国科技发展在近年来取得了巨大进步&#xff0c;相关部门也积极推动科技创新&#xff0c;加大科技投入&#xff0c;鼓励企业加强研发&#xff0c;加速科技成果转化落地。此外&#xff0c;中国还在国际科技合作方面取得了积极进展&#xff0c;与各国合作…

使用 Golang 在 GitLab 上拉取代码并将静态资源部署到 Nginx,同时将图库上传至阿里云 OSS

使用 Golang 在 GitLab 上拉取代码并将静态资源部署到 Nginx&#xff0c;同时将图库上传至阿里云 OSS 本文章采用几个任务执行 最终想要实现效果&#xff0c; 1、golang做成一个服务占用一个端口&#xff0c;然后监测gitlab仓库webhook 2、前端人员提交代码到gitlab&#xff…

5.3图的综合应用算法

一.最小生成树算法 1.概念&#xff08;Minimum-Spanning-Tree&#xff09;MST 生成树&#xff1a;针对于连通图&#xff0c;包含全部顶点&#xff0c;去掉一条边后不连通&#xff0c;加一条边形成环 最小生成树:带权连通无向图&#xff0c;边的权值之和最小的生成树(MST) 2.…

insightface 人脸检测与识别

参考&#xff1a;https://huaweicloud.csdn.net/638088d7dacf622b8df89c0c.html insightface模型下载可能需要连接外网&#xff0c;模型自动下载保存再models\buffalo_l下&#xff0c;人脸注册自动保存再face_db目录下 1、具体人脸录入 python face_label.py --picture 刘亦…

GD32E230F4使用硬件IIC+DMA读写24C04

前言 在很久很久以前&#xff0c;我就写过GD32E230替换STM32F031的帖子&#xff0c;主要介绍了USART和SPI的外设移植开发&#xff0c;当时IIC使用的是软件i2c&#xff0c;没有介绍的价值。在使用IIC时&#xff0c;大多数我们都是采用软件的方式&#xff0c;因为软件的方式及其…