当前位置: 首页 > 面试题库 >

在JavaScript中将em转换为px(并获取默认字体大小)

万俟丁雷
2023-03-14
问题内容

在某些情况下,获得em测量的精确像素宽度可能很有用。例如,假设您有一个具有CSS属性(如border或padding)的元素(以ems为单位),并且您需要获取border或padding的确切像素宽度。有一个涉及此主题的现有问题:

[如何使用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;
}

有了默认字体大小后,您可以通过将ems乘以元素的默认字体大小并将结果四舍五入,将任意em宽度转换为px宽度。

Math.round(ems * getDefaultFontSize(element.parentNode))

问题:getDefaultFontSize理想情况下,该函数应该是一个简单的无副作用的函数,该函数返回默认字体大小。但这 确实
有一个不幸的副作用:它修改了DOM!它附加一个孩子,然后删除该孩子。为了获得有效的offsetWidth属性,必须追加孩子。如果不将子级附加div到DOM,则该offsetWidth属性将保持为0,因为从不渲染该元素。即使我们立即删除了子元素,此功能仍然会产生意外的副作用,例如引发正在监听父元素的事件(例如Internet
Explorer onpropertychange或W3C的DOMSubtreeModified事件)。

问题: 有什么方法可以编写真正的无副作用getDefaultFontSize()函数,而不会意外触发事件处理程序或引起其他意外副作用?


问题答案:

编辑:不,没有。

在不影响DOM的情况下获取给定元素的渲染字体大小:

parseFloat(getComputedStyle(parentElement).fontSize);

编辑:

在IE中,您必须使用parentElement.currentStyle["fontSize"],但不能保证将大小转换为px。这样就可以了。

此外,此代码段不会为您提供元素的默认字体大小,而是您的 实际
字体大小,如果它确实有一个与之关联的类和样式,则这很重要。换句话说,如果元素的字体大小为2em,您将获得2个ems中的像素数。除非内联指定字体大小,否则您将无法正确获得转换率。



 类似资料:
  • PX到EM转换器 说明 默认像素大小应为16px。 然后输入px值以转换EM值。 或者,根据要求将em值转换为PX值。

  • 问题内容: 我想转换成JavaScript,该怎么办? 我一直在寻找它,但没有发现任何东西。 所以, 1px→? 大众 谢谢。 问题答案: 1px =(100vw / [document.documentElement.clientWidth] px) 例如-如果您的视口很宽(按定义等于),则 1px =(100vw / 500px)= 0.2vw 我曾经以排除任何滚动条的计算

  • 我正在使用iTextSharp创建一个新的pdf文件。pdf将包含一个标题和一个pdf表格。生成的pdf文件的文件大小应该尽可能小,所以我使用默认字体(Helvetica,12pt)。有没有办法将默认字体大小从12pt更改为8pt。 我知道我可以为每个pdf表格单元格设置字体。 但是是否可以为整个文档/表格设置默认字体大小,这样我就不需要为每个表格单元格额外设置字体了? (我在谷歌上搜索了这个话题

  • 问题内容: 正如我在此问题中提到的,从服务器获取响应时出现问题。 我收到具有以下属性的对象数组: 有没有简单的方法可以将指定的类型()转换为文件? 我看到了争论,但我不知道该如何使用… 更新 这些ID之一是:但是JS将其转换为! 更新 如 Jonas H 在此答案中所述,JS运行默认解析 ,这就是为什么我失去真正的价值! 假设您以Json字符串的形式接收数据,并且其中包含数字,则无法使用JSON.

  • 问题内容: 在CSS中设置字体大小时,我应该使用百分比值()还是?您能解释一下优势吗? 问题答案: 他们的结论是: 显示的大小和以ems为单位的行高以及在正文中指定的百分比(以及Safari 2的可选警告)可在当今所有常用的浏览器中提供准确,可调整大小的文本。您可以将这种技术放入工具包中,并将其用作在CSS中调整文本大小的最佳方法,该方法可以使设计人员和读者满意。

  • 问题内容: 听说您应该在样式表中使用em而不是像素来定义尺寸和距离。所以问题是,为什么在CSS中定义样式时应该使用em而不是px?有一个很好的例子可以说明这一点吗? 问题答案: 我问这个问题的原因是,我忘记了如何使用em,因为我在CSS中愉快地编程时已经很久了。人们没有注意到我把这个问题笼罩了,因为我并不是在谈论字体本身的大小。我对如何在页面上的 任何给定块元素 上定义样式更感兴趣。 正如Henr