火狐浏览器 foreignObject overflow 属性失效

481 阅读1分钟

去年在工作中偶然发现的火狐浏览器上的一个小 Bug,在这里分享给大家,减少踩坑。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <style>
    .list {
      background-color: blanchedalmond;
    }
    .list-item {
      width: 50px;
      height: 25px;
      background-color: coral;
    }
    foreignObject {
      overflow: visible;
    }
  </style>
</head>
<body>
  <svg>
    <foreignObject width="300" height="25">
      <div class="list">
        <div class="list-item">a</div>
        <div class="list-item">b</div>
      </div>
    </foreignObject>
  </svg>
  <script>
    setTimeout(() => {
      let list = document.querySelector('.list');
      let c = document.createElement('div')
      c.innerHTML = 'a';
      c.classList.add('list-item')
      list.appendChild(c);
    }, 0);
  </script>
</body>
</html>

谷歌浏览器(版本 89.0.4389.90(正式版本) (64 位))

企业微信截图_1618308828731.png

火狐浏览器(87.0 (64-bit))

企业微信截图_16183088148660.png

foreignObject 设置了 overflow: visible 属性之后,它应该完整显示出 a, b, c,但是可以看到在火狐浏览器上,只显示了 a, b。项目里的场景刚好就和例子中的场景类似,在火狐浏览器上运行的时候,就会有交互上的问题。

如果去掉 setTimeout,或者一开始 overflow 设为 hidden,再在 setTimeout 里用 js 设为 visible,两个浏览器的显示效果就是完全一样的。

给火狐提的 Bug 链接 bugzilla.mozilla.org/show_bug.cg…