Может ли доступ к информации о макете вызвать перекомпоновку браузера?

Я знаю, что установка свойств стиля приводит к переформатированию браузера. Возможно ли, что перекомпоновка браузера также происходит при доступе к свойствам макета. Если да, не могли бы вы привести конкретный пример, почему это может вызвать перекомпоновку браузера?


person Geek    schedule 14.09.2012    source источник
comment
Это анекдотично, но я видел элементы перекомпоновки Chrome, когда просто пытался проверить элемент в Dev Tools. Даже если проверяемый элемент никак не был связан с элементом, который был перекомпонован.   -  person DCoder    schedule 14.09.2012
comment
Что именно вы подразумеваете под свойствами макета?   -  person Bergi    schedule 14.09.2012
comment
Свойства макета @Bergi как на этом сайте   -  person Geek    schedule 14.09.2012
comment
OK. Нет, получение свойств стиля css (а не их вычисляемых значений) никогда не вызывает перекомпоновку   -  person Bergi    schedule 14.09.2012
comment
@Bergi, можете ли вы объяснить в ответе, почему тогда переполнение стиля вычисляемых значений?   -  person Geek    schedule 14.09.2012
comment
@Geek: это может сбросить очередь ожидающих перекомпоновок. Смотрите вопросы, которые я связал как дубликаты, и мою дискуссию с Авраамом ниже для деталей.   -  person Bergi    schedule 14.09.2012
comment
@берги . спасибо за эти ссылки, хотя я не думаю, что вопрос дублируется. Однако они были полезны, и я понял идею.   -  person Geek    schedule 14.09.2012


Ответы (4)


Конечно, это зависит от реализации, но обычно браузер запускает перекомпоновку при чтении свойства элемента, если он считает, что данные макета необходимо повторно запросить (например, некоторые свойства, связанные с макетом, в этом элементе или любой родительский элемент изменился).

Вы можете найти список затронутых свойств для WebKit здесь: Как (не) активировать макет в WebKit. Более общая статья с примерами: Визуализация: перерисовка, перекомпоновка/релейаут, изменение стиля

person Dmitry Pashkevich    schedule 14.09.2012

Получение свойств может быть (см. ниже), но изменение свойств будет. Свойства, связанные со стилем, такие как ele.width для экземпляров. Свойства местоположения, такие как src тега iframe или img, будут.

Также обратите внимание, что присоединение прослушивателей событий (on*=..., addEventListener(*,...) и т. д.) вызывает перекомпоновку. Это происходит из-за того, что события передаются от самого внешнего родительского элемента к элементу src и всплывают из элемента src через цепочку родительских элементов.

Более того, современные браузеры (например, Chrome) задерживают обновление графического интерфейса, если указанная страница не просматривается. Это вызывает перекомпоновку, когда страница снова становится активной из-за того, что браузер проверяет правильность отображения страницы. Эта задержка/очередь может привести к тому, что свойства получения будут выглядеть так, как будто они вызывают перекомпоновку, когда на самом деле браузер следит за тем, чтобы они отображались правильно.

person SReject    schedule 14.09.2012
comment
Не могли бы вы объяснить, почему прослушиватель событий может вызвать перекомпоновку? Я не могу в это поверить. - person Bergi; 14.09.2012
comment
В зависимости от браузера, когда подключен прослушиватель событий, браузер перемещается от самого внешнего элемента внутрь к рассматриваемому элементу (EIQ). при этом браузеру необходимо проверить позиционирование, ширину и т. д., чтобы они отображались правильно, чтобы такие события, как наведение курсора, щелчок, выбор и т. д., срабатывали, как и предполагалось. Я не могу объяснить причину, но пример — щелчок для EIQ с закругленными углами. Событие не должно срабатывать, если щелкнуть там, где обычно находится угол (который был закруглен). - person SReject; 14.09.2012

Если вы не меняете свойство CSS, а только обращаетесь к нему, то нет, страницу не нужно будет перерисовывать.

person Abraham    schedule 14.09.2012
comment
Есть много не-CSS-свойств, которые вызывают перекомпоновку, и есть даже некоторые css-свойства, которые этого не делают. - person Bergi; 14.09.2012
comment
Ну, я имел в виду не изменение свойства, а получение только значения. Я знаю, что установка свойств часто вызывает перекомпоновку. - person Abraham; 14.09.2012
comment
О, конечно, получение стилей css никогда не приведет к перекомпоновке. Но можно получить вычисляемые стили. - person Bergi; 14.09.2012
comment
Даже если вы не меняете никаких значений? - person Abraham; 14.09.2012
comment
По крайней мере, в современных браузерах — у них есть очередь перекомпоновки вместо обработки всего алгоритма каждый раз, когда что-то изменяется — и перед получением вычисленных значений макета им нужно будет очистить эту очередь. - person Bergi; 14.09.2012

Я знаю, что это поздно для игры, и это отвечает так, как вы можете найти, если вы прочитаете ссылки, которые уже разместили другие, но это заслуживает того, чтобы прямо указать здесь:

Перед браузером стоит задача предоставить вам текущее значение, поэтому, как правило, он будет переформатировать и перерисовывать, чтобы убедиться, что то, что у вас есть, соответствует значению прямо сейчас. Я считаю, что это помогает думать об этом таким образом: КАЖДЫЙ РАЗ, когда вы запрашиваете положение или размер ЛЮБОГО ЭЛЕМЕНТА на странице, вы можете предположить, что собираетесь вызвать перекомпоновку/перерисовку. Нет, это не всегда верно на 100%, но это достаточно близко к 100%, что вам следует просто предположить, если вы запрашиваете верх, лево, низ, право, высоту, ширину или что-либо, что влияет на эти измерения (например, масштаб, вращение). и т. д.), вы вызовете R/R. Это самый конкретный ответ, который я могу вам дать.

Опять же, это не всегда верно на 100 %, но я считаю, что если вы думаете об этом таким образом, это поможет в 98 % случаев, когда это правда, и не повредит, как много для других 2%, так как это помогает для 98.

person borbulon    schedule 07.08.2013