Как выровнять многострочные заголовки по базовой линии заголовка в CSS - PullRequest
0 голосов
/ 28 сентября 2018

У меня возникла проблема при попытке выровнять базовые линии заголовков внутри мегаменю.

/* 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

Обновление

Я хотел бы иметь возможность поддерживать переменное количество ссылок, так как это мегаменю, я не знаю, сколько ссылок пользователь добавит в него.

Я понимаю, что это может быть не такбыть в состоянии сделать так, как мой HTML структурирован сейчас. Я открыт для изучения новых способов структурирования HTML до тех пор, пока у меня может быть 4 столбца пунктов меню до 5-го разрыва новой строки.

Ответы [ 2 ]

0 голосов
/ 29 сентября 2018

Здесь Вы

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%;}
  • Какая "хак" - получить количество самых длинных элементов списка и добавить пустые (вероятно, хорошо, если вы используете инфраструктуру внешнего интерфейса - если вы используете один) Угловой пример:

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

Также я добавляю ссылку на фиксированный пример CSS .

0 голосов
/ 28 сентября 2018

Поскольку каждый заголовок находится внутри отдельного 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) );
});

Обновлен пример вашего CodePen

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...