【问题标题】:Horizontally aligning blocks on text baseline在文本基线上水平对齐块
【发布时间】:2015-06-16 19:18:19
【问题描述】:

我有以下 HTML 代码:

<header>
    <h1>Title</h1>

    <nav>
        <ul>
            <li>One</li>
            <li>Two</li>
            <li>Three</li>
        </ul>
    </nav>
</header>

我希望通过向右浮动&lt;nav&gt; 将其变成我网页顶部的一行。

但是,由于&lt;h1&gt; 的字体大小比&lt;li&gt; 元素大得多,因此文本会错位。 我希望元素在基线上对齐。在图片中:

注意基线的红线。这就是我现在拥有的:

#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>

【问题讨论】:

  • 反对者,请解释一下为什么我的问题'没有显示出任何研究工作;不清楚或没用'
  • 很难说为什么投反对票;您的问题提出得很好,简洁并显示了sn-p /努力。也许SO存档中有类似的问题,但尝试搜索它...
  • @MarcAudet 我确实搜索了重复项,有类似的问题,但没有人试图在基线上对齐块内的文本。无论如何,如果它是重复的,那不是拒绝投票的正当理由 - 关闭按钮就是为此(或者如果您没有足够的声誉,则标记按钮)。
  • 有时,在 SO 上找到一个预先存在的解决方案就像大海捞针;类似的问题可以用如此不同的方式来表达,以至于无论您的搜索词多么有创意,它们都不会出现在搜索中。

标签: html css layout typography


【解决方案1】:

如果您有固定的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>

【讨论】:

  • nav 没有固定宽度。但是使用你的答案我做了这个,这似乎工作正常:jsfiddle.net/dnzdvwjo
  • 是的,这是另一种解决方案,如果您不想在您的nav 上使用固定的width,则将display:table 应用于nav 父级而不是nav 祖父级。
【解决方案2】:

您的 HTML 标记适用于使用 CSS 表格的解决方案。

display: table 应用到header,并将宽度设置为 100%,这将强制它采用父容器的宽度。

display: table-cell 应用于nav 并设置width: 1% 以强制其具有收缩以适应宽度。要防止文本换行,请设置white-space: nowrap

只要您的标题可以容纳剩余空间,这将可以正常工作,但您可以根据您的布局调整细节。

#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>

【讨论】:

  • 这与我在回应 dippas 的回答时找到的解决方案相比如何?与我的解决方案相比,jsfiddle.net/dnzdvwjo 1% 的宽度和white-space 似乎很老套。
  • 基本上一样,dippas 发布了他的解决方案,而我正在研究我的答案,所以我们都想出了相同的技术。唯一的区别是我处理表格单元格宽度有点不同。
猜你喜欢
  • 1970-01-01
  • 2015-10-09
  • 1970-01-01
  • 1970-01-01
  • 2016-03-24
  • 1970-01-01
  • 2013-08-14
  • 2017-06-21
  • 1970-01-01
相关资源
最近更新 更多