当前位置:首页 > 科技  > 软件

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

来源: 责编: 时间:2023-08-05 11:45:41 5555观看
导读译者 | 布加迪审校 | 重楼如果您曾经浏览过购物网站,可能遇到过图像放大功能。它可以让您放大图像的特定区域,以便浏览。结合这个小小的重要功能可以大大改善您网站的用户体验。以一种无缝衔接的方式构建图像放大镜可能

译者 | 布加迪P8j28资讯网——每日最新资讯28at.com

审校 | 重楼P8j28资讯网——每日最新资讯28at.com

如果您曾经浏览过购物网站,可能遇到图像放大功能。它可以让您放大图像的特定区域,以便浏览。结合这个小小的重要功能可以大大改善您网站的用户体验。P8j28资讯网——每日最新资讯28at.com

P8j28资讯网——每日最新资讯28at.com

如果您正在构建一个照片库应用程序,图像放大镜也派上用场,因为放大图像的特定部分是一重要功能。P8j28资讯网——每日最新资讯28at.com

构建图像放大镜

该项目中使用的代码放在GitHub代码仓库中,可供人们免费使用,采用MIT许可证。P8j28资讯网——每日最新资讯28at.com

创建一个文件夹,在该文件夹中添加index.html文件、style.css文件和main.js文件。将这个样板代码添加到index.html中P8j28资讯网——每日最新资讯28at.com

<!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元素。然后在headerdiv中,添加h1标题元素来显示图像放大镜的标题。P8j28资讯网——每日最新资讯28at.com

您可以根据需要来定制文本。接下来,包括两个span元素,它们提供使用放大镜的说明,并向用户显示当前缩放级别。P8j28资讯网——每日最新资讯28at.com

在标题部分之后,创建一个类名为container”的div元素。在这个div中,添加另一个类名为magnifier”的div元素,并运用“hidden类将其隐藏起来P8j28资讯网——每日最新资讯28at.com

这个元素将表示放大镜图像。然后,添加一个script标签,src属性设置为/main.jsP8j28资讯网——每日最新资讯28at.com

<body> <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> <class="container"> <class="magnifier hidden"></div> </div> <script src="/main.js"></script></body>

把style.css文件中的代码换成以下代码。需要的话,您还可以使用Less之类的CSS预处理器。P8j28资讯网——每日最新资讯28at.com

: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;}> span:nth-child(3) { font-size: 20px;

在main.js文件中,使用document.querySelector方法检索带有类名放大镜容器”的HTML元素并将它们分别赋予给变量magnifier和变量container。P8j28资讯网——每日最新资讯28at.com

然后,使用getComputedStyle函数检索放大镜元素的宽度和高度,然后使用substring和indexOf方法从返回的字符串中提取数值。P8j28资讯网——每日最新资讯28at.com

将提取的宽度赋予变量magnifierWidth,将提取的高度赋予变量magnifierHeight。P8j28资讯网——每日最新资讯28at.com

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"));

接下来,为缩放级别、最大缩放级别以及光标和放大镜图像的位置设置变量。P8j28资讯网——每日最新资讯28at.com

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

在上面的代码块中,pointerX和pointerY都表示光标在X和Y轴上的位置。P8j28资讯网——每日最新资讯28at.com

在,定义两个辅助函数getZoomLevel返回当前缩放级别和getPointerPosition返回带有光标x坐标和y坐标的对象P8j28资讯网——每日最新资讯28at.com

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

接下来,创建一个updateMagImage函数,该函数使用当前光标位置创建一个新的MouseEvent对象,并将其分派给容器元素。这个函数负责更新放大镜图像。P8j28资讯网——每日最新资讯28at.com

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

现在,您应该为keyup事件的窗口对象添加一个事件侦听器,当用户按下ArrowUpArrowDown键时,可调整缩放级别。P8j28资讯网——每日最新资讯28at.com

keyup事件上的回调函数还负责更新缩放级别标签并触发updateMagImage函数。P8j28资讯网——每日最新资讯28at.com

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事件容器元素添加事件侦听器。P8j28资讯网——每日最新资讯28at.com

在回调函数中,添加从放大镜元素中移除hidden类以使其可见的功能,并计算鼠标相对容器的位置,考虑到页面滚动。P8j28资讯网——每日最新资讯28at.com

该函数还应该将放大镜的变换样式设置为计算位置,并根据缩放级别和鼠标位置确定放大镜图像的背景大小和位置。P8j28资讯网——每日最新资讯28at.com

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类添回到放大镜元素。P8j28资讯网——每日最新资讯28at.com

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

最后,为更新光标的x和y位置的mousmove事件向窗口对象添加事件侦听器。P8j28资讯网——每日最新资讯28at.com

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

就是这样您已成功地使用普通JavaScript构建了一个图像放大镜。P8j28资讯网——每日最新资讯28at.com

P8j28资讯网——每日最新资讯28at.com

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

通过允许用户放大图像的特定区域,放大镜可以让他们更清晰地观察产品细节。P8j28资讯网——每日最新资讯28at.com

这种增强的视觉探索水平给用户灌输了信心,因为他们可以做出明智的决定。这有助于提高转化率和提高客户保留率。P8j28资讯网——每日最新资讯28at.com

原文标题:How to Build an Image Magnifier With Vanilla JavaScript,作者:DAVID UZONDUP8j28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-126-0.html如何使用JavaScript创建一只图像放大镜?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 三言两语说透柯里化和反柯里化

下一篇: 谷歌KDD'23工作:如何提升推荐系统Ranking模型训练稳定性

标签:
  • 热门焦点
  • Redmi Pad评测:红米充满野心的一次尝试

    从Note系列到K系列,从蓝牙耳机到笔记本电脑,红米不知不觉之间也已经形成了自己颇有竞争力的产品体系,在中端和次旗舰市场上甚至要比小米新机的表现来得更好,正所谓“大丈夫生居
  • vivo TWS Air开箱体验:真轻 臻好听

    在vivo S15系列新机的发布会上,vivo的最新款真无线蓝牙耳机vivo TWS Air也一同发布,本次就这款耳机新品给大家带来一个简单的分享。外包装盒上,vivo TWS Air保持了vivo自家产
  • 太卷!Redmi MAX 100英寸电视便宜了:12999元买Redmi史上最大屏

    8月5日消息,从小米商城了解到,Redmi MAX 100英寸巨屏电视日前迎来官方优惠,到手价12999元,比发布价便宜了7000元,在大屏电视市场开卷。据了解,Redmi MAX 100
  • 分布式系统中的CAP理论,面试必问,你理解了嘛?

    对于刚刚接触分布式系统的小伙伴们来说,一提起分布式系统,就感觉高大上,深不可测。而且看了很多书和视频还是一脸懵逼。这篇文章主要使用大白话的方式,带你理解一下分布式系统
  • 小红书1周涨粉49W+,我总结了小白可以用的N条涨粉笔记

    作者:黄河懂运营一条性教育视频,被54万人&ldquo;珍藏&rdquo;是什么体验?最近,情感博主@公主是用鲜花做的,火了!仅仅凭借一条视频,光小红书就有超过128万人,为她疯狂点赞!更疯狂的是,这
  • 本地生活这块肥肉,拼多多也想吃一口

    出品/壹览商业 作者/李彦编辑/木鱼拼多多也看上本地生活这块蛋糕了。近期,拼多多在App首页&ldquo;充值中心&rdquo;入口上线了本机生活界面。壹览商业发现,该界面目前主要
  • 2纳米决战2025

    集微网报道 从三强争霸到四雄逐鹿,2nm的厮杀声已然隐约传来。无论是老牌劲旅台积电、三星,还是誓言重回先进制程领先地位的英特尔,甚至初成立不久的新
  • OPPO K11评测:旗舰级IMX890加持 2000元档最强影像手机

    【Techweb评测】中端机型用户群体巨大,占了中国目前手机市场的大头,一直以来都是各手机品牌的“必争之地”,其中OPPO K系列机型一直以来都以高品质、
  • 亲历马斯克血洗Twitter,硅谷的苦日子在后头

    文/刘哲铭  编辑/李薇  马斯克再次挥下裁员大刀。  美国时间11月14日,Twitter约4400名外包员工遭解雇,此次被解雇的员工的主要工作为内容审核等。此前,T
Top