我有一个需要检查小部件中%width元素的当前实际像素宽度的函数。在普通的浏览器上,它在IE上运行良好(所有版本包括IE11),它通常很好;但是当小部件被放置在具有相当正常的复杂程度的响应式页面上时,许多父级div也有%宽度,IE锁定并花费半秒或更多时间来简单地计算一个简单元素的宽度,然后开始重新在长时间内CPU使用率超过100%(其他浏览器只需几毫秒)就像疯了一样渲染。
我看过许多评论,IE中的宽度和高度计算因速度慢而臭名昭着,通常在处理许多基于%的宽度时; for example:
浏览器本地
offsetWidth
...在某些情况下(例如与大型表进行交互时),IE中的速度非常慢;
在开发人员工具用户界面响应能力面板中,我设法将其跟踪到SVG中看似随机的单个元素。当我一直展开那个绿色矩形时,它的95%以上只是包含200多个元素的SVG地图中的一个不起眼的元素:
根本不需要IE来查看SVG的内容 - svg
元素中包含的SVG路径肯定不会影响祖先的宽度或高度。更糟糕的是,在此之后,它会进行大量不必要的重新渲染,包括(我相信)每个SVG元素,即使我正在做的事情甚至不应该触及SVG。
我的HTML结构基本上是这个(专注于主要的布局元素和样式):
<div class="responsive-grid">
<!-- ...lots of nested divs, I have no control over these -->
<div id="panel-5" class="col-12"> <!-- width: 100% float: left -->
<!-- this is the element where IE begins its offsetWidth frenzy -->
<div class="column-container"> <!-- position: absolute to fix column height -->
<div class="sub-column"> <!-- 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% -->
<!-- lots and lots of SVG paths -->
.square
是我计算宽度的元素。
它内部的SVG是绝对定位的,即使不是这样,SVG中的路径也没有对SVG元素的宽度或高度进行限制,更不用说它的HTML父级了,所以我不明白为什么IE坚持在计算父母的宽度时扫描它们的宽度(然后,卡住并重新渲染)。
我能做些什么来阻止IE这样做吗? IE如何确定在这样的计算和更新中检查哪些元素?