Чи є спосіб розбити список на стовпці?


119

Моя веб-сторінка має «худий» список: наприклад, список зі 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>

Я вважаю за краще, щоб рішення було гнучким, так що якщо список зростає до 200 позицій, мені не доведеться робити багато ручних коригувань, щоб підходити до нового списку.


Є бібліотека, яка робить це - github.com/yairEO/listBreaker
vsync

Я вірю, що параметр стовпця CSS буде. Цей варіант простий у використанні та зміні, якщо є потреба. Ось це ви детально пояснили - kolosek.com/css-column
Неша

Відповіді:


254

Рішення 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, якщо ви її вже використовуєте.


Чи є спосіб видалити верхню межу на першій liу кожному стовпчику?
Так, Баррі

2
Це чудово підходить для фіксованого простору, але стає проблемою з чуйними конструкціями, оскільки стовпці не руйнуються, як при використанні дисплея: inline або inline-block.
unifiedac

4
Цікавий факт: IE - єдиний головний настільний браузер, який повністю підтримує цю функцію без префіксів (починаючи з IE10) ... О, іронія ...
NemoStein

1
Можливо, для кращої підтримки веб-переглядача може знадобитися включити цю додаткову властивість, list-style-position: inside;яка конкретно вирішує проблему, яку вказує @vsync Я вважаю
ThisClark

4
@PrafullaKumarSahu: Спробуйте li { break-inside: avoid; }: jsfiddle.net/thirtydot/pdExf/903 . Я не надто знайомий зі стовпцями CSS, тому може бути кращий спосіб.
тридцятьдот,

19

Якщо ви шукаєте рішення, яке також працює в 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;
}

Ви можете додати межу донизу до lis, щоб зробити потік елементів зліва направо більш очевидним.


хоча це може працювати для певної кількості предметів, результат буде не гарним лише для двох предметів.
vsync

Ще одне робоче рішення CSS для "акуратних стовпців": stackoverflow.com/q/54982323/1066234
Kai Noack

10

Якщо ви хочете задати кількість стовпців, ви можете використовувати кількість колонок та розрив стовпців, як зазначено вище.

Однак, якщо ви хочете, щоб один стовпчик з обмеженою висотою, який би розпався на більше стовпців, якщо це потрібно, це можна досягти досить просто, змінивши дисплей на гнучку.

Це не працюватиме на 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>


2
Дуже близько до того, що я йду після. Єдиним недоліком є ​​те, що ширина стовпців не адаптується до вмісту (спробуйте з різними елементами довжини). Не знаєте, як визначається ширина стовпця. Можливо, з першого елемента? У будь-якому випадку, якісь покажчики, як це подолати?
jorgeh

Чи можна було б обмежити кількість стовпців, а не висоту? Мені потрібні елементи, щоб заповнити чотири стовпці, і css column-countматиме неоднакову кількість рядків у стовпцях. Як і 6 пунктів у першій колонці, потім 4, потім 6, потім 5.
Virge Assault

Було б добре, якби ви позначили елементи, наприклад "Пункт 1", "Пункт 2", щоб глядачі могли бачити потік елементів
allkenang

3

Ця відповідь не обов'язково масштабує, але вимагає лише незначних коригувань у міру зростання списку. Семантично це може здатися трохи протиінтуїтивним, оскільки це два списки, але окрім цього він буде виглядати так, як ви хочете в будь-якому браузері, коли-небудь зробленому.

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>


2

2020 - будьте просто, використовуйте CSS Grid

Багато цих відповідей застаріли, це 2020 рік, і ми не повинні дозволяти людям, які все ще використовують IE9. Це набагато простіше просто використовувати CSS-сітку .

Код дуже простий, і ви можете легко налаштувати кількість стовпців за допомогою grid-template-columns. Дивіться це, а потім пограйте з цією загадкою, щоб відповідати вашим потребам.

.grid-list {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
}
<ul class="grid-list">
  <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>
  <li>item</li>
  <li>item</li>
</ul>


1
Це найкраще рішення для мене.
Patee Gutee

1

Я виявив, що в даний час у Chrome ( Version 52.0.2743.116 m) є безліч химерностей і проблем з css column-countщодо елементів переповнення та абсолютних позиціонованих елементів всередині елементів, особливо з переходами деяких розмірів.

це загальний безлад і його неможливо виправити, тому я спробував вирішити це за допомогою простого javascript і створив бібліотеку, яка це робить - https://github.com/yairEO/listBreaker

Демонстраційна сторінка


Я вважаю за краще плагін колоннізатора jQuery, на мою думку, він мав кращу функціональність для того, що я робив (вмів сортувати за алфавітом, за убуванням чи зростанням, кількість стовпців, ширина стовпців та інше). jQuery Columnizer - WelcomeToTheInter.Net
Brandito

@Brandito - ну, у колу Columnizer напевно є більше варіантів, оскільки це майже 1000 рядків коду, порівняно з моїм, який становить приблизно 120 рядків .. але добре справляється
vsync

так, але моїй проблемі потрібен був список, щоб він залишався одним списком, що корисніше / потрібніше залежить від випадку використання.
Брандіто

0

Якщо ви можете підтримати його, 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>

Це два ключових рядки, які дадуть вам ваш макет 2 стовпців

display: grid;
grid-template-columns: 50% 50%;

0

Перший спосіб для мобільних пристроїв - використовувати стовпці 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>


0

Ось що я зробив

ul {
      display: block;
      width: 100%;
}

ul li{
    display: block;
    min-width: calc(30% - 10px);
    float: left;
}

ul li:nth-child(2n + 1){
    clear: left;
}
<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>
  <li>0</li>
</ul>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.