2-х колоночный CSS Flex / Grid для UL - PullRequest
1 голос
/ 16 марта 2019

Я провел слишком много времени на работе сегодня, думая об этом, поэтому я решил спросить интернет-улей.

У меня есть стандарт <ul> с числом <li> элементов (в настоящее время 12, но могут отличаться).Я хотел бы расположить их в 2 столбца одинаковой ширины, В то же время не делая ширину блока <ul> полной шириной.Решение также должно поддерживать IE11, к сожалению (не ранее).Любое решение также должно быть отзывчивым, поэтому не следует задавать непроцентную ширину.Я испробовал несколько разных сценариев (вам нужно развернуть фрагмент до полного экрана):

Решение 1 (сетка):

*{
  box-sizing: border-box;
}
div{
  display: flex;
  justify-content: center;
}
ul{
  list-style: none;
  margin-top: 0;
  margin-bottom: 0;
  padding: 0;
  display: inline-grid;
  grid-template-columns: repeat(2, 1fr);
}
li{
   padding: 15px;
}
<div>
  <ul>
    <li>In maximus viverra scelerisque. Vestibulum dignissim ex non</li>
    <li>Sed suscipit, turpis in suscipit consectetur, ante sem.</li>
    <li>Ut et mauris et dui gravida fringilla ut.</li>
    <li>Nullam iaculis fermentum sodales. Proin commodo eleifend lacus.</li>
    <li>Sed molestie, libero at hendrerit sollicitudin, enim nisi.</li>
    <li>Mauris a facilisis dolor. Sed pharetra hendrerit dolor.</li>
    <li>Sed vitae felis tellus. Quisque sagittis, felis vitae.</li>
    <li>Integer et elit metus. Cras congue vestibulum hendrerit.</li>
    <li>Fusce suscipit ante sed tristique euismod. Duis quis.</li>
    <li>Vestibulum quam felis, fringilla in justo malesuada, tristique.</li>
    <li>Integer volutpat quam sed urna iaculis mollis. Maecenas.</li>
    <li>Nullam dignissim ipsum vitae finibus dignissim. Nam viverra.</li>
  </ul>
</div>

Это решение по существу работает идеально - оно размещает <li> s в 2 столбцах, UL центрируется в содержащем flex div.Но, конечно, у IE есть проблемы, и хотя я мог бы использовать префиксы IE в старой спецификации , мне все равно нужно было бы вручную назначать позицию столбца / строки для каждого li, что невозможно для списка, которыйпотенциально может иметь любое количество элементов.

Решение 2 (flex):

*{
    box-sizing: border-box;
}
div {
  display: flex;
  justify-content: center;
}

ul {
  list-style: none;
  margin-top: 0;
  margin-bottom: 0;
  padding: 0;
  display: inline-flex;
  flex-wrap: wrap;
}

li {
  padding: 15px;
  width: 50%;
}
<div>
  <ul>
    <li>In maximus viverra scelerisque. Vestibulum dignissim ex non</li>
    <li>Sed suscipit, turpis in suscipit consectetur, ante sem.</li>
    <li>Ut et mauris et dui gravida fringilla ut.</li>
    <li>Nullam iaculis fermentum sodales. Proin commodo eleifend lacus.</li>
    <li>Sed molestie, libero at hendrerit sollicitudin, enim nisi.</li>
    <li>Mauris a facilisis dolor. Sed pharetra hendrerit dolor.</li>
    <li>Sed vitae felis tellus. Quisque sagittis, felis vitae.</li>
    <li>Integer et elit metus. Cras congue vestibulum hendrerit.</li>
    <li>Fusce suscipit ante sed tristique euismod. Duis quis.</li>
    <li>Vestibulum quam felis, fringilla in justo malesuada, tristique.</li>
    <li>Integer volutpat quam sed urna iaculis mollis. Maecenas.</li>
    <li>Nullam dignissim ipsum vitae finibus dignissim. Nam viverra.</li>
  </ul>
</div>

Хотя это решение технически приемлемо (работает достаточно хорошо, включая IE11), проблема здесь заключается в визуальной привлекательности.Поскольку <ul> теперь охватывает всю ширину, несмотря на то, что он находится по центру в содержащем flex div, <li> s, охватывающие 50% текста с выравниванием по левому краю, оставляют большое пространство визуального пробела с правой стороны каждого столбца (широкий экраннужно было увидеть дополнительное пространство).

Решение 3 (таблицы для IE11):

Я не собираюсь публиковать фрагмент для этого, поскольку он был наименее привлекательным.По сути, это было связано с целевым назначением IE11, установкой <ul> на display:table;, установкой <li> s на display:table-cell; float: left; width: 50%; ... Короче говоря, это был беспорядок, который все еще не работал визуально.

Должен ли я просто сократить свои потери и перейти к решению 2?Я бы очень хотел получить визуальное оформление решения 1, если это возможно ... Есть идеи?

1 Ответ

0 голосов
/ 16 марта 2019

Свойство display: flex; превратит элемент в гибкий контейнер, который влияет на макет только прямых дочерних элементов, поэтому, если он находится только на внешнем div, он влияет только на макет ul, которыйэто прямой ребенок.По этой причине я добавил display: flex; к элементу ul, чтобы содержащиеся дочерние элементы li получили гибкий макет.Отличный ресурс для получения дополнительной информации о flexbox: https://css -tricks.com / snippets / css / a-guide-to-flexbox /

Для устранения дополнительного пробела ямаксимальная ширина добавлена ​​к ul меньше 100%, чтобы ширина не доходила до краев, отрегулируйте это значение по мере необходимости.Я также изменил отступы для элементов li, добавляя только отступы слева и справа, и добавил margin-bottom, чтобы расположить их вертикально.

Наконец, я рекомендую добавить класс в оболочку divтак что вы можете настроить таргетинг на все контекстно, иначе ваш таргетинг CSS div будет попадать на каждый div на сайте, это может быть очень проблематично.

* {
    box-sizing: border-box;
}
.wrapper {
  display: flex;
  justify-content: center;
}

.wrapper ul {
  list-style: none;
  margin: 0;
  padding: 0;
  max-width: 90%; // adjust the width compared to the container
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
}

.wrapper li {
  padding: 0 15px; // padding right and left only
  margin-bottom: 20px; // vertical spacing between li elements
  width: 50%;
}
<div class="wrapper">
  <ul>
    <li>In maximus viverra scelerisque. Vestibulum dignissim ex non</li>
    <li>Sed suscipit, turpis in suscipit consectetur, ante sem.</li>
    <li>Ut et mauris et dui gravida fringilla ut.</li>
    <li>Nullam iaculis fermentum sodales. Proin commodo eleifend lacus.</li>
    <li>Sed molestie, libero at hendrerit sollicitudin, enim nisi.</li>
    <li>Mauris a facilisis dolor. Sed pharetra hendrerit dolor.</li>
    <li>Sed vitae felis tellus. Quisque sagittis, felis vitae.</li>
    <li>Integer et elit metus. Cras congue vestibulum hendrerit.</li>
    <li>Fusce suscipit ante sed tristique euismod. Duis quis.</li>
    <li>Vestibulum quam felis, fringilla in justo malesuada, tristique.</li>
    <li>Integer volutpat quam sed urna iaculis mollis. Maecenas.</li>
    <li>Nullam dignissim ipsum vitae finibus dignissim. Nam viverra.</li>
  </ul>
</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...