0

0

如何实现 SVG 图像以鼠标指针位置为中心的平滑缩放

碧海醫心

碧海醫心

发布时间:2026-02-05 12:19:06

|

348人浏览过

|

来源于php中文网

原创

如何实现 SVG 图像以鼠标指针位置为中心的平滑缩放

本文详解如何在 svg 中实现以鼠标悬停/滚动位置为缩放中心的交互式缩放功能,通过坐标空间转换、`transform-origin` 动态设置与 css 变量协同控制,避免默认居中缩放的局限性。

要在 SVG 中实现“以鼠标指针位置为中心”的缩放(而非默认的 SVG 元素中心),关键在于三点:

  1. 将屏幕坐标(clientX/Y)准确映射到 SVG 用户坐标系
  2. 动态设置缩放元素的 transform-origin 为该 SVG 坐标
  3. 使用 CSS transform: scale() 配合 transition 实现平滑缩放动画

✅ 核心原理:坐标空间转换

SVG 的 getScreenCTM().inverse() 是核心工具——它返回一个从屏幕像素坐标(如 event.clientX, event.clientY)逆向映射到 SVG 本地用户坐标系的变换矩阵。配合 DOMPoint.matrixTransform() 即可获得精确的 SVG 内部坐标:

function cursorPoint(event: MouseEvent): DOMPoint {
  const point = new DOMPoint(event.clientX, event.clientY);
  return point.matrixTransform(svg.getScreenCTM()!.inverse());
}

⚠️ 注意:svg.getScreenCTM() 在 未渲染或未挂载时可能返回 null,建议添加空值检查(如 ! 断言或 if (ctm) 判断)。

✅ 完整 TypeScript + HTML 实现(适配你的 Angular 场景)

将原 @HostListener('wheel') 逻辑升级为支持锚点缩放:

玄鲸Timeline
玄鲸Timeline

一个AI驱动的历史时间线生成平台

下载
@HostListener('wheel', ['$event'])
onMouseWheel(event: WheelEvent) {
  event.preventDefault(); // 阻止默认滚动行为

  const svg = document.getElementById('svg') as SVGSVGElement;
  if (!svg) return;

  // 1️⃣ 获取鼠标在 SVG 用户坐标系中的位置
  const clientPoint = new DOMPoint(event.clientX, event.clientY);
  const svgPoint = clientPoint.matrixTransform(svg.getScreenCTM()!.inverse());

  // 2️⃣ 更新缩放级别(带边界限制)
  const delta = event.deltaY > 0 ? 0.1 : -0.1; // 向下滚放大,向上滚缩小
  this.zoom = Math.max(0.25, Math.min(5.0, this.zoom + delta));

  // 3️⃣ 设置 transform-origin 为鼠标对应 SVG 坐标(单位:px,SVG userSpace)
  svg.style.transformOrigin = `${svgPoint.x}px ${svgPoint.y}px`;

  // 4️⃣ 应用缩放(推荐用 CSS 变量 + transition,更稳定)
  svg.style.setProperty('--zoom-factor', this.zoom.toString());
  svg.style.transition = 'transform 200ms ease';
}

对应 HTML 结构保持不变:

并在 CSS 中定义缩放逻辑:

#svg {
  --zoom-factor: 1;
  transform: scale(var(--zoom-factor));
  transform-origin: center; /* 默认值,会被 JS 动态覆盖 */
  transition: transform 200ms ease;
}

⚠️ 重要注意事项

  • transform-origin 单位必须是 SVG 用户坐标系单位(如 px),不是百分比或 vw/vh
  • 若 SVG 外层有 transform、scale 或 overflow: hidden 等样式,getScreenCTM() 结果可能失真,建议确保 SVG 直接嵌入文档流且无干扰父级变换;
  • Angular 中操作 style.setProperty 是安全的,但若需更高性能(如高频缩放),可考虑使用 Renderer2;
  • 移动端需额外监听 touchmove + touchstart 模拟,此处聚焦桌面端 wheel;
  • 缩放后若需拖拽平移,应同步更新 transform: translate(x,y) scale(s),此时 transform-origin 仍生效,但需注意复合变换顺序(CSS 中 transform 是右→左执行,即 scale 先于 translate)。

✅ 总结

以鼠标位置为中心缩放 SVG,本质是「坐标对齐」+「原点控制」:
✅ 用 getScreenCTM().inverse() 将屏幕坐标转为 SVG 坐标;
✅ 用 element.style.transformOrigin = 'x y' 动态设定缩放基点;
✅ 用 CSS transform: scale() + transition 实现声明式动画。

这一方案兼容现代浏览器(Chrome/Firefox/Safari ≥ v79),无需第三方库,轻量、精准、可扩展性强。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
chrome什么意思
chrome什么意思

chrome是浏览器的意思,由Google开发的网络浏览器,它在2008年首次发布,并迅速成为全球最受欢迎的浏览器之一。本专题为大家提供chrome相关的文章、下载、课程内容,供大家免费下载体验。

889

2023.08.11

chrome无法加载插件怎么办
chrome无法加载插件怎么办

chrome无法加载插件可以通过检查插件是否已正确安装、禁用和启用插件、清除插件缓存、更新浏览器和插件、检查网络连接和尝试在隐身模式下加载插件方法解决。更多关于chrome相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

765

2023.11.06

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

238

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

580

2024.03.01

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

794

2023.08.22

overflow什么意思
overflow什么意思

overflow是一个用于控制元素溢出内容的属性,当元素的内容超出其指定的尺寸时,overflow属性可以决定如何处理这些溢出的内容。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1778

2024.08.15

css3transition
css3transition

css3transition属性用于指定如何从一个CSS样式过渡到另一个CSS样式,本专题为大家提供transition相关的文章、相关下载和相关课程,大家可以免费体验。

233

2023.06.27

微信网页版文件传输助手教程合集
微信网页版文件传输助手教程合集

本专题整合了微信网页版文件传输助手教程、入口等等内容,阅读专题下面的文章了解更多详细内容。

15

2026.02.04

微信文件过期恢复教程
微信文件过期恢复教程

本专题整合了微信文件过期恢复方法、技巧教程,阅读专题下面的文章了解更多详细内容。

10

2026.02.04

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 0.8万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.2万人学习

CSS教程
CSS教程

共754课时 | 27.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号