Синдикация
Как сделать древовидный список с помощью CSS
Сегодня мы рассмотрим урок по созданию древовидного списка, каждый из пунктов которого соединяется линиями.

Если не засорять код чем-то лишним, то в идеале он будет выглядеть следующим образом:
<ul class="tree">
<li>Продукты
<ul>
<li>Молочные
<ul>
<li>Молоко</li>
<li>Кефир</li>
</ul>
</li>
.
.
.
</ul>
По сути, это простой многоуровневый список. Единственная вещь, превращающая его его в “дерево” - класс tree, который мы присвоили <ul>. Без него список выглядит самым обычным образом:
- Продукты
- Молочные
- Молоко
- Ряженка
- Кефир
- Овощи
- Фрукты
- Молочные
- Столовые приборы
- Ложки
- Суповые
- Десертные
- Чайные
- Вилки
- Ложки
Избавляемся от “пуль”
Первое, что мы теперь должны сделать, это избавиться от так называемых “пуль” - точки, квадратики, кружочки и пр., расположенных напротив позиций списка. Для этого присваиваем list-style-type значение none.
ul.tree, ul.tree ul {list-style-type: none;}
Рисуем вертильные линии
Теперь необходимо нарисовать вертикальную прямую напротив каждого из пункта вне зависимости от уровня вложения. Для этого используем следующую картинку (ширина - 1px, высота - 10px):

vline.png
Прописываем ее фоном для списка <ul> и добавляем значение repeat-y, теперь картинка будет повторяться по оси y, тем самым создавая вертикальную прямую по высоте всего спика. Добавляем значение для margin и padding к <li>, тем самым красиво форматируя будущую структуру списка.
ul.tree, ul.tree ul {
list-style-type: none;
background: url(vline.png) repeat-y;
margin: 0;
padding: 0;
}
ul.tree ul {
margin-left: 10px;
}<strong>
</strong>ul.tree li {
margin: 0;
padding: 0 12px;
}
Объединяем
Используем фоном картинку с Т-образной линией для каждого из пунктов.

node.png
Устанавливаем значение line-height, равное высоте картинки. Для текса определяем цвет #369 и выделяем жирным bold.
ul.tree, ul.tree ul {
list-style-type: none;
background: url(vline.png) repeat-y;
margin: 0;
padding: 0;
}
ul.tree ul {
margin-left: 10px;
}
ul.tree li {
margin: 0;
padding: 0 12px;
line-height: 20px;
background: url(node.png) no-repeat;
color: #369;
font-weight: bold;
}
И последнее:)
Как видим, для последнего пункта требуется специальный стиль. Во-первых, в качестве фона будем использовать другую картинку:

lastnode.png
Во-вторых, вертикальная линия в списке должна заканчиваться на последней записи. Исправляем это следующим образом - устанавливаем для последней записи цвет фона (белый или тот, который используете). Таким образом, фоновый рисунок пункта списка перекроет фон всего списка, заменив последний сегмент вертикальной линии.
ul.tree, ul.tree ul {
list-style-type: none;
background: url(vline.png) repeat-y;
margin: 0;
padding: 0;
}
ul.tree ul {
margin-left: 10px;
}
ul.tree li {
margin: 0;
padding: 0 12px;
line-height: 20px;
background: url(node.png) no-repeat;
color: #369;
font-weight: bold;
}
ul.tree li.last {
background: #fff url(lastnode.png) no-repeat;
}
Браузер не знает, какая из записей последняя, поэтому прописываем класс last там, где это необходимо:
<ul class="tree">
<li>Animals
<ul>
<li>Birds</li>
<li>Mammals
<ul>
<li>Elephant</li>
<li<strong> </strong>class="last">Mouse</li>
</ul>
</li>
<li<strong> </strong>class="last">Reptiles</li>
.
.
.
</ul>
…если лень - используйте JavaScript, который сделает все сам:
<script type="text/javascript">
window.onload = function () {
var tree = document.getElementById("tree");
var lists = [ tree ];
for (var i = 0; i < tree.getElementsByTagName("ul").length; i++)
lists[lists.length] = tree.getElementsByTagName("ul")[i];
for (var i = 0; i < lists.length; i++) {
var item = lists[i].lastChild;
while (!item.tagName || item.tagName.toLowerCase() != "li")
item = item.previousSibling;
item.className += " last";
}
};
</script>
.
.
.
<ul class="tree"<strong> </strong>id="tree">
<li>Animals
<ul>
<li>Birds</li>
<li>Mammals
<ul>
<li>Elephant</li>
<li>Mouse</li>
</ul>
</li>
.
.
.
</ul>
Конечно, каждый раз добавлять класс last - это не лучший выход. Фактически, есть изящное решение данной проблемы - псевдо-класс :last-child. Чтобы использовать его, присваиваем данный селектор к классу last:
ul.tree li<strong>:</strong>last-child {
background: #fff url(lastnode.png) no-repeat;
}
К сожалению, данный псевдо-класс используется только в CSS3 и лишь некоторые браузеры его поддерживают.
*Вольный перевод статьи “Turning Lists into Trees”
22 апреля 2009 в 18:08
А что ссылку на оригинал - не дали-то?
[Ответить]
22 апреля 2009 в 23:46
О… Спасибо за ссылку! А то совсем из памяти выпало, где пример был.
[Ответить]
19 мая 2009 в 14:15
Довольно-таки познавательно.
[Ответить]
19 августа 2009 в 19:04
Блин, зашел по запросу Древовидные комментарии (( Ты случайно не знаешь как их сделать, а то плагин у меня глючит (урлов нет) ?
[Ответить]
ArtShok:
августа 19, 2009 в 22:56
Так вроде в последних версиях WordPress была поддержка древовидных комментов по умолчанию. Нет? Тока один плаггин знаю, пока материала больше не попадалось на глаза. Но если найду - свисну.
[Ответить]
Санёк:
августа 19, 2009 в 23:32
Там эта опция работает только в стандартной теме. Другие нужно как-то переделывать. У меня стоит плагин для древовидных каментов, но почему-то ссылки комментаторов вижу только я - другие ссылок не видят(((
[Ответить]
Санёк:
августа 19, 2009 в 23:33
Кстати, у тя что за плагин? Как у тебя реализованы древовидные комментарии?
[Ответить]
ArtShok:
августа 20, 2009 в 0:24
У меня Wordpress Thread Comment стоит
[Ответить]
Санёк:
августа 20, 2009 в 0:43
У меня тоже он, но бложек с ним не дружит ((
19 сентября 2009 в 23:08
А что для первого элемента не задали стиль?
ul.tree > li:first-child {
background: #FFF url(lastnode.png) no-repeat;
}
(если считать что браузер у нас знаком с css3)
[Ответить]