我正在寻找一种可靠的方式,使用JavaScript以em为单位获取窗口宽度。 我很惊讶地发现,jQuery只会返回像素测量结果。
我正在寻找一种可靠的方式,使用JavaScript以em为单位获取窗口宽度。 我很惊讶地发现,jQuery只会返回像素测量结果。
这似乎可以工作:
$(window).width() / parseFloat($("body").css("font-size"));
这里有一个解决方案,不需要 jQuery,也不需要显式字体大小声明。
window.innerWidth / parseFloat(
getComputedStyle(
document.querySelector('body')
)['font-size']
)
对于那些需要所有内容放在一起的人,这段代码适用于我:
<p>Window size: <span id="width_px"></span> pixels or <span id="width_ems"></span> ems</p>
<script>
window.onresize = function() {
document.getElementById("width_px").innerHTML = window.innerWidth;
document.getElementById("width_ems").innerHTML = window.innerWidth / parseFloat($("body").css("font-size"));
};
</script>
虽然可以计算,但是em
不像px
那样是一个“简单”的单位,因为它取决于字体选择(即字体系列、样式(粗体、斜体等)和字体大小的组合)。当然,字体大小本身可以是相对的(例如,如果您给一个字体设置em
、ex
或百分比大小,则该字体的计算px
高度是从父元素的大小派生出来的)。
要获取页面的em
宽度,您可以像这样进行转换(警告:伪代码):
// For this to work reliably, size should be in px, pt, or mm.
function getWindowWidthInEm(fontFamily, style, size) {
var box = document.createElement("span");
box.innerText = "M";
box.style.fontFamily = fontFamily;
box.style.fontSize = size;
box.style.fontWeight = style is bold;
box.style.fontStyle = style is italic;
var body = document.getElementsByTagName("body")[0];
body.appendChild( box );
var emInPx = box.getComputedStyle().width;
body.removeChild( box );
var windowPx = window.width;
return windowx / emInPx;
}
很简单,因为我们知道1em = 16px
var window_width_em = 1/16 * window_width_px;
html {font-size: 10px;}
或 html {font-size: 1.5em;}
会导致1em 不等于 16像素。进一步地,开发人员无法控制标准的“16像素字体大小”,因为它是由用户代理设置的,并且可以被用户随意更改。 - le3th4x0rbot