У меня много проблем с плохой производительностью в IE (все версии, включая IE11), в виджетах с поддержкой javascript HTML/SVG, только когда виджет размещен на определенной странице.
После определения того, что основной причиной замедления был перерисован слой paint/render, и исчерпывающий информацию об этом, я мог бы выйти из IE Developer Tools, я прибегал для проб и ошибок, отключающих классы предков по одному, пока производительность не улучшится; затем, при определении класса, отключая правила стиля по одному.
Вся моя проблема, похоже, сводится к одному правилу overflow: hidden;
для предка нескольких divs вверх по дереву.
Разница, которую он делает, невероятна: с overflow: hidden;
вверх по дереву, простое взаимодействие с пользователем (выделение пути SVG, создание текстовой метки HTML, отображение метки и ее расположение относительно пути и контейнера SVG) процессор уменьшает частоту кадров пользовательского интерфейса до нуля и замораживает все мертвые в пределах от 1000 до 4000 миллисекунд за взаимодействие. Без overflow: hidden;
у предка он заканчивается в десятки миллисекунд, и частота кадров никогда не опускается ниже половины (не IE-браузеры одинаковы независимо от overflow: hidden;
).
-
Здесь профиль с
overflow: hidden;
для предка, профилирующий как входящие, так и выключенные взаимодействия, фильтруется для рисования событий: -
Здесь профиль без
overflow: hidden;
для предка, профилирующий как входящие, так и выключенные взаимодействия, фильтруется для рисования событий. Единственное изменение заключалось в тике или отключении галочки рядом со стилемoverflow: hidden;
в инспекторе DOM, и неважно, в каком порядке выполняю тесты:
Я не хочу просто переопределять этот overflow: hidden;
как липкую штукатурку и говорить о выполненной работе, не понимая, как это происходит, и рискуя повторением проблемы с другими, казалось бы, тривиальными изменениями CSS. Я бы предпочел понять, почему overflow: hidden;
делает такую разницу и адрес надежным способом, который работает независимо от применяемого правила переполнения.
К сожалению, я не могу опубликовать полную демоверсию, но здесь приводится резюме соответствующей части структуры DOM с комментариями к стилям, связанным с компоновкой:
<div class="responsive-grid">
<!-- ...lots of nested divs that simply inherit styles, I can't change this aspect of the Drupal layout -->
<div id="panel-5" class="col-12"> <!-- width: 100%; float: left -->
<!-- this is the first element IE looks at for offsetWidth when doing the changes below -->
<!-- ...a few more nested divs without layout-changing styles -->
<div class="panel"> <!-- overflow: hidden; clear: both; border: 1px; -->
<!-- this is the element where removing the overflow: hidden changes everything -->
<!-- I'm not sure what clear:both is for here, since no siblings. Seems redundant -->
<!-- ...a few more nested divs with no style rules, some contain <p>s <h2>s etc... -->
<div class="container"> <!-- position: relative; -->
<div class="sub-column col-8"> <!-- width: 66%; display: inline-block -->
<div class="square"> <!-- width: 100%; padding-bottom: 100%; position: relative -->
<svg viewbox="0 0 500 500" preserveAspectRatio="XMinYMin meet" ...>
<!-- svg position: absolute; width:100%; height: 100% -->
Many paths here
<div class="label"> <!-- fixed width in pixels; position: absolute -->
Some text here
</div>
</div>
</div>
<div class="sub-column col-4"> <!-- width: 33%; display: inline-block -->
<div class="sidebar">
Many interactive controls here
<!-- .square, svg andd .sidebar contain the only elements that are updated -->
</div>
</div>
</div>
<!-- some more ordinary position: static text containers -->
</div>
</div>
</div>
Что может происходить здесь, и есть ли способ предотвратить это, не удаляя/запрещая overflow: hidden;
в элементе предка?
Я видел Как избежать затрат на переполнение: скрытый?, но оба вопроса и ответы кажутся специфичными для таблиц HTML и старой ошибки Webkit с тех пор исправлено.
Они также кажутся специфичными для случаев, когда контент, обрезанный переполнением, становится ненужным; причуда моего случая состоит в том, что overflow: hidden;
на самом деле не обрезается (на всякий случай) на этой странице (но я не могу просто удалить его, потому что эта часть шаблона затрагивает сотни других страниц, где это имеет эффект).
Обновление: Сюжет сгущается. Мне удалось повторить проблему с моим виджетами в более простой структуре HTML и обнаружил, что проблема возникает только в том случае, если и overflow: hidden;
и border-radius
(в моем случае, 3px) установлены в одном контейнере. С одной, но не с другой, проблема исчезает.