【发布时间】:2012-05-14 20:45:50
【问题描述】:
在某些情况下,获取em 测量值的确切像素宽度可能很有用。例如,假设您有一个具有以 em 为单位测量的 CSS 属性(如边框或填充)的元素,并且您需要获取边框或填充的确切像素宽度。有一个涉及此主题的现有问题:
How can i get default font size in pixels by using JavaScript or JQuery?
这个问题是关于获取 默认字体大小 - 这是将相对的 em 值转换为精确的 px 值所必需的。
This answer 很好地解释了如何获取元素的默认字体大小:
由于 ems 测量宽度,您始终可以计算出精确的像素字体 通过创建一个 1000 ems 长的 div 并将它的 client-Width 属性乘以 1000。我似乎记得 em 被截断为 最接近的千分之一,所以你需要 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 宽度转换为 px 宽度,只需将 em 乘以元素的默认字体大小并将结果四舍五入:
Math.round(ems * getDefaultFontSize(element.parentNode))
问题:getDefaultFontSize 理想情况下应该是一个简单、无副作用的函数,它返回默认字体大小。但它确实有一个不幸的副作用:它修改了 DOM!它附加一个孩子,然后删除孩子。为了获得有效的offsetWidth 属性,必须附加孩子。如果您不将子 div 附加到 DOM,则 offsetWidth 属性将保持为 0,因为该元素永远不会被渲染。即使我们立即删除子元素,此函数仍然会产生意想不到的副作用,例如触发正在侦听父元素的事件(如 Internet Explorer 的 onpropertychange 或 W3C 的 DOMSubtreeModified 事件)。
问题:有没有办法编写一个真正无副作用的getDefaultFontSize() 函数,不会意外触发事件处理程序或导致其他意外副作用?
【问题讨论】:
-
并非如此,这就是 DOM 的工作方式。但是,您可以将创建的元素的类设置为诸如
font-size-check之类的东西,然后在触发的任何事件中,检查元素是否具有该类以确定是否忽略它。 -
遍历 DOM 直到找到一个宽度在 ems 中指定的节点,然后用它来进行不太准确的测量?唯一的副作用是处理时间。也不保证能正常工作。
标签: javascript css events dom