当scrollWidth没有帮助时,如何准确检测Javascript中的溢出?

我的目标是在div中显示可能的最大文本而不超过div边界(即没有溢出) . 有问题的文字可以是一个字母,也可以是一个长段 .

我遇到的问题是,小写“f”(非固定宽度字体)的一部分确实溢出,但scrollWidth表示没有发生溢出(即element.scrollWidth == element.offsetWidth) .

我知道这不会是固定宽度字体的问题,所以请避免建议它们 .

代码片段说明溢出(至少在视觉上),但scrollWidth没有超过div宽度 . 我在Windows 7(Chrome版本54,FireFox 50.0,IE 11),Kindle Fire(Silk),iPad(iOS 9.3.5 Safari)和Android 5.1.0中重现了相同的结果(最后“f”超出界限) Chrome 54.0) .

经过大量研究,我已经排除了连字设置,字母间距和附加零宽度非连接器(ZWNJ),因为在这种情况下,它们似乎都没有用于触发或避免溢出 . 我已经阅读了与[javascript] "offsetWidth" "scrollWidth" "overflow"相关的每篇StackExchange帖子 . 我甚至从http://opentype.js.org检查了字体结构,其中小写的“f”超过了“Draw Metrics”,这可能会给出解决方案的提示,但此时我无法理解 .

window.onload = main;

function GrowToFit(obj) {
  if (obj.offsetWidth == obj.scrollWidth) {
    //No overlap, grow font by 1 px
    obj.style.fontSize = ++x + "px";
    //Repeat
    GrowToFit(obj);
  } else {
    //back off 1 font size so no overlap
    obj.style.fontSize = --x + "px";
  }
}

function main() {
  var i;
  for (i = 1; i <= 3; i++) {
    x = 1;
    obj = document.getElementById("Box" + i);
    GrowToFit(obj);
    Results.innerHTML += "Box" + i + "
Font Size=" + obj.style.fontSize; Results.innerHTML += "
scrollWidth=" + obj.scrollWidth; Results.innerHTML += "
offsetWidth=" + obj.offsetWidth + "

"; } }
.box {
  width: 200px;
  white-space: nowrap;
  display: block;
  background-color: red;
  /* For contrast */
  font-size: 1px;
  /*Will upsize in GrowToFit*/
  overflow: visible;
}
<div id="Box1" class="box">fff</div>
<!-- last f will hang outside div -->

<div id="Box2" class="box">xxx</div> <!-- fits no problem -->
<div id="Box3" class="box">FFF</div> <!-- fits no problem -->
<div id="Results"></div>