在文本基线上水平对齐块
Horizontally aligning blocks on text baseline
我有以下 HTML 代码:
<header>
<h1>Title</h1>
<nav>
<ul>
<li>One</li>
<li>Two</li>
<li>Three</li>
</ul>
</nav>
</header>
我希望通过向右浮动 <nav>
.
将其变成我网页顶部的单行
但是,由于 <h1>
的字体大小比 <li>
元素的字体大得多,所以文本会错位。 我希望元素在基线上对齐。在图片中:
注意基线的红线。这就是我现在拥有的:
#float, #nofloat { width: 300px; }
ul, h1, nav, p { margin: 0; padding: 0; }
h1 {
display: inline-block;
font-size: 3rem;
}
nav { display: inline-block; }
ul { list-style-type: none; }
ul > li { display: inline; }
ul > li:after { content: " | "; }
ul > li:last-child:after { content: ""; }
#float nav { float: right; }
<p>Everything is aligned to baseline before floating:</p>
<div id="nofloat">
<header>
<h1>Title</h1>
<nav>
<ul>
<li>One</li>
<li>Two</li>
<li>Three</li>
</ul>
</nav>
</header>
</div>
<p>But after floating it's messed up:</p>
<div id="float">
<header>
<h1>Title</h1>
<nav>
<ul>
<li>One</li>
<li>Two</li>
<li>Three</li>
</ul>
</nav>
</header>
</div>
如果您有固定的 width
,您只需将 text-align:right
添加到您的 nav
#float,
#nofloat {
width: 300px;
}
ul,
h1,
nav,
p {
margin: 0;
padding: 0;
}
h1 {
display: inline-block;
font-size: 3rem;
width:auto;
}
nav {
display: inline-block;
width:200px
}
ul {
list-style-type: none;
}
ul > li {
display: inline;
}
ul > li:after {
content: " | ";
}
ul > li:last-child:after {
content: "";
}
#float nav {
text-align:right
}
<p>Everything is aligned to baseline before floating:</p>
<div id="nofloat">
<header>
<h1>Title</h1>
<nav>
<ul>
<li>One</li>
<li>Two</li>
<li>Three</li>
</ul>
</nav>
</header>
</div>
<p>But after floating it's messed up:</p>
<div id="float">
<header>
<h1>Title</h1>
<nav>
<ul>
<li>One</li>
<li>Two</li>
<li>Three</li>
</ul>
</nav>
</header>
</div>
此外,由于 inline-block
存在间隙问题(可修复),您可以使用 display:table/table-cell
#float,
#nofloat {
width: 300px;
display: table;
}
ul,
h1,
nav,
p {
margin: 0;
padding: 0;
}
h1 {
display: table-cell;
font-size: 3rem;
width:auto;
}
nav {
display: table-cell;
width:200px
}
ul {
list-style-type: none;
}
ul > li {
display: inline;
}
ul > li:after {
content: " | ";
}
ul > li:last-child:after {
content: "";
}
#float nav {
text-align:right
}
<p>Everything is aligned to baseline before floating:</p>
<div id="nofloat">
<header>
<h1>Title</h1>
<nav>
<ul>
<li>One</li>
<li>Two</li>
<li>Three</li>
</ul>
</nav>
</header>
</div>
<p>But after floating it's messed up:</p>
<div id="float">
<header>
<h1>Title</h1>
<nav>
<ul>
<li>One</li>
<li>Two</li>
<li>Three</li>
</ul>
</nav>
</header>
</div>
您的 HTML mark-up 适合使用 CSS 表的解决方案。
将 display: table
应用到 header
,并将宽度设置为 100%,这将强制它占用 parent 容器的宽度。
将display: table-cell
应用于nav
并设置width: 1%
以强制其具有shrink-to-fit宽度。要防止文本换行,请设置 white-space: nowrap
.
只要您的标题可以容纳在剩余部分中,这就可以正常工作 space,但您可以根据您的布局调整细节。
#float, #nofloat { width: 300px; }
ul, h1, nav, p { margin: 0; padding: 0; }
h1 {
display: inline-block;
font-size: 3rem;
}
nav { display: inline-block; }
ul { list-style-type: none; }
ul > li { display: inline; }
ul > li:after { content: " | "; }
ul > li:last-child:after { content: ""; }
header {
border: 1px dotted gray;
}
#float header {
display: table;
width: 100%; /* the parent div has a width */
}
#float nav {
display: table-cell;
width: 1%; /* forces this cell to shrink-to-fit */
white-space: nowrap;
border: 1px dotted blue;
}
<p>Everything is aligned to baseline before floating:</p>
<div id="nofloat">
<header>
<h1>Title</h1>
<nav>
<ul>
<li>One</li>
<li>Two</li>
<li>Three</li>
</ul>
</nav>
</header>
</div>
<p>But after floating it's messed up:</p>
<div id="float">
<header>
<h1>Title</h1>
<nav>
<ul>
<li>One</li>
<li>Two</li>
<li>Three</li>
</ul>
</nav>
</header>
</div>
我有以下 HTML 代码:
<header>
<h1>Title</h1>
<nav>
<ul>
<li>One</li>
<li>Two</li>
<li>Three</li>
</ul>
</nav>
</header>
我希望通过向右浮动 <nav>
.
但是,由于 <h1>
的字体大小比 <li>
元素的字体大得多,所以文本会错位。 我希望元素在基线上对齐。在图片中:
注意基线的红线。这就是我现在拥有的:
#float, #nofloat { width: 300px; }
ul, h1, nav, p { margin: 0; padding: 0; }
h1 {
display: inline-block;
font-size: 3rem;
}
nav { display: inline-block; }
ul { list-style-type: none; }
ul > li { display: inline; }
ul > li:after { content: " | "; }
ul > li:last-child:after { content: ""; }
#float nav { float: right; }
<p>Everything is aligned to baseline before floating:</p>
<div id="nofloat">
<header>
<h1>Title</h1>
<nav>
<ul>
<li>One</li>
<li>Two</li>
<li>Three</li>
</ul>
</nav>
</header>
</div>
<p>But after floating it's messed up:</p>
<div id="float">
<header>
<h1>Title</h1>
<nav>
<ul>
<li>One</li>
<li>Two</li>
<li>Three</li>
</ul>
</nav>
</header>
</div>
如果您有固定的 width
text-align:right
添加到您的 nav
#float,
#nofloat {
width: 300px;
}
ul,
h1,
nav,
p {
margin: 0;
padding: 0;
}
h1 {
display: inline-block;
font-size: 3rem;
width:auto;
}
nav {
display: inline-block;
width:200px
}
ul {
list-style-type: none;
}
ul > li {
display: inline;
}
ul > li:after {
content: " | ";
}
ul > li:last-child:after {
content: "";
}
#float nav {
text-align:right
}
<p>Everything is aligned to baseline before floating:</p>
<div id="nofloat">
<header>
<h1>Title</h1>
<nav>
<ul>
<li>One</li>
<li>Two</li>
<li>Three</li>
</ul>
</nav>
</header>
</div>
<p>But after floating it's messed up:</p>
<div id="float">
<header>
<h1>Title</h1>
<nav>
<ul>
<li>One</li>
<li>Two</li>
<li>Three</li>
</ul>
</nav>
</header>
</div>
此外,由于 inline-block
存在间隙问题(可修复),您可以使用 display:table/table-cell
#float,
#nofloat {
width: 300px;
display: table;
}
ul,
h1,
nav,
p {
margin: 0;
padding: 0;
}
h1 {
display: table-cell;
font-size: 3rem;
width:auto;
}
nav {
display: table-cell;
width:200px
}
ul {
list-style-type: none;
}
ul > li {
display: inline;
}
ul > li:after {
content: " | ";
}
ul > li:last-child:after {
content: "";
}
#float nav {
text-align:right
}
<p>Everything is aligned to baseline before floating:</p>
<div id="nofloat">
<header>
<h1>Title</h1>
<nav>
<ul>
<li>One</li>
<li>Two</li>
<li>Three</li>
</ul>
</nav>
</header>
</div>
<p>But after floating it's messed up:</p>
<div id="float">
<header>
<h1>Title</h1>
<nav>
<ul>
<li>One</li>
<li>Two</li>
<li>Three</li>
</ul>
</nav>
</header>
</div>
您的 HTML mark-up 适合使用 CSS 表的解决方案。
将 display: table
应用到 header
,并将宽度设置为 100%,这将强制它占用 parent 容器的宽度。
将display: table-cell
应用于nav
并设置width: 1%
以强制其具有shrink-to-fit宽度。要防止文本换行,请设置 white-space: nowrap
.
只要您的标题可以容纳在剩余部分中,这就可以正常工作 space,但您可以根据您的布局调整细节。
#float, #nofloat { width: 300px; }
ul, h1, nav, p { margin: 0; padding: 0; }
h1 {
display: inline-block;
font-size: 3rem;
}
nav { display: inline-block; }
ul { list-style-type: none; }
ul > li { display: inline; }
ul > li:after { content: " | "; }
ul > li:last-child:after { content: ""; }
header {
border: 1px dotted gray;
}
#float header {
display: table;
width: 100%; /* the parent div has a width */
}
#float nav {
display: table-cell;
width: 1%; /* forces this cell to shrink-to-fit */
white-space: nowrap;
border: 1px dotted blue;
}
<p>Everything is aligned to baseline before floating:</p>
<div id="nofloat">
<header>
<h1>Title</h1>
<nav>
<ul>
<li>One</li>
<li>Two</li>
<li>Three</li>
</ul>
</nav>
</header>
</div>
<p>But after floating it's messed up:</p>
<div id="float">
<header>
<h1>Title</h1>
<nav>
<ul>
<li>One</li>
<li>Two</li>
<li>Three</li>
</ul>
</nav>
</header>
</div>