如何使用JavaScript创建一只图像放大镜

news2024/11/14 6:26:44

如果您曾经浏览过购物网站,可能遇到过图像放大功能。它可以让您放大图像的特定区域,以便浏览。结合这个小小的重要功能可以大大改善您网站的用户体验。

以一种无缝衔接的方式构建图像放大镜可能是个挑战。但是逐步完成这些步骤将帮助您从头开始创建自己的图像放大镜,无需依赖第三方插件。

何时在Web项目中使用图像放大镜?

当您构建有很多图像的项目时,图像放大镜派得上用场。如前所述,图像放大镜在购物网站上很受欢迎,因为有时用户可能需要在决定是否值得购买之前仔细观察产品。

客户完全依赖网站提供的信息和视觉效果来评估产品的质量、功能和外观。然而,光靠静态图像可能并不总是提供足够的清晰度或便于全面评估产品。

在传统商店里,顾客可以亲自触摸产品,近距离仔细观察,并评估适用性之后决定购买。图像放大镜试图通过以虚拟方式为用户提供一种相似的审查和检查来重现这种体验。

如果您正在构建一个照片库应用程序,图像放大镜也派得上用场,因为放大图像的特定部分是一项重要功能。

构建图像放大镜

该项目中使用的代码放在GitHub代码仓库中,可供人们免费使用,采用MIT许可证。

创建一个文件夹,在该文件夹中添加index.html文件、style.css文件和main.js文件。将这个样板代码添加到index.html中:

<!DOCTYPE html>
<html lang="en">

<head>
 <meta charset="UTF-8" />
 <meta name="viewport" content="width=device-width, initial-scale=1.0" />
 <title>Image Magnifier</title>
 <link rel="stylesheet" href="style.css" />
</head>

<body>
</body>

</html>

在body标签中,创建一个类名为“header”的div元素。然后在“header”div中,添加h1标题元素来显示图像放大镜的标题。

您可以根据需要来定制文本。接下来,包括两个span元素,它们提供了使用放大镜的说明,并向用户显示当前缩放级别。

在标题部分之后,创建一个类名为“container”的div元素。在这个div中,添加另一个类名为“magnifier”的div元素,并运用“hidden”类将其隐藏起来。

这个元素将表示放大镜图像。然后,添加一个script标签,“src”属性被设置为“/main.js”。

<body>
 <div class="header">
 <h1>Image Magnifier</h1>

 <span>Press <strong>Arrow Up</strong> or <strong>Arrow Down</strong> to
 increase or decrease athe zoom level.</span>

 <span>Zoom Level: <strong class="zoom-level">1</strong></span>
 </div>

 <div class="container">
 <div class="magnifier hidden"></div>
 </div>

 <script src="/main.js"></script>
</body>

把style.css文件中的代码换成以下代码。需要的话,您还可以使用Less之类的CSS预处理器。

:root {
 --magnifier-width: 150;
 --magnifier-height: 150;
}

body {
 display: flex;
 flex-direction: column;
 align-items: center;
}

.container {
 width: 400px;
 height: 300px;
 background-size: cover;
 background-image: url("https://cdn.pixabay.com/photo/2019/03/27/15/24/animal-4085255_1280.jpg");
 background-repeat: no-repeat;
 position: relative;
 cursor: none;
}

.magnifier {
 border-radius: 400px;
 box-shadow: 0px 11px 8px 0px #0000008a;
 position: absolute;
 width: calc(var(--magnifier-width) * 1px);
 height: calc(var(--magnifier-height) * 1px);
 cursor: none;
 background-image: url("https://cdn.pixabay.com/photo/2019/03/27/15/24/animal-4085255_1280.jpg");
 background-repeat: no-repeat;
}

span {
 display: block;
}

.header {
 display: flex;
 flex-direction: column;
 align-items: center;
}

.hidden {
 visibility: hidden;
}

div > span:nth-child(3) {
 font-size: 20px;

在main.js文件中,使用document.querySelector方法,检索带有类名“放大镜”和“容器”的HTML元素,并将它们分别赋予给变量magnifier和变量container。

然后,使用getComputedStyle函数来检索放大镜元素的宽度和高度,然后使用substring和indexOf方法从返回的字符串中提取数值。

将提取的宽度赋予变量magnifierWidth,将提取的高度赋予变量magnifierHeight。

let magnifier = document.querySelector(".magnifier");
let container = document.querySelector(".container");

let magnifierWidth = getComputedStyle(magnifier).width.substring(
  0,
   getComputedStyle(magnifier).width.indexOf("p")
);

let magnifierHeight = getComputedStyle(magnifier).width.substring(
   0,
  getComputedStyle(magnifier).height.indexOf("p")
);

接下来,为缩放级别、最大缩放级别以及光标和放大镜图像的位置设置变量。

let zoomLevelLabel = document.querySelector(".zoom-level");
let zoom = 2;
let maxZoomLevel = 5;
let pointerX;
let pointerY;
let magnifyX;
let magnifyY;

在上面的代码块中,pointerX和pointerY都表示光标在X轴和Y轴上的位置。

现在,定义两个辅助函数:getZoomLevel(返回当前缩放级别)和getPointerPosition(返回带有光标x坐标和y坐标的对象)。

function getZoomLevel() {
 return zoom;
}

function getPointerPosition() {
 return { x: pointerX, y: pointerY }
}

接下来,创建一个updateMagImage函数,该函数使用当前光标位置创建一个新的MouseEvent对象,并将其分派给容器元素。这个函数负责更新放大镜图像。

function updateMagImage() {
 let evt = new MouseEvent("mousemove", {
 clientX: getPointerPosition().x,
 clientY: getPointerPosition().y,
 bubbles: true,
 cancelable: true,
 view: window,
 });

 container.dispatchEvent(evt);
}

现在,您应该为“keyup”事件的窗口对象添加一个事件侦听器,当用户按下“ArrowUp”或“ArrowDown”键时,可调整缩放级别。

“keyup”事件上的回调函数还负责更新缩放级别标签,并触发updateMagImage函数。

window.addEventListener("keyup", (e) => {
 if (e.key === "ArrowUp" && maxZoomLevel - Number(zoomLevelLabel.textContent) !== 0) {
 zoomLevelLabel.textContent = +zoomLevelLabel.textContent + 1;
 zoom = zoom + 0.3;
 updateMagImage();
 }

 if (e.key === "ArrowDown" && !(zoomLevelLabel.textContent <= 1)) {
 zoomLevelLabel.textContent = +zoomLevelLabel.textContent - 1;
 zoom = zoom - 0.3;
 updateMagImage();
 }
});

然后,针对“mousemove”事件为容器元素添加事件侦听器。

在回调函数中,添加从放大镜元素中移除“hidden”类以使其可见的功能,并计算鼠标相对容器的位置,并考虑到页面滚动。

该函数还应该将放大镜的变换样式设置为计算的位置,并根据缩放级别和鼠标位置确定放大镜图像的背景大小和位置。

container.addEventListener("mousemove", (e) => {
 magnifier.classList.remove("hidden");
 let rect = container.getBoundingClientRect();
 let x = e.pageX - rect.left;
 let y = e.pageY - rect.top;

 x = x - window.scrollX;
 y = y - window.scrollY;

 magnifier.style.transform = `translate(${x}px, ${y}px)`;
 const imgWidth = 400;
 const imgHeight = 300;

 magnifier.style.backgroundSize =
 imgWidth * getZoomLevel() + "px " + imgHeight * getZoomLevel() + "px";

 magnifyX = x * getZoomLevel() + 15;
 magnifyY = y * getZoomLevel() + 15;

 magnifier.style.backgroundPosition = -magnifyX + "px " + -magnifyY + "px";
});

然后向容器元素添加另一个事件侦听器,但这一回事件侦听器应该侦听“mouseout”事件,并在鼠标离开容器区域时就将“hidden”类添回到放大镜元素。

container.addEventListener("mouseout", () => {
 magnifier.classList.add("hidden");
});

最后,为更新光标的x和y位置的“mousmove”事件向窗口对象添加事件侦听器。

window.addEventListener("mousemove", (e) => {
 pointerX = e.clientX;
 pointerY = e.clientY;
});

就是这样!您已成功地使用普通JavaScript构建了一个图像放大镜。

图像放大镜如何改善用户体验?

通过允许用户放大图像的特定区域,放大镜可以让他们更清晰地观察产品细节。

这种增强的视觉探索水平给用户灌输了信心,因为他们可以做出明智的决定。这有助于提高转化率和提高客户保留率。

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

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

相关文章

【Unity 实用工具篇】✨| 学会使用 可编程瓦片Tile Map,快速搭建2D地图

前言【【Unity 实用工具篇】✨| 学会使用 可编程瓦片Tile Map,快速搭建2D地图一、导入 Tile Map Editor二、创建调色板 Tile Palette三、快速绘制地图四、TilePalette 调色板功能介绍五、TileMap 相关组件属性介绍GirdTilemapTilemap Renderer 瓦片地图渲染器Tile Assets 瓦片…

香港IT软件开发服务公司Alpha Technology 申请纳斯达克IPO上市

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;总部位于中国香港的IT软件开发服务公司Alpha Technology 近期已向美国证券交易委员会&#xff08;SEC&#xff09;提交招股书&#xff0c;申请在纳斯达克IPO上市&#xff0c;股票代码为&#xff0…

一篇让你熟练掌握Google Guava包

Google Guava guava开源库的地址&#xff1a;github.com/google/guava 这个工具的介绍&#xff0c;搜集自网络&#xff0c;自己整理一下格式&#xff0c;感觉不错&#xff0c;分享一下。最近读源码碰到的有趣工具类挺多&#xff0c;分享大家都学习一下。 概述 工具类 就是封…

零基础入门一文带你了解前端React中组件的使用

目录 一、React 组件介绍 二、创建React组件的两种方式 1. 使用函数创建组件 2. 使用类创建组件 3. 抽离为独立 JS文件 三、React 事件处理 1. 事件绑定 2. 事件对象 四、有状态组件与无状态组件 1. state的基本使用 2. setState() 修改状态 3. 从 JSX 中抽离事件…

文心一言 VS 讯飞星火 VS chatgpt (70)-- 算法导论6.5 9题

九、请设计一个时间复杂度为 (n lgk)的算法&#xff0c;它能够将 k 个有序链表合并为一个有序链表&#xff0c;这里 n 是所有输入链表包含的总的元素个数。(提示:使用最小堆来完成 k 路归并。 文心一言&#xff1a; 要设计一个时间复杂度为 O(n log k) 的算法&#xff0c;将 …

CVE-2023-37582 Apache RocketMQ 远程代码执行漏洞

漏洞简介 Apache RocketMQ是一款低延迟、高并发、高可用、高可靠的分布式消息中间件。CVE-2023-37582 中&#xff0c;由于对 CVE-2023-33246 修复不完善&#xff0c;导致在Apache RocketMQ NameServer 存在未授权访问的情况下&#xff0c;攻击者可构造恶意请求以RocketMQ运行的…

线程池相关理论

什么是线程池 线程池是一种利用池化技术思想来实现的线程管理技术&#xff0c;主要是为了复用线程、便利地管理线程和任务、并将线程的创建和任务的执行解耦开来。我们可以创建线程池来复用已经创建的线程来降低频繁创建和销毁线程所带来的资源消耗。在JAVA中主要是使用Thread…

C高级--day2(用户相关操作 磁盘相关操作 shell脚本 修改环境变量)

#include<myhead.h>void fun(int n) {if(n>9){fun(n/10);printf("%d\t",n%10);putchar(10);return;}else{printf("%d\n",n%10);return;} } int main(int argc, const char *argv[]) {int num;printf("请输入一个整数&#xff1a;");sca…

华为OD机试真题 Java 实现【寻找最大价值的矿堆】【2023 B卷 100分】,附详细解题思路

目录 专栏导读一、题目描述二、输入描述三、输出描述四、Java算法源码五、效果展示1、输入2、输出 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#xff09;》。 刷的越多…

RISC-V基础之函数调用(一)简单的函数调用(包含实例)

高级语言支持函数&#xff08;也称为过程或子程序&#xff09;来重用通用的代码&#xff0c;以及使程序更加模块化和可读。函数可以有输入&#xff0c;称为参数&#xff0c;和输出&#xff0c;称为返回值。函数应该计算返回值&#xff0c;并且不产生其他意外的副作用。 在一个…

高性能网络框架笔记

目录 TCP粘包、分包惊群断开连接&#xff0c;TCP怎么检测的&#xff1f;大量的close wait&#xff0c;如何解 ?双方同时调用close水平触发和边沿触发的区别 TCP粘包、分包 解决&#xff1a;1.应用层协议头前面pktlen&#xff1b;2.为每一个包加上分隔符&#xff1b;(\r\n&…

element-ui - $prompt非空验证

//点击删除按钮 delStoreFun(data) { let than this; this.$prompt(删除门店请填写备注, 提示, { confirmButtonText: 确定, cancelButtonText: 取消, inputValidator: (value) > { //非空验证 if (!value) { return 输入不能为空 } }, }).then(({ value }) > { delS…

Typescript 枚举类型

枚举是用来表示一组明确的可选值列表 // enum是枚举类型的关键字 //枚举如果不设置值&#xff0c;默认从0开始 enum Direction {Up, // 0 Down, // 1 Left, // 2Right // 3} //如果给第一个值赋值为100&#xff0c;则第二、第三第四个都会在第一个的基础上1 分别是101,102…

数字孪生融合GIS系统能给物流领域提供什么解决方案?

全球贸易和电子商务的不断发展&#xff0c;让物流行业面临着越来越多的挑战。其中&#xff0c;提高运输效率、降低成本、优化供应链和增强可持续性等问题成为业界关注的焦点。在这个数字化时代&#xff0c;数字孪生和GIS系统的融合为物流行业带来了全新的解决方案。 数字孪生技…

奥威BI系统|秒分析,更适合分析大数据

根据以往的经验&#xff0c;当数据量多到一定程度就容易导致系统卡顿、崩溃。这种现象给企业级数据分析造成了极大的困扰。随着业务发展扩大和分析需求精细化&#xff0c;企业需要一套能秒分析大数据的系统。而奥威BI系统就是这样一款可以秒分析大数据的商业智能系统。 奥威BI…

swagger相关问题

swagger相关问题 swagger版本为&#xff1a; <dependency><groupId>com.github.xiaoymin</groupId><artifactId>swagger-bootstrap-ui</artifactId><version>1.9.6</version> </dependency> <dependency><groupId&…

matplotlib 设置y轴刻度标记的小数点数目+设置科学计数法标记

1 设置y轴刻度标记的小数点数目 使用FormatStrFormatter&#xff0c;通过使用格式字符串%1.2f来设置坐标轴刻度标签保留两位小数。 %1.2f格式字符串指定刻度标签以浮点数形式显示&#xff0c;并保留两位小数。 import matplotlib.pyplot as plt from matplotlib.ticker impo…

FeignClient接口的几种方式总结

FeignClient这个注解&#xff0c;已经封装了远程调用协议。在springboot的开发&#xff0c;或者微服务的开发过程中&#xff0c;我们需要跨服务调用&#xff0c;或者调用外部的接口&#xff0c;我们都可以使用FeignClient。 一、FeignClient介绍 FeignClient 注解是 Spring Cl…

vcruntime140_1.dll文件下载及安装方法,详细修复方案

最近在玩游戏跟打开ps的时候&#xff0c;电脑莫名出现上出现了一个名为vcruntime140_1.dll的错误提示。这个错误提示让我无法正常运行一些软件和游戏&#xff0c;给我的电脑使用带来了很大的困扰。第一时间我就在网上翻阅各种关于vcruntime140_1.dll错误的相关信息。终于让我们…

DC-1靶机

文章目录 信息收集漏洞发现漏洞利用 DC-1靶机地址下载 DC-1靶机说明 先把kali和靶机都设置成NAT模式 查看两台MAC地址 设置—网络适配器—高级—MAC地址 kali 00:0C:29:E1:A9:D2 dc-1 00:0C:29:C1:D6:77信息收集 1、找出DC-1 的IP地址 nmap -sP 192.168.80.1/24 -oN …