【问题标题】:Safari doesn't emit pointer events on overflowing SVG contentsSafari 不会在溢出的 SVG 内容上发出指针事件
【发布时间】:2018-07-11 23:47:19
【问题描述】:

我正在尝试将点击事件添加到具有可见溢出的 SVG 元素和其中溢出 SVG 的形状元素(圆/路径)。

在 Safari(9,10,11) 上,单击事件在形状元素(圆/路径)溢出的区域中不起作用,而在 SVG 中存在的区域中可以正常工作。

var count = 0;

function clickMe() {
  console.log("in click func");
  count++;
  document.getElementById("counter").innerHTML = count;
}
#counter {
  font-size: 2em;
}

#starSvg {
  pointer-events: auto;
  overflow: visible;
  position: absolute;
  left: 200px;
  top: 250px;
  border: 1px solid red;
}

#starPolygon {
  overflow: visible;
  fill: rgba(0, 153, 219, 1);
  pointer-events: visiblePainted;
  stroke-width: 4;
  stroke-linecap: square;
  stroke-linejoin: round;
  stroke: rgba(219, 0, 153, 1);
  cursor: pointer;
  shape-rendering: geometricPrecision
}

p {
  margin: 10px 0;
}
<div>
  <p>Open this webpage on Chrome &amp; safari</p>
  <p>On Chrome: Click work on all four hands of the star.</p>
  <p>On Safari: Click works only on the hands inside the red area(SVG bounding Rect).</p>

  <p style="position: absolute; top: 100px; left: 200px;">Click Event Counter:
    <span id="counter">0</span>
  </p>
  <div class="containter">
    <svg onclick="clickMe()" id="starSvg" width="100%" height="100%">
          <g width="100%" height="100%" transform="" style="overflow: visible; transform: rotate(45deg) translate(0, 0);">
            <polygon id="starPolygon" shape-rendering="geometricPrecision" points="0 -90,15 -15,90 0,15 15,0 90,-15 15,-90 0,-15 -15"></polygon>
          </g>
        </svg>
  </div>
</div>

这也是 Safari 中的错误吗?点击事件在包括 IE 在内的所有浏览器中都能正常工作。

【问题讨论】:

  • @Andreas 我已将代码添加到问题中。谢谢你纠正我。
  • id="starPolygon"="geometricPrecision" 这不是一个错误,如果它应该是什么
  • 你能在 Safari 上试试 jsfiddle.net/bp1r597e 吗?我无法测试。
  • 是的,这是一个错误,不过很容易解决,只需将 SVG 放大,以免溢出。
  • @SriramR,如果您无法移动点击事件或编辑多边形的路径/原点坐标,您能否指定您可以更改的内容?

标签: javascript html css svg


【解决方案1】:

这反映了 Webkit 错误报告 #140723:https://bugs.webkit.org/show_bug.cgi?id=140723

该错误报告链接到此 codepen 示例,重现您找到的完全相同的结果: https://codepen.io/anon/pen/pvPQqY

并在此处应用我在下面描述的修复:

https://codepen.io/anon/pen/YeOmGW

============

为清楚起见进行了编辑:证据很清楚,初始剪裁在最外面的视口 (svg) 边界处生效,同时溢出属性允许该剪裁区域之外的形状可见。实际上使指针事件无效。

换一种说法,证明剪裁适用于 IAW 此处的第一句:http://w3.org/TR/SVG11/masking.html#AutoClipAtViewportNotViewBox,同时符合此处的溢出规则(后三句):http://w3.org/TR/SVG11/masking.html#OverflowAndClipProperties 是 Safari 出现此问题的原因;

为了克服这个问题,OP 必须创建一个包装器视口来为不一致的实现所造成的困境创建一个(解决方法)解决方案。

这类似于添加任何其他可能需要包装所需内容的 HTML 结构。 (我真的很专注于帮助解决问题)

希望这会有所帮助。

var count = 0;
document.querySelector('svg').addEventListener('click',clickMe);

function clickMe(e) {
  console.log("clicked on: " + e.target.id);
  count++;
  document.getElementById("counter").innerHTML = count;
}
#counter {
  font-size: 2em;
}

#starSvg {
  pointer-events: auto;
  position: absolute;
  width: 100%;
  height: 100%;
  left:0;
  top:0;
}

#starPolygon {
  transform: translate(50%, 50%) rotate(45deg);
  fill: rgba(0, 153, 219, 1);
  stroke-width: 4;
  stroke-linecap: square;
  stroke-linejoin: round;
  stroke: rgba(219, 0, 153, 1);
  cursor: pointer;
  shape-rendering: geometricPrecision
}
#starClip {
  width: 100%;
  height: 100%;
  stroke-width: 1;
  stroke: red;
  fill: transparent;
}

p {
  margin: 10px 0;
}
<div>
  <p>Open this webpage on Chrome &amp; safari</p>
  <p>On Chrome: Click work on all four hands of the star.</p>
  <p>On Safari: Click works only on the hands inside the red area(SVG bounding Rect).</p>

  <p style="position: absolute; top: 100px; left: 200px;">Click Event Counter:
    <span id="counter">0</span>
  </p>
  <div class="containter">
    <svg id="starSvg">
          <rect id="starClip" x="50%" y="50%"></rect>
          <g>
            <polygon id="starPolygon" x="0" y="0" points="0 -90,15 -15,90 0,15 15,0 90,-15 15,-90 0,-15 -15"></polygon>
          </g>
        </svg>
  </div>
</div>

【讨论】:

  • 没有歧义,SVG规范中明确定义了默认的CSS溢出值是什么。
  • 我会尊重你的专业知识。证据很清楚,初始剪裁在最外面的视口 (svg) 边界生效,同时溢出属性允许该剪裁区域之外的形状可见。实际上呈现指针事件无效。
  • 换一种说法,有证据表明剪裁适用于IAW这里的第一句:w3.org/TR/SVG11/masking.html#AutoClipAtViewportNotViewBox,同时这里符合溢出规则(后三句):w3.org/TR/SVG11/masking.html#OverflowAndClipProperties;为了克服这个问题,OP 必须创建一个新的嵌入式视口来为不一致的实现所造成的困境创建一个(解决方法)解决方案。 @Robert Longson:这是一个更好的解释吗?
  • 根据我的 cmets,&lt;rect&gt; 可以很容易地成为 SVG 元素。因此,外部元素只是允许创建SVG 元素的必需结构,如所述要求中指定的那样。就像解决问题可能需要的任何其他 HTML 结构一样。 (我真的很专注于帮助解决问题)
【解决方案2】:

似乎已在 Safari 11.1 版中修复。

【讨论】:

    猜你喜欢
    • 2017-03-27
    • 2012-03-20
    • 2021-11-30
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多