【问题标题】:Em unit in CSS doesn't change font-size value as expected, why?CSS 中的 Em 单位没有按预期更改字体大小值,为什么?
【发布时间】:2016-11-24 01:25:12
【问题描述】:

当屏幕尺寸小于等于 1365 像素时,我设置了body {font-size: 85.333333331%;},以便页眉、主、页脚元素的字体大小为 16 像素。当您打开浏览器的开发人员工具时,您会看到嵌套在 header 内的 headerdiv.container 确实有 16px 字体大小......到目前为止一切都很好。 h1#logo 嵌套在 div.container 中具有 font-size: 0.48em 声明。但是,当我在谷歌浏览器中检查计算选项卡时,我看到实际的字体大小是 9 像素,但是 16 像素 * 0.48 = 7.68 像素,那么为什么我会得到不同的值呢?这个错误破坏了我的整个标题,导致元素没有正确垂直对齐。感谢您的帮助。

/* general */
body {
	margin: 0;
	font: 100% "Open Sans", sans-serif;
	color: #7f7e7d;
}

header, main, footer {
	font-size: 1.171875em; /* 18.75px / 16px */	
}

h1, h2, h3, h4, p, blockquote, figure, ol, ul {
    margin: 0;
    padding: 0;
}

main {
	display: block;
}

h2 {
	font-size: 3.3333333333em; /* 62.5px / 18.75px */
	font-weight: 400;
}

h3 {
	font-size: 1.5557333333em; /* 29.17px / 18.75px */
	margin: 1.1733333333em 0; /* 22px / 18.75px */
	font-weight: 400;
}

p {
	font-weight: 300;
}

a {
	color: inherit;
	text-decoration: none;
}

img {
    max-width: 100%;
    height: auto;
    border: 0;
}

.container {
	max-width: 960px;
	margin: 0 auto;
}

.menu {
	list-style: none;
}

.menu > li {
	float: left;
}

.hide {
	display: none;
}

.cf:before, .cf:after {
	content: "";
	display: table;
}
.cf:after {
	clear: both;
}

/* header */
header {
	background: #000;
	color: #ccc;
	font-weight: 300;
}

header .container {
	position: relative; /* kvoli jazykovemu menu, ktore bude absolute */
	z-index: 1;
}

/* logo */
#logo {
	float: left;
	font-size: 0.48em; /* 9px / 18.75px */
	font-weight: inherit;
}

#logo a {
	display: block;
	text-transform: uppercase;
}

.logoPic {
	display: inline-block;
	text-indent: -9999px;
	background: url(../img/logo/logo.png) no-repeat left center;
	width: 148px; /* logo width */
	line-height: 7.6666666666666666666666666666667em; /* 69px / 9px */
	padding-right: 18px; /* priestor pre lomitko */
	position: relative;
}

.logoPic::after {
	content: "/";
	position: absolute;
	text-indent: 0;
	right: 3px;
	font-size: 40px; /* logo zostane stale rovnako velke, preto fixna velkost pre lomitko */
	color: #ffcc00;
}

/* navigation */
nav {
	float: right;
}

nav a {
	display: block;
}

#nav > li > a {
	line-height: 3.68em; /* 69px / 18.75px */
}

#nav > li {
	position: relative;
	margin-right: 1.2266666666666666666666666666667em; /* 23px / 18.75px */
}

#nav > li:last-child {
	margin-right: 0;
}

#nav > li:hover:not(.sub) > a {
	color: #bf9900;
}

#nav > li.sub:hover > a::before {
	content: "";
	position: absolute;
	width: 60%;
	margin-left: 20%;
	margin-right: 20%;
	height: 0.26666666666666666666666666666667em; /* 5px / 18.75px */
	background: #ffcc00;
}

#nav > li.sub:hover .submenu {
	visibility: visible;
}

/* navigation submenu */
.submenu {
	position: absolute;
	top: 3.7866666666666666666666666666667em; /* 71px / 18.75px */
	left: -1.0666666666666666666666666666667em; /* 20px / 18.75px */
	background: #000;
	list-style-type: none;
	visibility: hidden;
	transition: visibility .15s;
}

.submenu a {
	padding: 0.55626666666666666666666666666667em 0.67866666666666666666666666666667em; /* 10.43px / 18.75px | 12.725px / 18.75px */
}

.submenu li:hover {
	color: #bf9900;
}

/* languages */
#languages {
	position: absolute;
	right: -9.2266666667em; /* 173px / 18.75px */
}

#languages a {
	display: inline-block;
	line-height: 3.68em; /* 69px / 18.75px */
}

#languages li::after {
	content: "/";
	padding: 0 0.16em; /* 3px / 18.75px */
}

#languages li:last-child::after {
	content: "";
	padding-right: 0;
}

#languages li:hover a {
	color: #bf9900;
}

/* media queries */
@media (max-width: 1365px) {
	body {
		font-size: 85.333333331%;
	}
}
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
	<header>
		<div class="container cf">
			<h1 id="logo">
				<a href="#">
					<span class="logoPic">Marek Petrik</span>Professional Photographer
				</a>
			</h1>

			<nav>
				<ul id="nav" class="menu cf">
					<li><a href="#aboutMe">O mne</a></li>
					<li><a href="#">Služby</a></li>
					<li class="sub"><a href="#">Portfólio</a>
						<ul class="submenu ">
							<li><a href="#">Svadba</a></li>
							<li><a href="#">Modeling</a></li>
							<li><a href="#">Príležitostné</a></li>
							<li><a href="#">Architektúra</a></li>
							<li><a href="#">Príroda</a></li>
							<li><a href="#">Deti</a></li>
						</ul>
					</li>
					<li><a href="#">Referencie</a></li>
					<li><a href="#">Cenník</a></li>
					<li><a href="#">Kontakt</a></li>
				</ul>
			</nav>

			<ul id="languages" class="menu">
				<li><a href="#">SK</a></li>
				<li><a href="#">EN</a></li>
				<li><a href="#">DE</a></li>
			</ul>
		</div>
	</header>
</body>
</html>

【问题讨论】:

  • 请提供一个最小的例子。
  • &lt;nav&gt;ul#languages 元素也很重要。它们缩小到 58px 高度,但 h1#logo 保持 69px 高,就好像没有带有 body {font-size: 85.333333331%;} 声明的媒体查询一样。您需要它们作为比较。
  • 实际上,您只是假设默认字体大小为16px,但这根本不能保证。尝试在html 中设置根单位,以确保字体大小实际定义为 16 像素。另外,请记住,人们可以放大您页面上的文字,而您在此处依赖的是非常具体的尺寸。这些细节甚至可以在文本呈现稍有变化时发生变化。
  • 没错,但如果字体大小从 16px 更改为不同的值 em 单位,请考虑到这一点。我将字体大小设置为 100%,因此我不会剥夺用户的权限。我希望他们能够在浏览器中设置他们想要的任何字体大小,因此一切都会相应地缩放。我想知道的是为什么&lt;nav&gt;ul#languages 元素会缩小到58px 的高度,而h1#logo 却没有。

标签: css


【解决方案1】:

em 值将与其直接容器相关,也称为父容器。我想你可能想要使用总是与&lt;html&gt; 的字体大小或所谓的文档根目录相关的 rem。

在此代码段中,em 是 rem。有两个按钮 +/- 将修改文档根目录的字体大小。

片段

$('#in1, #in2').on('click', function(e) {
  var cur = $('#hook').css('font-size');
  var res;
  var mod = $(this).data('v');
  
  res = parseFloat(cur) + parseFloat(mod);
  $('#out1').val(res);

  $('#hook').css('font-size', res);
});
/* general */

html {
  font-size: 16px;
}
body {
  margin: 0;
  font: 100%"Open Sans", sans-serif;
  color: #7f7e7d;
}
header,
main,
footer {
  font-size: 1.171875rem;
  /* 18.75px / 16px */
}
h1,
h2,
h3,
h4,
p,
blockquote,
figure,
ol,
ul {
  margin: 0;
  padding: 0;
}
main {
  display: block;
}
h1 {
  font-size: 4rem;
}
h2 {
  font-size: 3.3333333333rem;
  /* 62.5px / 18.75px */
  font-weight: 400;
}
h3 {
  font-size: 1.5557333333rem;
  /* 29.17px / 18.75px */
  margin: 1.1733333333rem 0;
  /* 22px / 18.75px */
  font-weight: 400;
}
p {
  font-weight: 300;
}
a {
  color: inherit;
  text-decoration: none;
}
img {
  max-width: 100%;
  height: auto;
  border: 0;
}
.container {
  max-width: 960px;
  margin: 0 auto;
}
.menu {
  list-style: none;
}
.menu > li {
  float: left;
}
.hide {
  display: none;
}
.cf:before,
.cf:after {
  content: "";
  display: table;
}
.cf:after {
  clear: both;
}
/* header */

header {
  background: #000;
  color: #ccc;
  font-weight: 300;
}
header .container {
  position: relative;
  /* kvoli jazykovemu menu, ktore bude absolute */
  z-index: 1;
}
/* logo */

#logo {
  float: left;
  font-size: 0.48rem;
  /* 9px / 18.75px */
  font-weight: inherit;
}
#logo a {
  display: block;
  text-transform: uppercase;
}
.logoPic {
  display: inline-block;
  text-indent: -9999px;
  background: url(https://upload.wikimedia.org/wikipedia/en/2/24/Lenna.png) left center no-repeat contain;
  width: 148px;
  /* logo width */
  line-height: 7.6666666666666666666666666666667rem;
  /* 69px / 9px */
  padding-right: 18px;
  /* priestor pre lomitko */
  position: relative;
}
.logoPic::after {
  content: "/";
  position: absolute;
  text-indent: 0;
  right: 3px;
  font-size: 40px;
  /* logo zostane stale rovnako velke, preto fixna velkost pre lomitko */
  color: #ffcc00;
}
/* navigation */

nav {
  float: right;
}
nav a {
  display: block;
}
#nav > li > a {
  line-height: 3.68rem;
  /* 69px / 18.75px */
}
#nav > li {
  position: relative;
  margin-right: 1.2266666666666666666666666666667rem;
  /* 23px / 18.75px */
}
#nav > li:last-child {
  margin-right: 0;
}
#nav > li:hover:not(.sub) > a {
  color: #bf9900;
}
#nav > li.sub:hover > a::before {
  content: "";
  position: absolute;
  width: 60%;
  margin-left: 20%;
  margin-right: 20%;
  height: 0.26666666666666666666666666666667rem;
  /* 5px / 18.75px */
  background: #ffcc00;
}
#nav > li.sub:hover .submenu {
  visibility: visible;
}
/* navigation submenu */

.submenu {
  position: absolute;
  top: 3.7866666666666666666666666666667rem;
  /* 71px / 18.75px */
  left: -1.0666666666666666666666666666667rem;
  /* 20px / 18.75px */
  background: #000;
  list-style-type: none;
  visibility: hidden;
  transition: visibility .15s;
}
.submenu a {
  padding: 0.55626666666666666666666666666667rem 0.67866666666666666666666666666667rem;
  /* 10.43px / 18.75px | 12.725px / 18.75px */
}
.submenu li:hover {
  color: #bf9900;
}
/* languages */

#languages {
  position: absolute;
  right: -9.2266666667rem;
  /* 173px / 18.75px */
}
#languages a {
  display: inline-block;
  line-height: 3.68rem;
  /* 69px / 18.75px */
}
#languages li::after {
  content: "/";
  padding: 0 0.16rem;
  /* 3px / 18.75px */
}
#languages li:last-child::after {
  content: "";
  padding-right: 0;
}
#languages li:hover a {
  color: #bf9900;
}
/* media queries */

@media (max-width: 1365px) {
  body {
    font-size: 85.333333331%;
  }
}
#fixed {
  position: fixed;
  top: 10px;
  max-width: 35ex;
  margin-bottom: 20px;
  z-index: 80;
}
#in1,
#in2,
#out1 {
  position: fixed;
  top: 10px;
  max-width: 3.5ex;
}
#in2 {
  left: 10.5ex;
}
#out1 {
  left: 3ex;
  z-index:11111;
  font-size:18px;
  color: black;
  text-align: center;
}
#out1::after { content:'px' }
<!DOCTYPE html>
<html id='hook'>

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>

<body>
  <header id='fixed'>
    <button id='in1' data-v='1'>+</button>
    <output id='out1'></output>
    <button id='in2' data-v='-1'>-</button>
  </header>
  <br/>
  <br/>
  <br/>
  <header>
    <div class="container cf">
      <h1 id="logo">
				<a href="#">
					<span class="logoPic">Marek Petrik</span>Professional Photographer
				</a>
			</h1>

      <nav>
        <ul id="nav" class="menu cf">
          <li><a href="#aboutMe">O mne</a>
          </li>
          <li><a href="#">Služby</a>
          </li>
          <li class="sub"><a href="#">Portfólio</a>
            <ul class="submenu ">
              <li><a href="#">Svadba</a>
              </li>
              <li><a href="#">Modeling</a>
              </li>
              <li><a href="#">Príležitostné</a>
              </li>
              <li><a href="#">Architektúra</a>
              </li>
              <li><a href="#">Príroda</a>
              </li>
              <li><a href="#">Deti</a>
              </li>
            </ul>
          </li>
          <li><a href="#">Referencie</a>
          </li>
          <li><a href="#">Cenník</a>
          </li>
          <li><a href="#">Kontakt</a>
          </li>
        </ul>
      </nav>

      <ul id="languages" class="menu">
        <li><a href="#">SK</a>
        </li>
        <li><a href="#">EN</a>
        </li>
        <li><a href="#">DE</a>
        </li>
      </ul>
    </div>
  </header>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
</body>

</html>

【讨论】:

  • 是的,我知道,但是如果视口的宽度为 1365px 或更小,headerdiv.container 元素的字体大小为 16px。 h1#logo 元素的字体大小为 0.48em,其父元素为 div.container 元素。那么,为什么这个h1#element 没有 0.48*16px=7.68px 字体大小,而是有 9px 字体大小。为什么会这样?
  • #logo 的父级(即.container.cf)..也将#logo 设置为font-size:inherit 并且它还将基于它的ems 引用@987654334 @,witch 是 1.171875em。当您使用 ems 时,这就是问题所在。您不能基于一种测量进行计算,这就是 rem 所做的。如果你费心看我的片段,你会发现它是 7.68 像素。
  • 我做到了,而且效果很好,谢谢。但是,您能解释一下为什么 em 单位在这种情况下不起作用吗?我不明白为什么当 #logo 的字体大小设置为 0.48em 并且其父字体大小为 16 像素(视口宽度为 1365 像素及以下)时它会变为 9 像素。
  • 有效,太好了! #logoparent's 字体大小是 1.171875em,这是基于 #logo 奶奶的字体大小和如果奶奶的字体大小font-size 恰好在 ems 中,然后它会一直持续下去,直到任何一个祖先在 ems 中设置了测量值not或者直到文档根目录(&lt;html&gt; 和 web API 中的documentElement。)所以你看到使用 ems 是如何变成一团混乱的、无法管理的不准确引用了吗?你的逻辑和有序的测量方式只能在 rem 而不是混乱的 em 中实现。 ;-)
【解决方案2】:

使用 vw(viewport width) 根据窗口大小调整字体大小。

  h1 {
      font-size: 5.9vw;
    }
    h2 {
      font-size: 3.0vh;
    }
    p {
      font-size: 2vmin;
    }

https://jsfiddle.net/dolphine/uj50trfn/

【讨论】:

  • True 但这忽略了em 单位对于允许相对于一个字体单位进行文本大小调整很有用的事实。建议使用rem 和设置html { font-size: 16px; } 可能更有用。您还需要一些查询选择器才能在非常小的尺寸上获得 .001px 的字体大小。
  • 感谢您的想法,但这不是上述示例不起作用的答案。
猜你喜欢
  • 2014-07-18
  • 2015-04-07
  • 2011-05-27
  • 1970-01-01
  • 2017-06-12
  • 1970-01-01
  • 2010-11-13
  • 2017-11-24
  • 2010-09-13
相关资源
最近更新 更多