【发布时间】:2021-01-26 23:41:04
【问题描述】:
我发现 Firefox 和 Chrome 处理在我需要修复的图像附近单击的方式有所不同。我有一个矩形,其图像约占前 65%。我保留了图像的纵横比,因此它看起来比完整的矩形更窄,这非常适合我的需要。
但是,当我在图像附近单击时,在图像两侧的边距空间中,Firefox 说我单击了矩形,而 Chrome 说我单击了图像。检查元素,我发现图像元素在两种情况下都跨越了矩形的整个宽度,但我需要的是 Firefox 中的功能(好像我正在单击“通过”这些图像边距)。
用一个例子可以更好地解释这一点。下面的代码在前 65% 中显示了一个矩形和一个窄图像。如果我在 Firefox 中单击图像的任一侧,它会说 event.target.nodeName 是“使用”(我在 <g> 中有矩形),而 Chrome 说它是“图像”。
function clickHandler(ev) {
ev = ev || window.event;
alert (ev.target.nodeName);
}
text {
text-anchor: middle;
font-size: 10px;
font-weight: bold;
font-family: "Times New Roman";
pointer-events: none;
}
.m {
stroke: dimgray;
stroke-opacity: 1.0;
stroke-width: 1.5;
fill-opacity: 1.0;
fill: white;
}
<svg id="TreeTest" xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<g id="G-Box">
<rect width="80" height="80" rx="5" ry="5"/>
</g>
</defs>
<g id="HenryProctor">
<use tabindex="0" xlink:href="#G-Box" class="m" x="50" y="50" onclick="clickHandler(evt);">
</use>
<text x="90" y="106" dy="1em">Henry</text>
<text x="90" y="106" dy="2em">Proctor</text>
<image x="52.5" y="52.5" width="75" height="51.5" xlink:href="https://parallaxviewpoint.com/Images/Proctor_Henry_b1833.jpg" preserveAspectRatio="xMidYMin meet" onclick="clickHandler(evt);">
</image>
</g>
</svg>
有没有办法检测点击只在图像的可见部分?
[为澄清而编辑] 我需要区分单击可见图像和单击矩形中其他任何位置。我在两者上都有我的事件处理程序,但它采取的行动取决于知道用户点击了什么。
【问题讨论】:
-
编辑器工具栏上有 [] 按钮可以在运行的 SO sn-p 中转换您的代码
-
有趣的是,规范说图像的宽度和高度是强制性的(这没有帮助),但 Firefox 和 Chrome 似乎都忽略了这一点。如果我只指定高度,那么它似乎确实消除了那些填充边距,但图像是左对齐的。如果我能找到一种方法将其居中,那么它会起作用,但会违反规范。
-
@ACProctor the spec says no such thing。请特别参阅注释 2,其中明确指出高度和宽度是可选的。
-
我的立场是正确的,@RobertLongson。我在developer.mozilla.org/en-US/docs/Web/SVG/Element/image 阅读了关于高度和宽度的“此属性是必需的”的注释,并认为我在规范中看到了它。我的错。
-
我没有接受任何这些答案,因为这似乎是规范需要解决的问题。正如我在下面的另一条评论中所说,如果 CSS 指针事件有一个选项可以将真正的可见元素内容与任何扩展填充区分开来,那么它将解决这个问题。在我的特殊情况下,SVG 是由设计工具生成的,因此我能够在生成代码之前评估每个图像的纵横比,但这并不是一个真正的通用解决方案。
标签: image svg cross-browser