尝试为内联 SVG 创建样式化的工具提示

Posted

技术标签:

【中文标题】尝试为内联 SVG 创建样式化的工具提示【英文标题】:Trying to create a styled tooltip for an inline SVG 【发布时间】:2021-11-25 14:01:52 【问题描述】:

Js 新手我正在通过内联 svg 构建交互式发音指南。

您可以在这里查看:https://codepen.io/r-pg/pen/OJgoXWQ

我目前正在尝试添加将显示相关句子的基本样式工具提示。我已经绑定了它相对于光标位置的坐标。

我为此使用的 js 在这里:

function tooldef() 
  let t1 = document.querySelector('text[data-tooltip]');
  let t2 = document.querySelector('text:nth-of-type(2)');

  t1.addEventListener('onmousemove', showToolTip(evt));
  t2.addEventListener('onmousemove', showToolTip(evt));


function showToolTip(evt) 
  let t = evt.currentTarget;
  let phrase = t.getAttribute('data-tooltip');

  document.getElementById('tooltip').innerhtml = phrase;
  tooltip.style.display = "block";

  tooltip.style.left = evt.offsetX + 0 + 'px';
  tooltip.style.top = evt.offsetY + 0 + 'px';
  /* console.log(tooltip);*/
  console.log(evt.offsetX);
  console.log(evt.offsetY);


function hideToolTip(evt) 
  tooltip.style.display = "none";


当通过 codepen 或本地加载时,此功能非常好,但是当我将其应用于 Wordpress 时,它会将工具提示推向正确的广告,我无法确定原因。代码有问题还是 WP 内部问题?

【问题讨论】:

有点难以分辨——但我的猜测可能是 %'s 中指定的工具提示的转换/翻译 CSS 可能是罪魁祸首。您可能必须根据 SVG 最终的大小动态计算像素等效值 - 或者将该变换直接移动到 SVG 中,以便它采用相对于 SVG 而不是 Body 元素的单位。 感谢您的建议。检查代码后,我实际上注释掉了翻译 CSS,结果仍然是一样的。使用 offsetX/Y 将其发送到左侧,而 pageX/Y 和客户端 X/Y 将其发送到右侧。我有这样一种方式,我可以检索目标的 XY 坐标但是我无法让工具提示显示在那个确切的点上,有没有一种方法可以设置这些相对于 SVG 点的坐标?谢谢 【参考方案1】:

您用于定位工具提示的代码假设了以下几点:

    您的 SVG 已达到 100% 的比例。 您的 SVG 位于页面的左上角

如果您将 SVG 嵌入到其他内容中,那么其中一个或两个将不再适用。

您将 mousemove 事件附加到 SVG <text> 元素。所以事件中返回的坐标将在 SVG 坐标空间中。如果 SVG 缩放到 1070 x 900 以外的任何尺寸,那么您的事件坐标将与页面坐标不匹配。

如果您始终以 1070 x 900 显示 SVG,那么您的解决方法可能很简单,只需获取 SVG 的页面偏移量,然后将该 X 和 Y 位置添加到事件中返回的位置。

但是,如果您要缩放 SVG,则需要将坐标从 SVG 坐标转换为页面坐标。关于该主题还有许多其他问题。比如这个:https://***.com/a/48354404/1292848

【讨论】:

以上是关于尝试为内联 SVG 创建样式化的工具提示的主要内容,如果未能解决你的问题,请参考以下文章

如何将带有css样式的内联SVG从浏览器保存/导出到图像文件

SVG:为啥外部 css 会覆盖文本的内联样式?

从样式表定位内联 SVG

内联样式的 svg 内容安全策略

在 React 中用内联 svg 替换图像元素

Webpack 从我的样式表中的内联 SVG 中去除标签,我不知道为啥