在 JavaScript 中缩放到没有画布的光标

2024-01-03

我有一个<img>通过调整鼠标滚轮滚动来缩放transform: scale()。我希望缩放像 Google 地图一样,您可以缩放到鼠标光标所在的位置,而不是图像的中心。不过,我不想使用画布,只是为了学习体验(这也是我发现的其他问题并没有真正帮助的原因)。

我设置了一个JSFiddle https://jsfiddle.net/un17phdg/3/来演示问题。我的思考过程如下:当放大10%时,图像从图像中心向各个方向扩展10%。这意味着,例如,左边缘和右边缘将在每个方向上移动原始宽度的 5%。因此我尝试像这样解决这个问题:

  1. 计算鼠标距图像中心的偏移量
  2. 通过将鼠标偏移乘以缩放系数并除以二来计算新图像偏移(顶部和左侧)
  3. 应用胶印,看着它用一百万个燃烧的太阳的力量炸毁我的脸

看来我就是找不到合适的公式或算法。


最终我自己解决了这个问题,尽管只是通过查看现有的解决方案。这里是JSFiddle https://jsfiddle.net/rfpe0mhq/只包含必需品。

想法是首先设定transform-origin: 0 0。这可以确保在缩放时图像向下和向右扩展,而不是在所有四个边上分布宽度的增加。请注意,它不会重新定位图像,它只是更改所有转换的原点 https://developer.mozilla.org/en-US/docs/Web/CSS/transform-origin.

此外,此 JSFiddle 假定图像的上边距和左边距与容器元素的上边距和左边距对齐。如果在缩放之前应重新定位图像,则应通过transform: translate()translateX and translateY值需要相应更新。

逻辑的核心是这样的:

  // Track the percentage change between the old
  // and the new scale of the image
  const ratio = 1 - nextScale / currentScale

  // get the current mouse offset
  const {
    clientX,
    clientY
  } = event

  // The += here is extremely important!
  // The new 2D translation values are derived from the difference
  // between mouse cursor position and current (!) 2D translation.
  // So where is the mouse cursor relative to the translated image
  // This difference is then adjusted by the % change of the scaling
  translateX += (clientX - translateX) * ratio
  translateY += (clientY - translateY) * ratio

  /*
  This would work for the first wheel scroll. But afterwards, the 
  image will not be translated enough to offset the zooming because 
  we're not taking into account the existing translation
  translateX += (clientX - translateX) * ratio
  translateY += (clientY - translateY) * ratio
  */

总结一下所需的步骤:

  1. 计算下一个尺度
  2. 计算当前鼠标相对于平移图像的偏移
  3. 调整鼠标偏移以适应缩放的变化,例如,const percentChange = 1 - nextScale / currentScale
  4. 将调整后的鼠标偏移添加到现有值中translate()
  5. 应用变换(缩放和平移)

链接的 JSFiddle 还包括 Lodash 和transition: transform 330ms ease-in-out;使滚动更加平滑,并且不会过多影响浏览器性能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 JavaScript 中缩放到没有画布的光标 的相关文章

  • 非 DOM 对象上的 jQuery 自定义事件

    我最近阅读了一些代码 其功能如下 bob name Bob Smith rank 7 bob bind nameChanged function bob trigger nameChanged 这似乎有效 但我在 jQuery 文档或源代码
  • 动画进度元素值

    我有一个progress元素 该元素如下所示 div class container div div div
  • 如何使用 jest 模拟第三方库

    我正在开发一个node js应用程序使用nestjs我有一堂课叫LoggerService如下 export class LoggerService private logger Rollbar constructor this logge
  • 即使我可以监视其他方法,也无法监视事件处理程序

    我想使用 Jest Jasmine Enzyme 测试 React 中的事件处理程序 MyComponent js import React from react class MyComponent extends React Compon
  • jquery window.open 在 ajax 成功中被阻止

    尝试在我的 ajax 成功调用中打开一个新的浏览器窗口 但是 它被阻止为弹出窗口 我做了一些搜索 发现用户事件需要绑定到 window open 才能避免这种情况发生 我还找到了这个解决方案 您可以在 ajax 之前打开一个空白窗口 然后在
  • javascript中按tab键时如何调用函数?

    我有一个这样的功能 function whenEmpty field if field value field style backgroundColor ffcccc alert Please fill the field field f
  • 通过 node-http-proxy 保留基于 cookie 的会话

    我有一个简单的基于 Express 的 Node js Web 服务器 用于开发 JavaScript 应用程序 我将服务器设置为使用 node http proxy 来代理应用程序向在不同域和端口上运行的 Jetty 服务器发出的 API
  • Javascript - 将值从下拉框传递到 Google Maps API

    我正在使用 Google 地图 API 为一家出租车公司创建报价表 目前 用户在 2 个文本框中输入出发点和接载点 API 会计算两点之间的距离以及行程费用 我正在尝试添加两个具有设定位置的下拉框 以便用户可以选择这些位置之一或使用文本框输
  • 在d3.js中将2D形状转换为3D,并根据ANGULAR中的值调整高度

    我正在使用 d3 js v6 创建以下 2D 图表表示的 3D 图表 这个圆圈中有多个正方形 每个正方形都根据值分配了一种颜色 值越大 正方形越暗 现在我想将其转换为 3D 形状 其中当值变高时 只有特定正方形的高度会增加 因此结果在某种程
  • Typeahead.js substringMatcher 函数说明

    我只是在做一些研究Typeahead js这是一个非常酷的图书馆 感谢文档 我已经成功地获得了一个基本的示例 该文档也非常好 但是我试图弄清楚以下代码块实际上在做什么 var substringMatcher function strs r
  • 如何使JavaScript函数在Eclipse“大纲视图”中可见?

    我有这样的代码 但如果它在匿名函数中定义 则无法打开函数大纲 类没有问题 我该如何概述something2 请分享一些提示 我可以将所有函数标记为构造函数 但这是无效的方法 start of track event required deb
  • 如何将送货地址复制到帐单地址

    我想知道是否可以将送货地址复制到帐单地址 当用户单击与送货地址相同的复选框时 送货地址值将被复制到账单输入字段 我完成了大部分部分 但我不确定如何将选择菜单 状态 值复制到帐单地址 我真的很感谢任何帮助 My code document r
  • Twitter 嵌入时间轴小部件

    我继续下载http platform twitter com widgets js http platform twitter com widgets js And the http platform twitter com embed t
  • 当用户单击链接时,如何记录 MixPanel 事件?

    当用户单击某种类型的链接时 我试图在 MixPanel 中记录一个事件 我正在使用 JQuery 不引人注意地完成此操作 据我所知 我需要添加一个回调函数 以便在记录事件后将用户带到 URL 这是我正在使用的代码 不幸的是
  • 如何将函数内的捕获错误传递给父级

    我有这几行代码示例 想知道下面的逻辑到底如何 try var response child console log why here catch err console log should show this err function c
  • 数据表日期范围过滤器

    如何添加日期范围过滤器 like From To 我开始进行常规搜索和分页等工作 但我不知道如何制作日期范围过滤器 我正在使用数据表 1 10 11 版本 My code var oTable function callFilesTable
  • 如何在 Google 地图 V3 中创建编号地图标记?

    我正在制作一张上面有多个标记的地图 这些标记使用自定义图标 但我还想在顶部添加数字 我已经了解了如何使用旧版本的 API 来实现这一点 我怎样才能在V3中做到这一点 注意 当您将鼠标悬停在标记上时 标题 属性会创建一个工具提示 但我希望即使
  • 三级十进制有序列表 CSS

    我有一个 html 中的三级有序列表 我想为其提供如下样式 1 Item 1 1 1 Item 2 1 1 1 Item 3 下一个 plunker 中有一个 html 示例 http plnkr co edit DqhZ5pJILTUHG
  • 防止文本区域出现新行

    我正在开发聊天功能 使用 Vue 并使用文本区域作为输入 以便溢出换行 并且对于编写较长消息的用户来说更具可读性 不幸的是 当用户按下 Enter 键并提交时 光标会在提交之前移动到新行 从而使用户体验感觉不佳 关于如何使用普通 Javas
  • KeyboardAvoidingView - 隐藏键盘时重置高度

    我正在使用 React NativeKeyboardAvoidingView设置我的高度View当显示键盘时 但是当我关闭应用程序中的键盘时 视图的高度不会变回原来的值

随机推荐

  • 在诗歌项目上安装 GDAL

    我在 Poetry 管理的虚拟环境中安装 GDAL 时遇到问题 在 Ubuntu 18 04 发行版上工作 我已经发现的是 这个问题 https github com python poetry poetry issues 845在诗歌 g
  • 如何使用 pymc 制作离散状态马尔可夫模型?

    我试图找出如何正确制作离散状态马尔可夫链模型pymc http pymc devs github io pymc index html 举个例子 查看nbviewer http nbviewer ipython org github shp
  • window.location.href 不更改 URL

    我想更改提交表单后出现的 URL 尽管下面的代码似乎没有执行我希望执行的操作 如何更改地址栏中的 URL CODE
  • 理解列表理解

    我对编程有点陌生 我创建了一个在其初始值设定项中使用列表理解的类 如下 class Collection of word counts this class has one instance variable called counts w
  • 套接字连接()与绑定()

    Both connect and bind 系统调用将套接字文件描述符 关联 到一个地址 通常是 IP 端口组合 他们的原型是这样的 int connect int sockfd const struct sockaddr addr soc
  • 清除 Android 中的 Glide 图像缓存

    我正在使用 glide 库来显示图像 我正在尝试使用以下代码清除滑动缓存 Glide get MainActivity this clearDiskCache Glide get MainActivity this clearMemory
  • 在 Ubuntu Linux 中运行的 CodeIgniter IDE [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • addEventListener 与 onclick

    有什么区别addEventListener and onclick var h document getElementById a h onclick dothing1 h addEventListener click dothing2 上
  • 如何在 ubuntu 18.04.2 上访问 nuget 包管理器控制台

    所以我在我刚买的这台小笔记本电脑上安装了ubuntu 18 04 2 thinkpad x220 我正在尝试将其打造成一台可以在其上编写 ASP NET Core 应用程序的机器 然而 我一生都无法找到如何在 Ubuntu 终端的包管理器控
  • 什么时候需要 NS_RETURNS_RETAINED ?

    以下面的例子为例 NSString pcen NS RETURNS RETAINED return bridge transfer NSString CFURLCreateStringByAddingPercentEscapes NULL
  • Visual Studio 2010 启动时出现未知错误

    我正在尝试从桌面启动 Visual Studio 2010 但只是弹出此错误框 显示 未知错误 任何人都知道为什么会发生这种情况 我刚刚修复了它 卸载并重新安装了我的 NET Framework 版本 v4 0 然后 当我再次尝试启动 Vi
  • C 中的不透明(抽象)数据类型

    文件 api h include
  • Sublime Text 需要重新启动设置更改才能生效

    我的 Sublime Text 3 但也适用于 ST2 因为我在切换到 ST3 之前遇到了同样的问题 需要重新启动才能使任何设置更改生效 这种情况发生在办公室的 Mac Mini 上 但不会发生在我的 Macbook Pro 上 两者的设置
  • Android-Studio:错误:无法创建 Java 虚拟机

    我今天刚刚安装了Android studio 首先我必须为此 IDE 安装 jdk7 之后只有我能够启动 IDE 现在 当我尝试创建新项目时 出现错误 如下图所示 有人可以帮助我吗 我的身边缺少什么 就我而言 我更改了以下文件来修改虚拟机堆
  • 通过 C API 从字符串创建并调用 python 函数

    是否可以从字符串加载 python 函数 然后使用参数调用该函数并获取返回值 我正在使用 python C API 从我的 C 应用程序内部运行 python 代码 我可以使用以下命令从文件加载模块PyImport Import 从中获取一
  • 有 Yahoo 查询语言 (YQL) 的 .NET 示例吗?

    我想打一些简单的电话雅虎查询语言 YQL http developer yahoo com yql 有人在 NET 中实现过这个吗 这是我想从 NET 进行的查询 select MarketCapitalization from yahoo
  • Sammy 路由不工作

    我无法让 sammy js 路由按预期工作 我有以下 JavaScript function var app sammy main function this get function context context log start p
  • 硒未找到元素

    这是 HTML https www dropbox com s aiaw2u4j7dkmui2 Untitled 20picture png https www dropbox com s aiaw2u4j7dkmui2 Untitled
  • Newtonsoft.Json SerializeObject 不带转义反斜杠

    给出代码 dynamic foo new ExpandoObject foo Bar something string json Newtonsoft Json JsonConvert SerializeObject foo 输出如下 Ba
  • 在 JavaScript 中缩放到没有画布的光标

    我有一个 img 通过调整鼠标滚轮滚动来缩放transform scale 我希望缩放像 Google 地图一样 您可以缩放到鼠标光标所在的位置 而不是图像的中心 不过 我不想使用画布 只是为了学习体验 这也是我发现的其他问题并没有真正帮助