在计算祖先的offsetWidth时如何阻止IE不必要地计算SVG元素宽度?

时间:2016-09-14 02:49:32

标签: javascript performance internet-explorer svg ie-developer-tools

我有一个需要检查小部件中%width元素的当前实际像素宽度的函数。在普通的浏览器上,它在IE上运行良好(所有版本包括IE11),它通常很好;但是当小部件被放置在具有相当正常的复杂程度的响应式页面上时,许多父级div也有%宽度,IE锁定并花费半秒或更多时间来简单地计算一个简单元素的宽度,然后开始重新在长时间内CPU使用率超过100%(其他浏览器只需几毫秒)就像疯了一样渲染。

我看过许多评论,IE中的宽度和高度计算因速度慢而臭名昭着,通常在处理许多基于%的宽度时; for example

  

浏览器本地offsetWidth ...在某些情况下(例如与大型表进行交互时),IE中的速度非常慢;

在开发人员工具用户界面响应能力面板中,我设法将其跟踪到SVG中看似随机的单个元素。当我一直展开那个绿色矩形时,它的95%以上只是包含200多个元素的SVG地图中的一个不起眼的元素:

enter image description here

根本不需要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如何确定在这样的计算和更新中检查哪些元素?

0 个答案:

没有答案