【问题标题】:Is is possible to overwrite the browser's default font-size in media queries using EMs?是否可以使用 EM 在媒体查询中覆盖浏览器的默认字体大小?
【发布时间】:2017-02-17 11:45:49
【问题描述】:

很多人认为 1em = 16px。这不正确,1em = value of your browser font-size which is most of the time 16px。虽然更改浏览器默认字体大小并不常见,但更改设置仍然很容易。

鉴于这种情况,从HTML 元素的角度来看,覆盖 em 值仍然很容易,因为它使用顶部元素的字体大小。例如:

html {
     font-size: 20px; 
}

这种简单的样式会级联到文档的其余部分,而 1em 将有效地变为 20px。

问题是,当使用带有media queries 的CSS 时,em 的值似乎停留在浏览器样式级别,而不是顶级元素。例如:

@media screen and (min-width: 2em) {
    ...some style...
}

如果我们考虑前面的带有 20px HTML 覆盖的示例,可以预期该上下文中的 2em 指的是顶级元素,其值为 40 像素。但它不是,它将是2 * browser default font-size(例如 16px,所以 36px)。更糟糕的是,如果您将浏览器字体大小自定义为 24px,则 2em 将有效地具有 48px 的值。

有没有办法解决这个问题?主要问题是如果我们不能覆盖浏览器默认字体大小,就很难预测媒体查询的风格。这个值变得不可预测,这意味着你的风格也将是。

我可以想到一种使用 JavaScript 获取浏览器默认字体大小的复杂方法,但我不禁想知道为什么媒体查询不使用顶部元素的字体大小而不是浏览器的默认字体大小。我也希望有一种更好的方法来处理这个不需要复杂的 JavaScript。

总结一下,我正在寻找:

  1. 一种在使用媒体查询时覆盖默认浏览器字体大小值的方法。
  2. 获取默认浏览器字体大小的简单方法。

【问题讨论】:

  • 请原谅这个问题,但是,您为什么要在 ems 中测量媒体查询?如果您在 html 元素处设置以像素为单位的字体大小,您知道在这种情况下您希望 2em 评估什么,不是吗?
  • @anied 好问题,但 EM 提供的功能将成为以像素为单位实现的噩梦。它们更具动态性,对于响应式设计特别有用。有很多很好的文章可以提供这方面的详细信息。
  • 我绝对同意基于 em 的 CSS 方法是首选。但是,每当我创建或看到基于 em 的 CSS 示例时,它的实现方式就是将 HTML 元素的字体大小设置为 px,将所有其他 CSS 写入 em,然后将媒体查询视口宽度目标写入像素.这种尝试在 ems 中评估视口/屏幕大小的特殊方法对我来说似乎很不寻常——这并不意味着它不正确,我只是想知道你是否确定这是正确的方法......
  • em 中的最小宽度查询没有多大意义,因为除非您通过 @font-face 设置字体,否则您对 width 使用的字体。 CSS font-size 属性设置连续基线之间的垂直距离,所以没有提到高度。事实上,它甚至不是真正的“字体中字母的高度”,因此您的媒体查询确实应该基于像素、毫米等绝对单位,而不是 em、ex 或百分比等相对值。顶级规则(html、body)应该是绝对的。
  • @anied 我知道在 EM 中进行媒体查询不太常见,但想象一下,如果您想在移动屏幕宽度中使用较小的字体大小,您会期望一些媒体查询规则保持不变例如相同。这就是媒体查询中的 EM 可以通过在不同布局中保持断点等效来避免意大利面条式 CSS 的地方。

标签: javascript html css fonts media-queries


【解决方案1】:

您可以使用 rem 单位而不是 em 单位。 Em 使用它的父元素。我的意思是如果您设置基本字体大小:20px,并且您有两个 ul 一内一,并且您将父 ul 字体大小设置为 2em,子 ul 字体大小设置为 2em,而不是父 ul 字体大小为 40px,但子 ul字体大小为 80 像素。因为 em 跟随他的父元素。见下面的代码

html {
  font-size: 20px;
}

ul {
  font-size: 2em;
}

ul ul {
  
  font-size: 2em;

}
<ul>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aperiam obcaecati amet, labore dignissimos itaque vero odio ipsa repellat, eum natus qui ipsum quidem. Quisquam voluptates, fugiat doloribus ad aperiam corrupti!
      <ul>Lorem ipsum dolor sit amet, consectetur adipisicing   elit. Enim deleniti labore minus laborum nobis impedit excepturi nostrum temporibus ipsam rerum, cupiditate ex veniam, delectus odio earum a id dolor expedita?
      </ul>
</ul>

但是如果您使用 rem 单位,您就不会遇到这种问题。见下面的代码

html {
	font-size: 20px;
}


ul {
	font-size: 2rem;
}

ul ul {
	font-size: 2rem;
}
<ul>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aperiam obcaecati amet, labore dignissimos itaque vero odio ipsa repellat, eum natus qui ipsum quidem. Quisquam voluptates, fugiat doloribus ad aperiam corrupti!
    <ul>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Enim deleniti labore minus laborum nobis impedit excepturi nostrum temporibus ipsam rerum, cupiditate ex veniam, delectus odio earum a id dolor expedita?
    </ul>
</ul>

希望对你有所帮助。并且媒体查询也可以正常工作。

【讨论】:

  • 感谢您的建议,但鉴于使用 REM 的一些跨浏览器问题,我更好奇是否有办法解决 EM/媒体查询情况。本文正在讨论的一些问题:zellwk.com/blog/media-query-units
【解决方案2】:

我可以想到一种使用 JavaScript 获取浏览器默认字体大小的复杂方法,但我不禁想知道为什么媒体查询不使用顶部元素的字体大小而不是浏览器的默认字体大小。

顾名思义,媒体查询旨在查询有关用户代理所代表的媒体的信息。因此浏览器,而不是根元素。如果您希望查询基于您正在查找的元素查询的根元素,那么今天在生产中以任何形式都不可用。

总结一下,我正在寻找:

  1. 一种在使用媒体查询时覆盖默认浏览器字体大小值的方法。

这需要更改 font-size: medium 对应的值(参见 What is an "em" if the font-size of the document is specified in ems?),这是不可能的。

  1. 获取默认浏览器字体大小的简单方法。

字体大小compute to their corresponding absolute lengths 的关键字值。理论上,您可以使用 JavaScript 来获取指定值为font-size: medium 的任何元素的计算字体大小(在此特定情况下与 CSS 对“计算值”的定义一致),然后将该值放入媒体查询中,但这需要使用 JavaScript window.matchMedia() 而不是 CSS @media 来实现所有媒体查询。这一点都不简单。

【讨论】:

  • 感谢您证实了我的恐惧 :) 期待有一天能看到元素查询成为 CSS 标准的一部分。
猜你喜欢
  • 2013-08-26
  • 2011-06-01
  • 1970-01-01
  • 2016-04-15
  • 2012-12-25
  • 1970-01-01
  • 2016-08-22
  • 1970-01-01
  • 2012-03-18
相关资源
最近更新 更多