【问题标题】:How to align multiline headings to heading baseline in CSS如何在 CSS 中将多行标题与标题基线对齐
【发布时间】:2019-03-04 16:20:09
【问题描述】:

我在尝试对齐大型菜单内的标题基线时遇到问题。

/* Presentational bits */

.add-divider {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  border-bottom: 1px solid rgba(0, 0, 0, 0.1);
  padding-bottom: 0.65em;
  -webkit-box-align: baseline;
  -ms-flex-align: baseline;
  align-items: baseline;
}

.standard-list {
  list-style-type: none;
  padding-left: 0;
  list-style: none;
}


/* Core Styling */

.mega-menu-wrapper {
  list-style-type: none;
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(23%, 1fr));
  grid-gap: 10px;
  align-items: baseline;
}
<nav>
  <ul class="mega-menu-wrapper">
    <li class="mega-menu-item">
      <h5 class="add-divider">Typical Section Header</h5>
      <ul class="standard-list">
        <li><a href="#">Link to nowhere</a></li>
        <li><a href="#">Link to nowhere</a></li>
        <li><a href="#">Link to nowhere</a></li>
        <li><a href="#">Link to nowhere</a></li>
        <li><a href="#">Link to nowhere</a></li>
      </ul>
    </li>
    <li>
      <h5 class="add-divider">Atypical Section Header with much longer content in it that breaks to another line</h5>
      <ul class="standard-list">
        <li><a href="#">Link to nowhere</a></li>
        <li><a href="#">Link to nowhere</a></li>
        <li><a href="#">Link to nowhere</a></li>
        <li><a href="#">Link to nowhere</a></li>
        <li><a href="#">Link to nowhere</a></li>
        <li><a href="#">Link to nowhere</a></li>
        <li><a href="#">Link to nowhere</a></li>
        <li><a href="#">Link to nowhere</a></li>
        <li><a href="#">Link to nowhere</a></li>
        <li><a href="#">Link to nowhere</a></li>
        <li><a href="#">Link to nowhere</a></li>
      </ul>
    </li>
    <li>
      <h5 class="add-divider">How to accomodate different sized sections Headers?</h5>
      <ul class="standard-list">
        <li><a href="#">Link to nowhere</a></li>
        <li><a href="#">Link to nowhere</a></li>
        <li><a href="#">Link to nowhere</a></li>
        <li><a href="#">Link to nowhere</a></li>
        <li><a href="#">Link to nowhere</a></li>
      </ul>
    </li>
    <li><h5 class="add-divider">The section dividers should line up</h5>
      <ul class="standard-list">
        <li><a href="#">Link to nowhere</a></li>
        <li><a href="#">Link to nowhere</a></li>
        <li><a href="#">Link to nowhere</a></li>
        <li><a href="#">Link to nowhere</a></li>
      </ul></li>
    <li>
      <h5 class="add-divider">No matter the content of the headers</h5>
      <ul class="standard-list">
        <li><a href="#">Link to nowhere</a></li>
        <li><a href="#">Link to nowhere</a></li>
        <li><a href="#">Link to nowhere</a></li>
        <li><a href="#">Link to nowhere</a></li>
        <li><a href="#">Link to nowhere</a></li>
        <li><a href="#">Link to nowhere</a></li>
        <li><a href="#">Link to nowhere</a></li>
        <li><a href="#">Link to nowhere</a></li>
      </ul>
    </li>
  </ul>
</nav>

如所见,我有一个导航,导航内部是一个无序列表,每个列表项内部都有一个标题,它是导航项的无序列表。每个标题都有自己的底部边框,出于美观目的,并将标题与链接分开。

问题是我无法对齐这些底部边框,它们是标题上的样式。我认为使用 CSS Grid 将是一项非常简单的任务,但也许我使用了错误的东西来设置这个菜单的样式,或者我不知道一些 CSS Grid 功能。

总而言之我只想对齐这些标题的基线,即使它们分成多行。

我查看了以下资源,但没有一个符合我的用例,但我不能是唯一一个遇到这个问题的人,或者它比我想象的更容易解决,我忽略了一些东西.无论哪种方式,这都是我尝试过的无济于事:

非常感谢任何帮助。

CodePen Example

更新

我希望能够支持可变数量的链接,因为这是一个超级菜单,我不知道用户会添加多少个链接。

我意识到这可能无法用我现在的 HTML 结构方式来完成。 我愿意探索构建 HTML 的新方法,只要我可以在第 5 次换行之前有 4 列菜单项。

【问题讨论】:

  • 这在 any 布局方法中是不可能的。没有 CSS 属性来均衡不共享父元素的高度。您需要 Javascript 或对 HTML 进行根本性更改。
  • @Paulie_D 该 HTML 变化看起来会如何?我愿意重新组织 HTML 以使布局更加灵活。

标签: css flexbox css-grid


【解决方案1】:

Here你是

CSS 更新

/* Presentational bits */
.add-divider {
  margin-bottom: 7px;
  margin-top: auto; 
}

.standard-list {
  border-top: 1px solid rgba(0, 0, 0, 0.1);
  padding-top: 5px;
  padding-left: 0;
}

/* Core Styling */
.mega-menu-wrapper {
  display: flex;
  width: 600px;
  flex-wrap: wrap;
  align-items: stretch;
}

.mega-menu-wrapper li {
  width: 180px;
  flex-grow: 1;
  margin: 2px 10px;
  display:flex;
  flex-direction: column;
  justify-content: space-between;
}

.mega-menu-wrapper li ul{
  margin-bottom: auto;
}

回复评论#2

恐怕在这种“边缘”情况下,这种布局并不是 100% 可能的。但是您可以执行以下操作:

  • 使用 JS

    • 目标最长的字符串
    • 得到它的高度
    • 将此高度设置为其他h标签
  • 仍然是 css,但可能很丑

    • 到任何长 h 添加 class="long" 并添加提供的 css .mega-menu-wrapper li.long {flex-basis: 100%;}
  • 有点“hack” - 获取最长列表项的计数并添加空项(如果您使用前端框架,可能会很好 - 如果您使用一个)Angular 示例:

list.component.html

...
  <li class="mega-menu-item">
      <h5 class="add-divider">Typical Section Header</h5>
      <ul class="standard-list">
        <li *ngFor="let i of arrayOfNumbers0toMax">
            <a href="{{linksAtN[i].link}}">{{linksAtN[i].linkName}}</a>
        </li>
      </ul>
    </li>
...

我还在这个答案中更新了 CSS 并添加了

.mega-menu-wrapper li ul{
  margin-bottom: auto;
}

并删除了display: flex.add-divider

我还要附加link to CSS fixed example

【讨论】:

  • 我故意删除了供应商前缀,只留下了此布局所需的 css - 只需在需要的地方再次添加即可。另外我想警告您,IE10 及更低版本不支持弹性显示。但是 flex 已经支持当前 95% 的浏览器。更多信息caniuse
  • 感谢您的回答!如果此解决方案也适用于可变数量的链接,这可能就是我正在寻找的。你需要做一个小的调整来支持它吗?假设第 1 列有 5 个,第 2 列有 11 个,第 3 列有 5 个,第 4 列有 4 个,第 5 列有 8 个链接。 codepen.io/mrcleanandfresh/full/qJdYEP
【解决方案2】:

由于每个标题都位于不同的li 内,因此如果不定义高度值,您将无法对齐它们。

不过,您可以使用一些 JavaScript 来解决此问题:

(function() {
  var headings = document.querySelectorAll('.add-divider'),
      sizes = [];

  headings.forEach(function(el) {
    sizes.push(el.offsetHeight); 
  });

  for (let i = 0; i < headings.length; i++) {
    headings[i].style.minHeight = Math.max(...sizes) + 'px'; 
  }
})();

(jQuery 版本)

$(function(){
  var sizes = [];

  $('.add-divider').each(function() {
    sizes.push($(this).outerHeight()); 

  }).css('minHeight', Math.max(...sizes) );
});

Your CodePen example updated

【讨论】:

  • 你有这个答案的非 JavaScript 版本吗?如果不是很好,那只是这是一个很好的解决方案,但是,我不喜欢下一行损坏的物品在它们上的“不必要”高度。我知道如果我想解决我进入 matchHeight - github.com/liabru/jquery-match-height - 领域的问题,除非你有解决方案。无论如何,如果您没有非 JavaScript 解决方案,我会继续接受您的回答。
  • 不幸的是,在不改变 HTML 结构的情况下使用纯 CSS 无法解决此问题。
  • 哦,有趣。请您更新一下 HTML 结构的变化吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-12
  • 2015-05-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-03
  • 1970-01-01
相关资源
最近更新 更多