GetBoundingClientRect () возвращает неправильные значения для вложенных SVG в Chrome

У меня возникают некоторые проблемы с размером элемента svg-dom, превышающим заданный размер, если элемент внутри него больше или установлен в другое положение. Я сделал скрипт js, где вы можете его воспроизвести. Просто осмотрите его и проверьте размер svg3. Если вы сделаете это в Chrome, он будет установлен на 500 пикселей на 500 пикселей, в firefox он будет установлен на заданный размер svg. Вот рабочий пример: https://jsfiddle.net/w1gftej0/17/ А вот код:

   <div style = "width:200px;height:70px">
        <div style = "width:100%;height:100%;">
            <svg id = "svg1" width = "100%" height = "90%">
                <rect height = "100%" width = "100%" fill = "#00001a"></rect>
                <svg id = "svg2" width = "90%" height = "10%" x = "10%">
                    <rect height = "100%" width = "100%" fill = "#ff4d4d"></rect>
                </svg>
                <svg id = "svg3" width = "90%" height = "90%" x = "10%" y = "10%">
                    <rect height = "100%" width = "100%" fill = "#ff4d4d"></rect>
                    <line x1 = "0%" x2 = "500px" y1 = "25%" y2 = "25%" stroke = "#236ce0" />
                    <line x1 = "50%" x2 = "50%" y1 = "0%" y2 = "500px" stroke = "#236ce0" />
                </svg>
                <svg id = "svg4" width = "10%" height = "90%" y = "10%">
                    <rect height = "100%" width = "100%" fill = "#ff4d4d"></rect>
                </svg>
            </svg>
        </div>
    </div>
</div>

Такое поведение вызывает у меня довольно много головной боли во время разработки, есть ли какие-либо исправления, которые заставляют chrome / edge вести себя как firefox? Я понимаю, что если все элементы внутри svg меньше, этой проблемы не существует. Однако с приложением, над которым я работаю, это полностью нарушает функциональность, если по какой-то причине элемент svg больше. (Я использую getBoundingClientRect для расчета положения мыши). Я хотел бы получить советы, как с этим справиться.

Это продолжение вопроса, который я задал около 2 месяцев назад: Высота вложенной ширины SVG, установленная в%, не работает в хроме или краю

редактировать:

Возможно, ошибка, о ней сообщается здесь: https://bugs.chromium.org/p/chromium/issues/detail?id=914324

Обычно не рекомендуется использовать высоту / ширину для определения размеров SVG .... для этого и предназначен viewbox.

Paulie_D 10.12.2018 17:41

Возможно, вам придется дополнительно объяснить, что вы считаете неправильным. Если я изменю атрибуты width и height для svg3 с помощью инспектора, я увижу тот же результат как в Firefox, так и в Chrome.

Paul LeBeau 11.12.2018 11:41

@PaulLeBeau Я расширил пример в скрипте, чтобы он записывал размер на консоль. Для меня это 500/500 в хроме и 180 / 56,69 в firefox.

Haldor 12.12.2018 11:13

@Paulie_D Я не уверен, что понимаю, как вы хотите, чтобы я кодировал размеры. Насколько я знаю (довольно новый для svg) окно просмотра контролирует то, что видно внутри области просмотра, моя проблема в том, что элемент svg (viewport) становится больше, чем установленный размер в chrome, но не в firefox.

Haldor 12.12.2018 11:23

@Haldor Я не вижу никаких изменений в вашем фрагменте или связанной скрипке.

Paul LeBeau 12.12.2018 11:43

@PaulLeBeau исправил ссылку

Haldor 12.12.2018 11:51

Похоже на ошибку в Chrome. Он отображается правильно, просто кажется, что он возвращает неправильные значения из getBoundingClientRect(). Сообщите об ошибке на crbug.com

Paul LeBeau 12.12.2018 12:01

Если да, пожалуйста, разместите здесь ссылку об ошибке для будущих читателей.

Paul LeBeau 12.12.2018 12:03

@PaulLeBeau, хорошо, это можно увидеть по-другому, если вы проверите элемент и посмотрите на контур. Об этом сообщается на crbug.com. Спасибо.

Haldor 12.12.2018 13:37

Наблюдал такой же баг: он как-то связан с экранами. У меня два разных экрана: на одном экране все работает нормально, на главном экране getBoundingRect выдает ошибку с соотношением 1,25 по обеим осям (и нет, два экрана не имеют такой разницы в размерах рациона)

Bruno C 12.03.2020 15:59
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
0
10
527
0

Другие вопросы по теме