Что должен вернуть getBoundingClientRect () для XHTML-элементов foreignObject, встроенных в SVG? - PullRequest
3 голосов
/ 08 ноября 2011

Рассмотрим документ 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() );

Обратите внимание:

  • body документа HTML смещен в SVG, повернут и перекошен.
  • SVG масштабируется таким образом, чтобы 1 единица SVG отличалась от 1 пикселя экрана.

Должен ли getBoundingClientRect() возвращать левый / правый / верхний / нижний край выравниваемого экрана ограничивающего прямоугольника в веб-браузере?

Или он должен возвращать координаты объекта в контексте body и предоставить пользователю возможность преобразовать пространство foreignObject в пиксели экрана для масштабированного / повернутого / перекошенного SVG?

Меня не очень интересует ваше мнение о том, как это должно вести себя, как четкая интерпретация того, как соответствующие спецификации диктуют, что должен вести себя. Вот простой пример этого, показывающий, что Chrome выполняет первое, в то время как Firefox делает второе: http://phrogz.net/SVG/html_location_in_svg_in_html.xhtml

Редактировать : Вот ошибка Webkit, описывающая некорректную обработку Chrome / Safari этого теста: https://bugs.webkit.org/show_bug.cgi?id=71819

1 Ответ

2 голосов
/ 08 ноября 2011

Как отметил Борис Збарский в моем (неверном) отчете об ошибке , спецификация CSSOM View Module говорит:

* 1009Методы * и getBoundingClientRect() предоставляют информацию о положении краев рамок элемента относительно области просмотра.

… и спецификация в другом месте явно определяет viewport as:

[...], определенный в CSS 2.1, если только нет элемента-предка foreignObject в пространстве имен http://www.w3.org/2000/svg, в этом случаеэтот элемент действует как область просмотра и содержит начальный блок .

Таким образом, getBoundingClientRect(), вызываемый для элемента HTML внутри элемента <foreignObject> в элементе <svg>, должен возвращать ограничивающую рамкуэлемент в области просмотра специально для тела HTML;При желании сценарист может преобразовать это в пространство экрана.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...