在某些情况下,获得em
测量的准确像素宽度可能很有用。例如,假设您有一个元素具有以 em 为单位测量的 CSS 属性(如边框或填充),并且您需要获取边框或填充的确切像素宽度。有一个涉及此主题的现有问题:
如何使用 JavaScript 或 JQuery 获取以像素为单位的默认字体大小?
这个问题询问有关获取默认字体大小的问题- 这是将相对em
值转换为精确px
值所必需的。
这个答案很好地解释了如何获取元素的默认字体大小:
由于 ems 测量宽度,您始终可以通过创建一个 1000 ems 长的 div 并将其 client-Width 属性除以 1000 来计算确切的像素字体大小。我似乎记得 ems 被截断到最接近的千分之一,所以你需要 1000 ems避免错误截断像素结果。
因此,以这个答案为指导,我编写了以下函数来获取默认字体大小:
function getDefaultFontSize(parentElement)
{
parentElement = parentElement || document.body;
var div = document.createElement('div');
div.style.width = "1000em";
parentElement.appendChild(div);
var pixels = div.offsetWidth / 1000;
parentElement.removeChild(div);
return pixels;
}
获得默认字体大小后,只需将 em 乘以元素的默认字体大小并将结果四舍五入,即可将任何em
宽度转换为宽度:px
Math.round(ems * getDefaultFontSize(element.parentNode))
问题:理想情况下,getDefaultFontSize
它应该是一个简单、无副作用的函数,它返回默认字体大小。但它确实有一个不幸的副作用:它修改了 DOM!它附加一个孩子,然后删除孩子。为了获得有效的offsetWidth
属性,附加孩子是必要的。如果您不将子元素附加div
到 DOM,则该offsetWidth
属性将保持为 0,因为该元素永远不会被渲染。即使我们立即删除子元素,此函数仍会产生意想不到的副作用,例如触发正在侦听父元素的事件(如 Internet Exploreronpropertychange
或 W3C 的DOMSubtreeModified
事件)。
问题:有没有办法编写一个真正无副作用的getDefaultFontSize()
函数,不会意外触发事件处理程序或导致其他意外副作用?