Добавьте разделитель труб после элементов в неупорядоченном списке, если этот элемент не является последним в строке
можно ли стилизовать этот html ...
<ul>
<li>Dogs</li>
<li>Cats</li>
<li>Lions</li>
<li>Tigers</li>
<li>Zebras</li>
<li>Giraffes</li>
<li>Bears</li>
<li>Hippopotamuses</li>
<li>Antelopes</li>
<li>Unicorns</li>
<li>Seagulls</li>
</ul>
... вроде этого. ..
... без добавления классов к определенным элементам списка или использования javascript? И если да, то как?
разрывы строк не фиксируются; список расширяется, чтобы занять дополнительное пространство, а элементы списка выровнены по центру.
9 ответов:
теперь это возможно с
flex-box
ключи к этой технике:
- элемент контейнера установлен в
overflow: hidden
.- Set
justify-content: space-between
наul
(который является flex-box), чтобы заставить его flex-элементы растягиваться до левого и правого краев.- Set
margin-left: -1px
наul
чтобы заставить его левый край переполнить контейнер.- Set
border-left: 1px
наli
flex-элементы.контейнер действует как маска, скрывающая границы любых гибких элементов, соприкасающихся с ее левым краем.
.flex-list { position: relative; margin: 1em; overflow: hidden; } .flex-list ul { display: flex; flex-direction: row; flex-wrap: wrap; justify-content: space-between; margin-left: -1px; } .flex-list li { flex-grow: 1; flex-basis: auto; margin: .25em 0; padding: 0 1em; text-align: center; border-left: 1px solid #ccc; background-color: #fff; }
<link href="https://cdnjs.cloudflare.com/ajax/libs/meyer-reset/2.0/reset.min.css" rel="stylesheet"/> <div class="flex-list"> <ul> <li>Dogs</li> <li>Cats</li> <li>Lions</li> <li>Tigers</li> <li>Zebras</li> <li>Giraffes</li> <li>Bears</li> <li>Hippopotamuses</li> <li>Antelopes</li> <li>Unicorns</li> <li>Seagulls</li> </ul> </div>
просто
li + li::before { content: " | "; }
конечно, это на самом деле не решает проблему ОП. Он хочет, чтобы elide вертикальные полосы в начале и конце линий в зависимости от того, где они сломаны. Я выйду на конечность и утверждаю, что эта проблема не разрешима с помощью CSS, и даже не с JS, если только вы не хотите существенно переписать логику текстового измерения/компоновки/разрыва строки браузера.
единственные части CSS, насколько я вижу, которые "знают" о линии ломка-это, во-первых,
::first-line
псевдо элемент, который не помогает нам здесь--в любом случае, он ограничен несколькими презентационными атрибутами и не работает вместе с такими вещами, как ::до и ::после. Единственный другой аспект CSS, который я могу думать о том, что в какой-то степени раскрывает разрыв строки, - это перенос. Однако перенос-это все о добавлять символ (обычно тире) до конца строк в определенных ситуациях, тогда как здесь мы обеспокоены удаление символ (вертикальная линия), поэтому я просто не вижу, как применить любую логику, связанную с переносом, даже с помощью таких свойств, какhyphenate-character
.у нас есть
word-spacing
свойство, которое применяется внутри строки, но не в начале и конце строки, что кажется многообещающим, но оно определяет ширину пространства между словами, а не символ(Ы), который будет использоваться.интересно, есть ли какой-то способ использовать
text-overflow
имущество, которое имеет малоизвестная возможность принимать два значения для отображения текста переполнения слева и справа, как вtext-overflow: '' '';
но все еще не кажется, что есть какой-либо очевидный способ добраться от A до B здесь.
прежде чем показывать код, стоит отметить, что IE8 поддерживает
:first-child
а не:last-child
, поэтому в подобных ситуациях, вы должны использовать:first-child
псевдо-класса.демо
#menu{ list-style: none; } #menu li{ display: inline; padding: 0 10px; border-left: solid 1px black; } #menu li:first-child{ border-left: none; }
<ul id="menu"> <li>Dogs</li> <li>Cats</li> <li>Lions</li> <li>More animals</li> </ul>
использовать
:after
псевдо селектор. Смотрите http://jsfiddle.net/A52T8/1/<ul> <li>Dogs</li> <li>Cats</li> <li>Lions</li> <li>Tigers</li> <li>Zebras</li> <li>Giraffes</li> <li>Bears</li> <li>Hippopotamuses</li> <li>Antelopes</li> <li>Unicorns</li> <li>Seagulls</li> </ul> ul li { float: left; } ul li:after { content: "|"; padding: 0 .5em; }
EDIT:
решение на jQuery:
html:
<div> <ul id="animals"> <li>Dogs</li> <li>Cats</li> <li>Lions</li> <li>Tigers</li> <li>Zebras</li> <li>Giraffes</li> <li>Bears</li> <li>Hippopotamuses</li> <li>Antelopes</li> <li>Unicorns</li> <li>Seagulls</li> <li>Monkey</li> <li>Hedgehog</li> <li>Chicken</li> <li>Rabbit</li> <li>Gorilla</li> </ul> </div>
css:
div { width: 300px; } ul li { float: left; border-right: 1px solid black; padding: 0 .5em; } ul li:last-child { border: 0; }
jQuery
var maxWidth = 300, // Your div max-width totalWidth = 0; $('#animals li').each(function(){ var currentWidth = $(this).outerWidth(), nextWidth = $(this).next().outerWidth(); totalWidth += currentWidth; if ( (totalWidth + nextWidth) > maxWidth ) { $(this).css('border', 'none'); totalWidth = 0; } });
посмотреть здесь. Я также добавил еще несколько животных. http://jsfiddle.net/A52T8/10/
Я знаю, что немного опоздал на вечеринку, но если вы можете смириться с тем, что линии слева оправданы, один хак должен поставить трубы перед элементами, а затем положить маску над левым краем, в основном так:
li::before { content: " | "; white-space: nowrap; } ul, li { display: inline; } .mask { width:4px; position: absolute; top:8px; //position as needed }
более полный пример: http://jsbin.com/hoyaduxi/1/edit
одним из решений является стиль левой границы вот так:
li { display: inline; } li + li { border-left: 1px solid; margin-left:.5em; padding-left:.5em; }
однако это может не дать вам желаемых результатов, если все списки обернуты, как в вашем примере. То есть это дало бы что-то вроде:
foo | bar | baz | bob | bill | judy
я наткнулся на решение сегодня, которое, кажется, не здесь уже и которое, кажется, работает довольно хорошо до сих пор. Принятый ответ не работает как-есть на IE10, но это один делает. http://codepen.io/vithun/pen/yDsjf/ кредит автору конечно!
.pipe-separated-list-container { overflow-x: hidden; } .pipe-separated-list-container ul { list-style-type: none; position: relative; left: -1px; padding: 0; } .pipe-separated-list-container ul li { display: inline-block; line-height: 1; padding: 0 1em; margin-bottom: 1em; border-left: 1px solid; }
<div class="pipe-separated-list-container"> <ul> <li>One</li> <li>Two</li> <li>Three</li> <li>Four</li> <li>Five</li> <li>Six</li> <li>Seven</li> <li>Eight</li> <li>Nine</li> <li>Ten</li> <li>Eleven</li> <li>Twelve</li> <li>Thirteen</li> <li>Fourteen</li> <li>Fifteen</li> <li>Sixteen</li> <li>Seventeen</li> <li>Eighteen</li> <li>Nineteen</li> <li>Twenty</li> <li>Twenty One</li> <li>Twenty Two</li> <li>Twenty Three</li> <li>Twenty Four</li> <li>Twenty Five</li> <li>Twenty Six</li> <li>Twenty Seven</li> <li>Twenty Eight</li> <li>Twenty Nine</li> <li>Thirty</li> </ul> </div>
да, вам нужно будет использовать псевдо элементы и псевдо селекторы:http://jsfiddle.net/cYky9/