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

Лучший способ отображения списка деревьев только с использованием только CSS (без изображений или JS, пример внутри)

Я хочу отобразить что-то подобное на странице HTML: enter image description here

С ограничением использования только CSS. Основная проблема заключается в создании следующих: |└ ├ "ветвей".

Пример выше был решением, которое я сделал сам. Каждая ветвь имеет одинаковую ширину и состоит из:

<ul>
    <li></li>
    <li></li>
</ul>

Трюк состоит в том, чтобы соответствующим образом повернуть границы <li> черного. Изображение, чтобы показать это (просто быстрый макет) enter image description here

Проблема, с которой я столкнулся, превращает границу белого в соответствие с фоном вместо прозрачного (видимо, CSS имеет некоторые проблемы с прозрачными границами в списках).

Мой вопрос: какое самое простое решение? Есть ли лучший способ сделать это?

EDIT: некоторые требования:

  • Филиал должен иметь фиксированную ширину, но высота должна соответственно расти с высотой ячейки таблицы.
  • Два элемента li должны занимать половину высоты строки, каждая из которых такова, что - в всегда будет посередине.

EDIT2: http://en.wikipedia.org/wiki/Template:Tree_list провел небольшое исследование. Увы, они используют изображения для ветвей.

PS: по запросу http://jsfiddle.net/q3zdB/2/

4b9b3361

Ответ 1

Лучшее, что я могу придумать для этого, - это некоторые (к сожалению, прискорбные) вложенность и использование сгенерированного контента (поэтому для этого требуется довольно современный браузер, поэтому IE < 8 не будет выглядеть ужасно красиво), однако, что сказано, учитывая HTML:

ul {
  padding: 0;
  margin: 0;
  list-style-type: none;
  position: relative;
}
li {
  list-style-type: none;
  border-left: 2px solid #000;
  margin-left: 1em;
}
li div {
  padding-left: 1em;
  position: relative;
}
li div::before {
  content:'';
  position: absolute;
  top: 0;
  left: -2px;
  bottom: 50%;
  width: 0.75em;
  border: 2px solid #000;
  border-top: 0 none transparent;
  border-right: 0 none transparent;
}
ul > li:last-child {
  border-left: 2px solid transparent;
}
<ul>
  <li><div>Level 1</div></li>
  <li><div>Level 1</div>
    <ul>
      <li><div>Level 2</div></li>
      <li><div>Level 2</div>
        <ul>
          <li><div>Level 3</div></li>
          <li><div>Level 3</div></li>
        </ul>
      </li>
    </ul>
  </li>
  <li><div>Level 1</div></li>
</ul>

Ответ 2

Здесь вилка решения Дэвида устраняет необходимость в дополнительном <div> в каждом <li>:

ul {
  padding: 0;
  margin: 0;
  list-style-type: none;
  position: relative;
}
li {
  border-left: 2px solid #000;
  margin-left: 1em;
  padding-left: 1em;
  position: relative;
}
li li {
  margin-left: 0;
}
li::before {
  content:'┗';
  color: #000;
  position: absolute;
  top: -5px;
  left: -9px;
}
ul > li:last-child {
  border-left: 2px solid transparent;
}
<ul>
  <li>Level 1</li>
  <li>Level 1
    <ul>
      <li>Level 2</li>
      <li>Level 2
        <ul>
          <li>Level 3</li>
          <li>Level 3</li>
        </ul>
      </li>
    </ul>
  </li>
  <li>Level 1</li>
</ul>