Лучший способ отображения списка деревьев только с использованием только 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/
Ответы
Ответ 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>