簡體   English   中英

getBoundingClientRect()應該為SVG中嵌入的foreignObject XHTML元素返回什么?

[英]What should getBoundingClientRect() return for foreignObject XHTML elements embedded in SVG?

考慮像這樣的SVG文檔......

<svg viewBox="0 0 200 200" width="100%" height="100%" …>
  <g transform="rotate(45) skewX(10)">
    <foreignObject x="100" y="200" width="10" …>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p id="foo">Hi Mom!</p>
      </body>
    </foreignObject>
  </g>
</svg>

......和這樣的JavaScript代碼......

console.log( document.getElementById('foo').getBoundingClientRect() );

請注意:

  • HTML文檔的body在SVG中偏移,並且旋轉和傾斜。
  • 縮放SVG,使得1個SVG單元與1個屏幕像素不同。

getBoundingClientRect()是否應返回Web瀏覽器中屏幕對齊的邊界矩形的左/右/上/下?

或者它應該在body的上下文中返回對象的坐標,並將其留給用戶從foreignObject空間轉換為縮放/旋轉/傾斜SVG的屏幕像素?

我對你如何表現出如此行為的看法並不感興趣,因為它明確解釋了所涉及的規范如何規定這應該表現出來。

這是一個簡單的例子,顯示Chrome執行前者而Firefox執行后者: http//phrogz.net/SVG/html_location_in_svg_in_html.xhtml

編輯 :這是描述Chrome / Safari對此測試用例的錯誤處理的Webkit錯誤: https//bugs.webkit.org/show_bug.cgi?id = 71819

正如Boris Zbarsky在我的(不正確的)錯誤報告中指出的那樣CSSOM View Module規范說:

getClientRects()getBoundingClientRect()方法提供有關元素相對於視口的邊框邊緣位置的信息。

...並且其他地方的規范明確將viewport定義為:

[...]由CSS 2.1定義,除非在http://www.w3.org/2000/svg名稱空間中有一個祖先的foreignObject元素,在這種情況下該元素充當視口和初始包含塊

總之,調用<svg>元素中<foreignObject>內的HTML元素的getBoundingClientRect()應該返回視口中元素的邊界框,專門用於HTML主體; 如果需要,由腳本編寫者將其從此轉換為屏幕空間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM