您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > javascript

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

时间:2023-08-02 12:29:54  来源:51CTO  作者:

译者 | 布加迪

审校 | 重楼

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

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

何时在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构建了一个图像放大镜。

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

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

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

原文标题:How to Build an Image Magnifier With Vanilla JavaScript,作者:DAVID UZONDU



Tags:JavaScript   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
17 个你需要知道的 JavaScript 优化技巧
你可能一直在使用JavaScript搞开发,但很多时候你可能对它提供的最新功能并不感冒,尽管这些功能在无需编写额外代码的情况下就可以解决你的问题。作为前端开发人员,我们必须了解...【详细内容】
2024-04-03  Search: JavaScript  点击:(4)  评论:(0)  加入收藏
你不可不知的 15 个 JavaScript 小贴士
在掌握如何编写JavaScript代码之后,那么就进阶到实践&mdash;&mdash;如何真正地解决问题。我们需要更改JS代码使其更简单、更易于阅读,因为这样的程序更易于团队成员之间紧密协...【详细内容】
2024-03-21  Search: JavaScript  点击:(25)  评论:(0)  加入收藏
构建一个通用灵活的JavaScript插件系统?看完你也会!
在软件开发中,插件系统为应用程序提供了巨大的灵活性和可扩展性。它们允许开发者在不修改核心代码的情况下扩展和定制应用程序的功能。本文将详细介绍如何构建一个灵活的Java...【详细内容】
2024-03-20  Search: JavaScript  点击:(20)  评论:(0)  加入收藏
对JavaScript代码压缩有什么好处?
对JavaScript代码进行压缩主要带来以下好处: 减小文件大小:通过移除代码中的空白符、换行符、注释,以及缩短变量名等方式,可以显著减小JavaScript文件的大小。这有助于减少网页...【详细内容】
2024-03-13  Search: JavaScript  点击:(2)  评论:(0)  加入收藏
跨端轻量JavaScript引擎的实现与探索
一、JavaScript 1.JavaScript语言JavaScript是ECMAScript的实现,由ECMA 39(欧洲计算机制造商协会39号技术委员会)负责制定ECMAScript标准。ECMAScript发展史: 2.JavaScript...【详细内容】
2024-03-12  Search: JavaScript  点击:(2)  评论:(0)  加入收藏
面向AI工程的五大JavaScript工具
令许多人惊讶的是,一向在Web开发领域中大放异彩的JavaScript在开发使用大语言模型(LLM)的应用程序方面同样大有价值。我们在本文中将介绍面向AI工程的五大工具,并为希望将LLM...【详细内容】
2024-02-06  Search: JavaScript  点击:(52)  评论:(0)  加入收藏
18个JavaScript技巧:编写简洁高效的代码
本文翻译自 18 JavaScript Tips : You Should Know for Clean and Efficient Code,作者:Shefali, 略有删改。在这篇文章中,我将分享18个JavaScript技巧,以及一些你应该知道的示例...【详细内容】
2024-01-30  Search: JavaScript  点击:(65)  评论:(0)  加入收藏
使用 JavaScript 清理我的 200GB iCloud,有了一个意外发现!
本文作者在综合成本因素之下,决定用 Java 脚本来清理一下自己的 iCloud,结果却有了一个意外发现,即在 iCloud 中上传同一个视频和删除此视频之后,iCloud 的空间并不一致,这到底是...【详细内容】
2024-01-11  Search: JavaScript  点击:(97)  评论:(0)  加入收藏
JavaScript前端框架2024年展望
Angular、Next.js、React和Solid的维护者和创作者们展望2024年,分享了他们计划中的改进。译自2024 Predictions by JavaScript Frontend Framework Maintainers,作者 Loraine...【详细内容】
2024-01-05  Search: JavaScript  点击:(89)  评论:(0)  加入收藏
JavaScript开发者转向Rust的原因?
JavaScript开发者转向Rust的原因可能有很多,这里列出一些可能的原因: 性能: Rust是一种编译型语言,其性能通常优于JavaScript等解释型语言。对于需要处理大量数据或需要高并发的...【详细内容】
2024-01-04  Search: JavaScript  点击:(96)  评论:(0)  加入收藏
▌简易百科推荐
17 个你需要知道的 JavaScript 优化技巧
你可能一直在使用JavaScript搞开发,但很多时候你可能对它提供的最新功能并不感冒,尽管这些功能在无需编写额外代码的情况下就可以解决你的问题。作为前端开发人员,我们必须了解...【详细内容】
2024-04-03  前端新世界  微信公众号  Tags:JavaScript   点击:(4)  评论:(0)  加入收藏
你不可不知的 15 个 JavaScript 小贴士
在掌握如何编写JavaScript代码之后,那么就进阶到实践&mdash;&mdash;如何真正地解决问题。我们需要更改JS代码使其更简单、更易于阅读,因为这样的程序更易于团队成员之间紧密协...【详细内容】
2024-03-21  前端新世界  微信公众号  Tags:JavaScript   点击:(25)  评论:(0)  加入收藏
又出新JS运行时了!JS运行时大盘点
Node.js是基于Google V8引擎的JavaScript运行时,以非阻塞I/O和事件驱动架构为特色,实现全栈开发。它跨平台且拥有丰富的生态系统,但也面临安全性、TypeScript支持和性能等挑战...【详细内容】
2024-03-21  前端充电宝  微信公众号  Tags:JS   点击:(23)  评论:(0)  加入收藏
构建一个通用灵活的JavaScript插件系统?看完你也会!
在软件开发中,插件系统为应用程序提供了巨大的灵活性和可扩展性。它们允许开发者在不修改核心代码的情况下扩展和定制应用程序的功能。本文将详细介绍如何构建一个灵活的Java...【详细内容】
2024-03-20  前端历险记  微信公众号  Tags:JavaScript   点击:(20)  评论:(0)  加入收藏
对JavaScript代码压缩有什么好处?
对JavaScript代码进行压缩主要带来以下好处: 减小文件大小:通过移除代码中的空白符、换行符、注释,以及缩短变量名等方式,可以显著减小JavaScript文件的大小。这有助于减少网页...【详细内容】
2024-03-13  WangLiwen    Tags:JavaScript   点击:(2)  评论:(0)  加入收藏
跨端轻量JavaScript引擎的实现与探索
一、JavaScript 1.JavaScript语言JavaScript是ECMAScript的实现,由ECMA 39(欧洲计算机制造商协会39号技术委员会)负责制定ECMAScript标准。ECMAScript发展史: 2.JavaScript...【详细内容】
2024-03-12  京东云开发者    Tags:JavaScript   点击:(2)  评论:(0)  加入收藏
面向AI工程的五大JavaScript工具
令许多人惊讶的是,一向在Web开发领域中大放异彩的JavaScript在开发使用大语言模型(LLM)的应用程序方面同样大有价值。我们在本文中将介绍面向AI工程的五大工具,并为希望将LLM...【详细内容】
2024-02-06    51CTO  Tags:JavaScript   点击:(52)  评论:(0)  加入收藏
JS小知识,使用这6个小技巧,避免过多的使用 if 语句
最近在重构我的代码时,我注意到早期的代码使用了太多的 if 语句,达到了我以前从未见过的程度。这就是为什么我认为分享这些可以帮助我们避免使用过多 if 语句的简单技巧很重要...【详细内容】
2024-01-30  前端达人  今日头条  Tags:JS   点击:(56)  评论:(0)  加入收藏
18个JavaScript技巧:编写简洁高效的代码
本文翻译自 18 JavaScript Tips : You Should Know for Clean and Efficient Code,作者:Shefali, 略有删改。在这篇文章中,我将分享18个JavaScript技巧,以及一些你应该知道的示例...【详细内容】
2024-01-30  南城大前端  微信公众号  Tags:JavaScript   点击:(65)  评论:(0)  加入收藏
使用 JavaScript 清理我的 200GB iCloud,有了一个意外发现!
本文作者在综合成本因素之下,决定用 Java 脚本来清理一下自己的 iCloud,结果却有了一个意外发现,即在 iCloud 中上传同一个视频和删除此视频之后,iCloud 的空间并不一致,这到底是...【详细内容】
2024-01-11    CSDN  Tags:JavaScript   点击:(97)  评论:(0)  加入收藏
站内最新
站内热门
站内头条