Есть ли способ разбить список на столбцы?
У моей веб-страницы есть "тощий" список: например, список из 100 наименований по одному слову в каждой. Чтобы уменьшить прокрутку, я хочу представить этот список в двух или даже четырех столбцах на странице. Как это сделать с помощью CSS?
<ul>
<li>Item</li>
<li>Item</li>
<li>Item</li>
<li>Item</li>
<li>Item</li>
<li>Item</li>
<li>Item</li>
<li>Item</li>
<li>Item</li>
<li>Item</li>
</ul>
Ответы
Ответ 1
Решение CSS: http://www.w3.org/TR/css3-multicol/
Поддержка браузера - именно то, что вы ожидаете.
Он работает "везде", кроме Internet Explorer 9 и старше: http://caniuse.com/multicolumn
ul {
-moz-column-count: 4;
-moz-column-gap: 20px;
-webkit-column-count: 4;
-webkit-column-gap: 20px;
column-count: 4;
column-gap: 20px;
}
Смотрите: http://jsfiddle.net/pdExf/
Если требуется поддержка IE, вам придется использовать JavaScript, например:
http://welcome.totheinter.net/columnizer-jquery-plugin/
Другим решением является возврат к нормальному float: left
только для IE. Порядок будет неправильным, но по крайней мере он будет выглядеть примерно так:
Смотрите: http://jsfiddle.net/NJ4Hw/
<!--[if lt IE 10]>
<style>
li {
width: 25%;
float: left
}
</style>
<![endif]-->
Вы можете применить этот резерв с Modernizr, если вы уже используете его.
Ответ 2
Если вы ищете решение, которое работает в IE, вы можете поместить элементы списка влево. Однако это приведет к списку, который змеется, например:
item 1 | item 2 | item 3
item 4 | item 5
Вместо аккуратных столбцов, например:
item 1 | item 4
item 2 |
item 3 |
Код для этого:
ul li {
width:10em;
float:left;
}
Вы можете добавить нижнюю границу к li
, чтобы сделать поток элементов слева направо более очевидным.
Ответ 3
Если вам нужно заранее заданное количество столбцов, вы можете использовать количество столбцов и количество столбцов, как указано выше.
Однако, если вам нужен один столбец с ограниченной высотой, который при необходимости разбивался бы на большее количество столбцов, это можно сделать довольно просто, изменив отображение на flex.
Это не будет работать на IE9 и некоторых других старых браузерах. Вы можете проверить поддержку на я могу использовать
<style>
ul {
display: -ms-flexbox; /* IE 10 */
display: -webkit-flex; /* Safari 6.1+. iOS 7.1+ */
display: flex;
-webkit-flex-flow: wrap column; /* Safari 6.1+ */
flex-flow: wrap column;
max-height: 150px; /* Limit height to whatever you need */
}
</style>
<ul>
<li>Item</li>
<li>Item</li>
<li>Item</li>
<li>Item</li>
<li>Item</li>
<li>Item</li>
<li>Item</li>
<li>Item</li>
<li>Item</li>
<li>Item</li>
</ul>
Ответ 4
Этот ответ не обязательно масштабируется, но требует лишь незначительных корректировок по мере роста списка. Семантически это может показаться немного контр-интуитивным, поскольку это два списка, но помимо этого он будет выглядеть так, как вы хотите, в любом браузере, когда-либо создаваемом.
ul {
float: left;
}
ul > li {
width: 6em;
}
<!-- Column 1 -->
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
<!-- Column 2 -->
<ul>
<li>Item 4</li>
<li>Item 5</li>
<li>Item 6</li>
</ul>
Ответ 5
Я обнаружил, что (в настоящее время) Chrome (Version 52.0.2743.116 m
) имеет массу причуд и проблем с css column-count
относительно элементов переполнения и элементов с абсолютным позиционированием внутри элементов, особенно с некоторыми переходами измерений.
это полный беспорядок и не может быть исправлен, поэтому я попытался решить это с помощью простого javascript и создал библиотеку, которая делает это - https://github.com/yairEO/listBreaker
Ответ 6
Если вы можете это поддерживать, CSS Grid, вероятно, является самым чистым способом преобразования одномерного списка в макет из двух столбцов с адаптивными интерьерами.
ul {
max-width: 400px;
display: grid;
grid-template-columns: 50% 50%;
padding-left: 0;
border: 1px solid blue;
}
li {
list-style: inside;
border: 1px dashed red;
padding: 10px;
}
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
<li>7</li>
<li>8</li>
<li>9</li>
<ul>
Ответ 7
Первый способ для мобильных устройств - использовать CSS-столбцы, чтобы создать интерфейс для небольших экранов, а затем использовать медиа-запросы, чтобы увеличить количество столбцов на каждой из заданных точек макета.
ul {
column-count: 2;
column-gap: 2rem;
}
@media screen and (min-width: 768px)) {
ul {
column-count: 3;
column-gap: 5rem;
}
}
<ul>
<li>Item</li>
<li>Item</li>
<li>Item</li>
<li>Item</li>
<li>Item</li>
<li>Item</li>
<li>Item</li>
<li>Item</li>
<li>Item</li>
<li>Item</li>
</ul>