Як запобігти розриву стовпця всередині елемента?


272

Розглянемо наступний HTML:

<div class='x'>
    <ul>
        <li>Number one</li>
        <li>Number two</li>
        <li>Number three</li>
        <li>Number four is a bit longer</li>
        <li>Number five</li>
    </ul>
</div>

та наступні CSS:

.x {
    -moz-column-count: 3;
    column-count: 3;
    width: 30em;
}

На сьогодні Firefox робить це аналогічно наступному:

 Number one     Number three          bit longer
 Number two     Number four is a     Number five

Зауважте, що четвертий пункт був розділений між другим та третім стовпчиком. Як мені це запобігти?

Бажане відображення може виглядати приблизно так:

 Number one     Number four is a
 Number two      bit longer
 Number three   Number five

або

 Number one     Number three         Number five
 Number two     Number four is a
                  bit longer

Редагувати: ширина задається лише для демонстрації небажаного візуалізації. У реальному випадку, звичайно, немає фіксованої ширини.


ви намагалися надати цьому li самостійний стиль? як <li style = "width: ??? px"> Число чотири трохи довше </li> ??? px = потрібна ширина, щоб відповідати цьому номеру чотири.
rmagnum2002

Відповіді:


397

Правильний спосіб це зробити за допомогою властивості CSS, що проривається :

.x li {
    break-inside: avoid-column;
}

На жаль, станом на жовтень 2019 року це не підтримується у Firefox, але його підтримує кожен інший головний браузер . За допомогою Chrome я зміг скористатись вищевказаним кодом, але я не зміг зробити щось для Firefox ( див. Bug 549114 ).

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

ОНОВЛЕННЯ

Згідно згаданим вище звітом про помилку, Firefox 20+ підтримує page-break-inside: avoidмеханізм уникнення розривів стовпців всередині елемента, але наведений нижче фрагмент коду демонструє, що він все ще не працює зі списками:

Як відзначають інші, ви можете зробити overflow: hiddenабо , display: inline-blockале це знімає кулі , зазначені в первісному питанні. Ваше рішення варіюватиме залежно від ваших цілей.

UPDATE 2 Оскільки Firefox робить запобігти порушенням на display:tableі display:inline-blockнадійне , але не семантичне рішення було б обернути кожен елемент списку в своєму списку і застосувати правило стилю є:

.x {
    -moz-column-count: 3;
    -webkit-column-count: 3;
    column-count: 3;
    width: 30em;
}

.x ul {
    margin: 0;
    -webkit-column-break-inside: avoid; /* Chrome, Safari */
    page-break-inside: avoid;           /* Theoretically FF 20+ */
    break-inside: avoid-column;         /* IE 11 */
    display:table;                      /* Actually FF 20+ */
}
<div class='x'>
    <ul>
        <li>Number one, one, one, one, one</li>
    </ul>
    <ul>
        <li>Number two, two, two, two, two, two, two, two, two, two, two, two</li>
    </ul>
    <ul>
        <li>Number three</li>
    </ul>
</div>


4
Я вважаю, що Opera 11.5 підтримуєbreak-inside: avoid-column
Alohci

2
Дивлячись на коментар 15, він page-break-inside:avoid повинен працювати у FF 20.
Брайан Нікель

23
У 2014 році, здається, правильний синтаксис виглядає так: -webkit-column-break-inside:avoid; -moz-column-break-inside:avoid; -o-column-break-inside:avoid; -ms-column-break-inside:avoid; column-break-inside:avoid;
Carles Jove i Buxeda

3
@CarlesJoveBuxeda Не спостерігається жодних покращень у Firefox 31. Ні прорив стовпців, ні розрив сторінки (з префіксом або без нього) не працюють.
Брайан Нікель

6
Трохи пізно, але оскільки це все ще проблема в 2018 році, це може бути корисним для інших, хто опинився тут. Якщо у когось ще є помилки між браузерами, overflow: hiddenце кращий варіант. display: inline-block;На жаль, викликає нові химерності з Chrome.
SilasOtoko

170

Додавання;

display: inline-block;

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


1
Це добре. Можливий спосіб запобігти поганій поведінці вбудованого блоку, який спричиняє, що речі зараз будуть скуті на одній лінії (якщо вони занадто короткі) - це додатково обгорнути це display:blockелементом. Це, мабуть, зараз буде суцільним вирішенням Firefox.
Стівен Лу

Це рішення видаляє пункт списку, тому, якщо ви, наприклад, використовуєте списки замовлень, це не буде альтернативою.
Рікардо Зеа

Відмінно працює для розділення абзаців на стовпці.
ChrisC

для елементів списку це може працювати, якщо ви вбудовуєте вміст елемента списку (li) в набір елементів "span", встановлений за допомогою "display: inline-block". Ситуація набагато складніша, якщо ви хочете контролювати, де розбивати сторінки або стовпці в межах таблиць: ви хочете уникати перерв у рядках таблиць (tr). Дійсно, розкладки з декількома стовпцями все ще важко налаштувати, але нам це потрібно для того, щоб сайти могли адаптуватися до дуже вузьких екранів (наприклад, смартфонів) та до широких дисплеїв (де дуже вузькі стовпчики справді несправедливі.
verdy_p

7
Працює для мого, <li>але мені довелося додати, width:100%;щоб запобігти їх горизонтальному укладанню.
Джастін

47

встановити відповідно до стилю елемента, який ви не хочете ламати:

overflow: hidden; /* fix for Firefox */
break-inside: avoid-column;
-webkit-column-break-inside: avoid;

1
Дякую!! У мене були проблеми з FF, і це виправити!
Френсіс Перрон

Я також. Вищезазначені рішення не працювали для мене, але ваше зробили. Кудо!
Макс

Це працює на FF, і він фактично не приховує мій вміст!
Джастін

приємно. працює і для абзацу тексту колон. Додано переповнення: приховано до <p> ind <div> зі стовпцями. Працює для ФФ.
dichterDichter

1
Насправді це overflow:hiddenправило не є виправленням для інших правил, це саме те, що спричиняє нерозбірливий макет…
Gras Double

23

Станом на жовтень 2014 року в Firefox та IE 10-11, здається, прорив все ще є помилковим. Однак додавання переповнення: приховано до елемента разом із проривом всередині: уникай, здається, змушує його працювати в Firefox та IE 10-11. Зараз я використовую:

overflow: hidden; /* Fix for firefox and IE 10-11  */
-webkit-column-break-inside: avoid; /* Chrome, Safari, Opera */
page-break-inside: avoid; /* Firefox */
break-inside: avoid; /* IE 10+ */
break-inside: avoid-column;

Це, здається, найбільш вичерпний список
бінарний пік

12

Firefox тепер підтримує це:

page-break-inside: avoid;

Це вирішує проблему розбиття елементів на стовпчики.


У вас це працює? Я переглядаю цю скрипку у FF 22, і вона не працює: jsfiddle.net/bnickel/5qwMf
Брайан Нікель

Те саме тут, не працює у Firefox 22. Також Firebug відображає page-break-before:або page-break-after:не показуєpage-break-inside:
Ricardo Zea

Версія 28 Firefox. Це єдиний, який працює для мене ще, дякую!
Сандер Верхаген

9

Зараз прийнятої відповіді два роки, і, здається, все змінилося.

Ця стаття пояснює використання column-break-insideмайна. Я не можу сказати, чим і чому це відрізняється break-inside, оскільки, як видається, документальне оформлення у специфікації W3 є лише останньою. Однак Chrome і Firefox підтримують таке:

li {
    -webkit-column-break-inside:avoid;
       -moz-column-break-inside:avoid;
            column-break-inside:avoid;
}

Це не працює для загального <div class = "a">, де "a" замінює ваш "Li" вище. Дива все-таки ввірвалася всередину. FF 26
Nasser

Не помилка. наведений вище код є правильним для описаної функції, навіть якщо його селектор призначений лише для елементу li. Ви все ще можете використовувати інший селектор CSS "div.a {...}" замість "li {...}" у цьому зразку.
verdy_p

Однак Chrome все ще не підтримує -webkit-column-break-inside: Avoid; на рядку таблиці: це не працює, і ми все ще не можемо уникнути розбиття таблиць у неправильних положеннях (особливо, якщо клітинка казки містить не лише текст, а піктограми; але, здається, Chrome також розбивається у будь-якому вертикальному положенні посередині текстового рядка , розбиваючи текст верхньою частиною текстових гліфів у нижній частині першого стовпця, а нижню частину текстових гліфів у верхній частині наступного стовпця !!! Результат абсолютно нечитабельний !!!
verdy_p

Станом на 2017 рік, прорив стовпців не здається дійсним властивістю css. MDN говорить лише, що "Edge також підтримує нестандартний варіант -webkit-column-break-inside".
Якоб К. каже: Відновіть Моніку

9

Це працює для мене у 2015 році:

li {
  -webkit-column-break-inside: avoid;
  /* Chrome, Safari, Opera */
  page-break-inside: avoid;
  /* Firefox */
  break-inside: avoid;
  /* IE 10+ */
}
.x {
  -moz-column-count: 3;
  column-count: 3;
  width: 30em;
}
<div class='x'>
  <ul>
    <li>Number one</li>
    <li>Number two</li>
    <li>Number three</li>
    <li>Number four is a bit longer</li>
    <li>Number five</li>
  </ul>
</div>


Це працює для мене на ulелементах, розміщена на CSS трюків: css-tricks.com/almanac/properties/b/break-inside , і здається правильним на основі нот сумісності caniuse: «Часткова підтримка відноситься не підтримуючи break-before, break-after, break-insideвластивості . Браузери на основі WebKit та Blink мають еквівалентну підтримку нестандартних -webkit-column-break-*властивостей для досягнення того ж результату (але лише значень autoта alwaysзначень). Firefox не підтримує, break-*але підтримує page-break-*властивості для досягнення того ж результату. "
nabrown

3

Наступний код працює для запобігання розривів стовпців всередині елементів:

-webkit-column-break-inside: avoid;
-moz-column-break-inside: avoid;
-o-column-break-inside: avoid;
-ms-column-break-inside: avoid;
column-break-inside: avoid;

3

У 2019 році ця робота працює для Chrome, Firefox та Opera (після багатьох інших невдалих спроб):

.content {
    margin: 0;
    -webkit-column-break-inside: avoid;
    break-inside: avoid;
    break-inside: avoid-column;
}

li {
    -webkit-column-break-inside:avoid;
       -moz-column-break-inside:avoid;
            column-break-inside:avoid;
           break-inside: avoid-column;
             page-break-inside: avoid;
}

2

Firefox 26, здається, вимагає

page-break-inside: avoid;

І Chrome 32 потребує

-webkit-column-break-inside:avoid;
   -moz-column-break-inside:avoid;
        column-break-inside:avoid;

2

У мене була та сама проблема, яку я думаю, і знайшов рішення в цьому:

-webkit-column-fill: auto; /* Chrome, Safari, Opera */
-moz-column-fill: auto; /* Firefox */
column-fill: auto;  

Працює також у FF 38.0.5: http://jsfiddle.net/rkzj8qnv/


Це рішення допомагає мені
OzzyCzech

1

Можливе вирішення для Firefox полягає в тому, щоб встановити властивість CSS "відображення" елемента, у якого ви не хочете мати перерву всередині, на "таблицю". Я не знаю, чи працює він для тегу LI (ви, ймовірно, втратите список -item-стиль), але він працює для тегу P.


Це рішення видаляє пункт списку, тому, якщо ви, наприклад, використовуєте списки замовлень, це не буде альтернативою.
Рікардо Зеа

1

Я просто виправив деякі divелементи, які розбивались на наступний стовпець, додавши

overflow: auto

до дитини divs.

* Зрозуміло це виправляє лише у Firefox!


1

Я зіткнувся з тим же питанням під час використання карт-стовпців

я виправив це за допомогою

 display: inline-flex ;
 column-break-inside: avoid;
 width:100%;


0

Я зробив оновлення фактичної відповіді.

Здається, це працює над Firefox та chrome: http://jsfiddle.net/gatsbimantico/QJeB7/1/embedded/result/

.x{
columns: 5em;
-webkit-columns: 5em; /* Safari and Chrome */
-moz-columns: 5em; /* Firefox */
}
.x li{
    float:left;
    break-inside: avoid-column;
    -webkit-column-break-inside: avoid;  /* Safari and Chrome */
}

Примітка: Поплавок властивість , здається, один робить поведінку блоку.


0

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

У мене був список, як і оп, але він містив два елементи, елементи та кнопки для дії на них. Я ставився до неї , як стіл <ul> - table, <li> - table-row, <div> - table-cellпоставити UL в макеті в 4 шпальти. Стовпці інколи розділялися між пунктом і кнопками. Трюк, який я використав, полягав у тому, щоб надати елементам Div висоту лінії для покриття кнопок.

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