Допустим, у меня есть этот HTML:
<h3>Features</h3>
<ul>
<li><img src="alphaball.png">Smells Good</li>
<li><img src="alphaball.png">Tastes Great</li>
<li><img src="alphaball.png">Delicious</li>
<li><img src="alphaball.png">Wholesome</li>
<li><img src="alphaball.png">Eats Children</li>
<li><img src="alphaball.png">Yo' Mama</li>
</ul>
и этот CSS:
li { text-align:center; display:inline-block; padding:0.1em 1em }
img { width:64px; display:block; margin:0 auto }
Результат можно увидеть здесь: http://jsfiddle.net/YMN7U/1/
Теперь представьте, что я хочу разбить это на три столбца, что эквивалентно введению <br>
после третьего <li>
. (На самом деле выполнение этого будет семантически и синтаксически недействительным.)
Я знаю, как выбрать третий <li>
в CSS, но как заставить разрыв строки после него? Это не работает:
li:nth-child(4):after { content:"xxx"; display:block }
Я также знаю, что этот конкретный случай возможен с использованием float
вместо inline-block
, но я не заинтересован в использовании решений float
. Я также знаю, что с блоками фиксированной ширины это возможно, если установить ширину родительского элемента ul
примерно в 3 раза больше этой ширины; Я не заинтересован в этом решении. Я также знаю, что я мог бы использовать, display:table-cell
если бы я хотел реальные столбцы; Я не заинтересован в этом решении. Меня интересует возможность принудительного перерыва внутри встроенного контента.
Изменить : Чтобы было ясно, я заинтересован в «теории», а не решение конкретной проблемы. Может ли CSS ввести разрыв строки в середине display:inline(-block)?
элементов или это невозможно? Если вы уверены, что это невозможно, это приемлемый ответ.
Ответы:
Я был в состоянии заставить это работать на встроенных элементах LI. К сожалению, это не работает, если элементы LI являются inline-block:
Живая демоверсия: http://jsfiddle.net/dWkdp/
Или версия примечаний утеса:
источник
:after
всегда печатается как прямой текст.\A
- символ перевода строки ... это побегВас не интересует множество «решений» вашей проблемы. Я не думаю, что действительно есть хороший способ сделать то, что вы хотите сделать. Все, что вы вставляете, использует
:after
иcontent
имеет точно такую же синтаксическую и семантическую достоверность, как если бы вы только что написали это сами.Инструменты CSS обеспечивают работу. Вы должны просто вспомнить
li
s и затем,clear: left
когда вы хотите начать новую строку, как вы уже упоминали:Смотрите пример: http://jsfiddle.net/marcuswhybrow/YMN7U/5/
источник
:after
синтаксически правильной или хорошей идеи, так как уже есть инструменты для этого. Отсюда и ответ.float: center
.Когда разрешено переписывание html, вы можете вкладывать
<ul>
s внутри<ul>
и просто<li>
показывать внутренний s как inline-block. Это также семантически имеет смысл ИМХО, так как группировка также отражена в html.демонстрация
источник
Простой способ разбить списки на строки - плавать отдельные элементы списка, а затем элемент, который вы хотите перейти на следующую строку, вы можете очистить с плавающей точкой.
например
источник
float
настройка переопределяетinline-block
настройку. Они действительно не сосуществуют вместеЯ знаю, что вы не хотели использовать поплавки, и вопрос был просто теоретическим, но в случае, если кто-то посчитает это полезным, вот решение с использованием поплавков.
Добавьте класс left к вашим
li
элементам, которые вы хотите плавать:и измените ваш CSS следующим образом:
http://jsfiddle.net/chut319/xJ3pe/
Вам не нужно указывать ширину или встроенные блоки, и это работает еще в IE6.
источник
Я достиг этого, создав селектор :: before для первого встроенного элемента в строке и сделав этот селектор блоком с верхним или нижним полем для небольшого разделения строк.
источник
Обратите внимание, что это будет работать, в зависимости от того, как вы отображаете страницу. Но как насчет того, чтобы начать новый неупорядоченный список?
т.е.
источник
Лучшее решение - использовать -webkit-columns: 2;
http://jsfiddle.net/YMN7U/889/
источник
Может быть, это полностью возможно только с помощью CSS, но я предпочитаю избегать "float" столько, сколько могу, потому что это мешает росту его родителя.
Если вы используете jQuery, вы можете создать простой плагин `wrapN`, который похож на` wrapAll`, за исключением того, что он оборачивает только элементы "N", а затем разбивает и оборачивает следующие элементы "N" с помощью цикла. Затем установите свой класс-оболочку в `display: block;`.
Вот JSFiddle готового продукта:
http://jsfiddle.net/dustinpoissant/L79ahLoz/
источник