Подтвердить что ты не робот

Добавьте разделитель труб после элементов в неупорядоченном списке, если этот элемент не является последним в строке

Можно ли создать этот 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>

... вот так...

enter image description here

... без добавления классов в определенные элементы списка или при использовании javascript? И если да, то как?

Разрывы строк не фиксированы; список расширяется, чтобы заняться дополнительным пространством, а элементы списка выравниваются по центру.

4b9b3361

Ответ 1

Теперь это возможно с помощью flex-box

Ключи к этой технике:

  • Элемент контейнера, установленный на overflow: hidden.
  • Установите justify-content: space-between на ul (который является гибкой коробкой), чтобы заставить его гибкие элементы растягиваться на левый и правый края.
  • Установите margin-left: -1px в ul, чтобы его левый край переполнил контейнер.
  • Установите border-left: 1px на гибкие элементы li.

Контейнер действует как маска, скрывающая границы любых гибких элементов, касающихся левого края.

.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>

Ответ 2

Просто

li + li::before {
    content: " | ";
}

Конечно, это фактически не решает проблему ОП. Он хочет высвободить вертикальные полосы в начале и конце строк в зависимости от того, где они сломаны. Я выйду на конечность и утвержу, что эта проблема не разрешима с помощью CSS, и даже не с JS, если вы не захотите существенно переписать логику текстового измерения/компоновки/маршрутизации двигателя браузера.

Единственные фрагменты CSS, насколько я вижу, "знают" о разрыве строки, во-первых, псевдоэлемент ::first-line, который нам не помогает, - в любом случае он ограничен несколько презентационных атрибутов и не работает вместе с такими вещами, как:: before и:: after. Единственный другой аспект CSS, который я могу придумать, в какой-то степени раскрывает прерывание строки - перенос. Тем не менее, перенос означает все добавление символа (обычно тире) в конец строк в определенных ситуациях, тогда как здесь нас беспокоит удаление символа (вертикальная линия), поэтому я просто не вижу, как применять любую логику, связанную с переносом, даже с помощью таких свойств, как hyphenate-character.

У нас есть свойство word-spacing, которое применяется внутри линии, но не в начале строки и концах, что кажется многообещающим, но определяет ширину пробела между словами, а не характер (ы), которые будут использоваться.

Интересно, есть ли способ использовать свойство text-overflow, которое имеет малоизвестную способность принимать два значения для отображения текста переполнения слева и справа, как в

text-overflow: '' '';

но, похоже, нет никакого очевидного способа получить от A до B.

Ответ 3

Прежде чем показывать код, стоит упомянуть, что IE8 поддерживает :first-child, но не :last-child, поэтому в подобных ситуациях вы должны использовать псевдокласс класса :first-child.

Demo

#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>

Ответ 4

Используйте псевдо-селектор :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/

Ответ 5

Одним из решений является стиль левой границы:

li { display: inline; }
li + li {
  border-left: 1px solid;
  margin-left:.5em;
  padding-left:.5em;
}

Однако это может не дать желаемых результатов, если все списки обернуты, как в вашем примере. То есть это даст что-то вроде:

foo | bar | baz
 | bob | bill
 | judy

Ответ 6

Я знаю, что я немного опаздываю на вечеринку, но если вы можете мириться с выравниванием строк, один взломать, чтобы положить трубы перед элементами, а затем поместить маску над левым краем, в основном так:

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

Ответ 7

Сегодня я столкнулся с решением, которое, похоже, уже не существует и, похоже, работает до сих пор. Принятый ответ не работает как есть на 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>

Ответ 8

Да, вам нужно будет использовать псевдоэлементы и псевдоселектора: http://jsfiddle.net/cYky9/

Ответ 9

Вы можете использовать следующий CSS для решения.

ul li { float: left; }
ul li:before { content: "|"; padding: 0 .5em; }
ul li:first-child:before { content: ""; padding: 0; }

Должен работать и на IE8 +.