【发布时间】:2021-06-03 17:32:50
【问题描述】:
我有一个单行/行导航/菜单,其中一些项目的字体较大,但我希望所有项目的文本沿基线和谐对齐。
我还需要项目对悬停在菜单的整个高度做出反应,这样用户就不必瞄准较小的文本(这是子菜单,但不属于这个问题的一部分)。
我尝试使用 Flexbox,但无法混合使用 align-items: stretch(全高)和 align-items: baseline(文本对齐)
注意:菜单项的文本位于 menu-item-label 包装器中,因为我会在项目中添加更多内容(下拉箭头、图片...),但重要的是文本对齐方式。
body {
font-size: 24px; /* Big value to ease highlighting of mis-alignemnt */
}
.some-existing-container {
/* This container has some dimensions: I don't think it would cause conflict. */
width: 100%;
height: 4em;
display: flex;
align-items: center; /* Not mandatory */
border: 1px solid blue; /* Highlighting */
}
.menu {
display: flex;
align-items: baseline;
border: 1px solid green; /* Highlighting */
}
.menu-item {
border: 1px dotted brown; /* Highlighting */
}
.menu-item:hover {
background-color: grey; /* Highlighting */
}
.menu-item-label {
border: 1px dotted pink; /* Highlighting */
}
.other {
margin-left: auto; /* Places this block to the right in .some-existing-container */
border: 1px solid purple; /* Highlighting */
}
.bigger {
font-size: 4rem;
}
.stretched {
align-items: stretch;
}
<p>Variant 1: Texts are aligned but items does not occupies the whole height:</p>
<div class="main">
<div class="some-existing-container">
<div class="menu">
<div class="menu-item">
<div class="menu-item-label">
Home
</div>
</div>
<div class="bigger menu-item">
<div class="menu-item-label">
Item1
</div>
</div>
<div class="menu-item">
<div class="menu-item-label">
Item2
</div>
</div>
<div class="menu-item">
<div class="menu-item-label">
Item3
</div>
</div>
</div>
<div class="other">
Other
</div>
</div>
</div>
<p>Variant 2: Items of same-and-full height but texts are not aligned:</p>
<div class="main">
<div class="some-existing-container">
<div class="menu stretched">
<div class="menu-item">
<div class="menu-item-label">
Home
</div>
</div>
<div class="bigger menu-item">
<div class="menu-item-label">
Item1
</div>
</div>
<div class="menu-item">
<div class="menu-item-label">
Item2
</div>
</div>
<div class="menu-item">
<div class="menu-item-label">
Item3
</div>
</div>
</div>
<div class="other">
Other
</div>
</div>
</div>
我想将两者混合成下面的蒙太奇:
这是否可能(使用或不使用 JavaScript)?
我也尝试过网格布局但没有成功(请参阅this JSFiddle)。
【问题讨论】:
标签: css flexbox vertical-alignment baseline