Комментарии 81
Хорошая реализация.
Было бы неплохо еще и javascript легкий прикрутить, чтобы меню съезжалось/разъезжалось.
Было бы неплохо еще и javascript легкий прикрутить, чтобы меню съезжалось/разъезжалось.
Да я думал об этом, но я с ним ой мама родная, скока лет дела не имел уже — нужно время чтоб вспомнить или хотя бы посмотреть как jQuery приладить сюда.
Код с jquery:
$(document).ready(function () {
$('#multi-derevo li span').click(function () {
if (ul=$($('ul',this.parentNode)[0])) {
ul.toggle(300);
var em=$($('em',this)[0]);
em.hasClass('open')?em.removeClass('open'):em.addClass('open');
}
});
})
* This source code was highlighted with Source Code Highlighter.
Пардон, вместо $($('ul',this.parentNode)[0])) логичнее будет $('ul:first',this.parentNode), сразу не сообразил.
Еще одно изменение=)
Вот это:
if (ul=$('ul:first',this.parentNode)) {
я бы заменил на:
var ul=$('ul:first',this.parentNode);
if (ul.length) {
Вот это:
if (ul=$('ul:first',this.parentNode)) {
я бы заменил на:
var ul=$('ul:first',this.parentNode);
if (ul.length) {
Спасибо, надо будет привинтить )
Попробовал, для первого уровня все нормально, но для внутренних неверно срабатывает будто нажал на предыдущий узел.
Я так понимаю нужно toggle повесить на все узлы, но как в jQuery сделать это я пока не разобрался.
Я так понимаю нужно toggle повесить на все узлы, но как в jQuery сделать это я пока не разобрался.
Все вроде верно срабатывало… Ссылку дадите? И в каком браузере?
Можешь дять полный код, с поправками, что ты вносил?
Я думаю может как то не так или не туда засунул строки. Браузер любой.
Я думаю может как то не так или не туда засунул строки. Браузер любой.
Код который я добавлял в head страницы.
Под изменившийся ХТМЛ сейчас поправлю…
<script language="javascript" src="/jquery.pack.js"></script>
<script>
$(document).ready(function () {
$('#multi-derevo li span').click(function () {
var ul=$('ul:first',this.parentNode);
if (ul.length) {
ul.toggle(300);
var em=$($('em',this)[0]);
em.hasClass('open')?em.removeClass('open'):em.addClass('open');
}
});
})
</script>
* This source code was highlighted with Source Code Highlighter.
Под изменившийся ХТМЛ сейчас поправлю…
Жду поправленный. А то я никак не разберусь как мне от span перейти на уровень выше и к li добавить/удалить класс «open».
Блин, я заменил html на ваш новый, все свалилось=( Вы и css меняли? У меня просто времени разбираться особо не было…
В общих чертах, чтобы сменить класс для li yepyj заменить строчки
var em=$($('em',this)[0]);
em.hasClass('open')?em.removeClass('open'):em.addClass('open');
на
var li=$(this.parentNode);
li.hasClass('open')?li.removeClass('open'):li.addClass('open');
Должно работать.
В общих чертах, чтобы сменить класс для li yepyj заменить строчки
var em=$($('em',this)[0]);
em.hasClass('open')?em.removeClass('open'):em.addClass('open');
на
var li=$(this.parentNode);
li.hasClass('open')?li.removeClass('open'):li.addClass('open');
Должно работать.
Я пытался с разгону прямо сйчас переделать скрипт под измененный HTML, но чего-то никак не удается из-за того что мркер перместил из em в li родителя, как до него добраться не пойму.
Какой будет JS в случае такого HTML:
Какой будет JS в случае такого HTML:
<div id="multi-derevo">
<h4><a href="#">Ствол дерева</a></h4>
<ul>
<li class="marker open"><span><a href="#1" class="current" ><em></em>1. Ветка</a></span>
<ul>
<li class="marker"><span><a href="#11"><em></em>1.1. Ветка</a></span>
<ul>
<li><span><a href="#111">1.1.1. Листик</a></span></li>
<li><span><a href="#112">1.1.2. Листик</a></span></li>
</ul>
</li>
<li><span><a href="#12">1.2. Ветка</a></span></li>
</ul>
</li>
<li class="marker"><span><a href="#2"><em></em>2. Ветка</a></span></li>
<li class="marker"><span><a href="#3"><em></em>3. Ветка</a></span></li>
<li class="marker"><span><a href="#4"><em></em>4. Ветка</a></span></li>
<li class="marker last"><span><a href="#5" title="Послледняя ветка"><em></em>5. Ветка, верхушка</a></span>
<ul>
<li><span><a href="#1">5.1. Ветка</a></span></li>
<li><span><a href="#1">5.2. Ветка</a></span></li>
</ul>
</li>
</ul>
</div><!-- /multi-derevo -->
* This source code was highlighted with Source Code Highlighter.
Неэффективный код, вешает много обработчиков.
Лучше повесить один, на #multi-derevo (почему не tree????) ;) И обойтись без jquery.
Лучше повесить один, на #multi-derevo (почему не tree????) ;) И обойтись без jquery.
Почему не tree это не ко мне. Я согласен, что лучше повесить на один элемент обработчик и смотреть target, но 1) при небольшом количестве элементов тормозов не будет, 2) если тормозов нет, то эффективней ток код который проще написать. Согласитесь этот проще чем и читабильней, чем с проверками типа
var targetTagName=e.targetTagName;
switch (targetTagName) { ...
Можно конечно обойтись и без jquery, никаких проблем, просто код опять же станет не настолько интуитивно понятным, и писать его несколько дольше. Что для меня непростительная роскошь при комментировании на хабре)
var targetTagName=e.targetTagName;
switch (targetTagName) { ...
Можно конечно обойтись и без jquery, никаких проблем, просто код опять же станет не настолько интуитивно понятным, и писать его несколько дольше. Что для меня непростительная роскошь при комментировании на хабре)
а не tree, потому что для меня звучало неприятно оно и все :)
Все же на дереве с 200-300 элементами чувствую jquery будет просто тормозить при загрузке… не люблю я его. И лишние 40 Кб((
По поводу времени — не спорю и понимаю)) Но пусть молодежь тут не думает, что для каждой мелочи надоиспользовать именно его!
По поводу времени — не спорю и понимаю)) Но пусть молодежь тут не думает, что для каждой мелочи надоиспользовать именно его!
Проверил на 281м элементе LI, тормоза не заметны даже в IE6 =) (комп не очень хороший)
Кстати, если обработчик включить через $.live() то скорее всего он и повесится на один элемент.
В общем jquery уже не тот(в лучшую сторону).
Кстати, если обработчик включить через $.live() то скорее всего он и повесится на один элемент.
В общем jquery уже не тот(в лучшую сторону).
Почему я написал про jQuery, да потому что с ним сделать и показать СЕЙЧАС быстрее. В нем много уже сделано. Я не спорю что наверно оно будет 40кб тяжело кому-то, однако не всегда этот вопрос актуален.
Знаешь это вот как рисовать на доске, иногда быстрее нарисовать и рукой написать чем в графическом редакторе это делать. Вот и тут так берем велосипед и едем, кончено для данного конкретного примера мы не пользуемся ни 21 передачей этого велосипеда, ни вилкой с амортизаторами — зато нам не нужно этот велосипед собирать, чтобы прокатиться.
Вот такое вот сравнение )
Знаешь это вот как рисовать на доске, иногда быстрее нарисовать и рукой написать чем в графическом редакторе это делать. Вот и тут так берем велосипед и едем, кончено для данного конкретного примера мы не пользуемся ни 21 передачей этого велосипеда, ни вилкой с амортизаторами — зато нам не нужно этот велосипед собирать, чтобы прокатиться.
Вот такое вот сравнение )
Навскидку вам скажу, что код о котором вы говорите, состоял бы примерно из 70-100 строчек, вместо 9 здесь. И очень уж он зависит от используемых в проекте наработок (пусть даже своих).
Красивое решение
> Проверено в FF3, IE7, Opera 9, Google Chrome.
А в IE6 не работает?
А в IE6 не работает?
Не работает =/
Opera 9.60 build 10447
Opera 9.60 build 10447
Отечественная классика жанра
vitaly.harisov.name/example/simple-tree/
vitaly.harisov.name/example/tree/
vitaly.harisov.name/example/simple-tree/
vitaly.harisov.name/example/tree/
что за красота!
outline:none бы для ссылок добавили, а то не очень смотрится
4-й safari это не съел. Жаль.
Интересно. Поместил в избранное
весьма хороший код, если конечно не считать пустой спан с маркером (за бордер-арт конечно зачот :), очень хорошее применение) и отсутствие реагирования на :active
Отсутсвие реагирования на :active? А что хотелось бы видеть?
чтобы как-то реагировало. тут уже надо наверное смотреть по общей стилистике. а бы сделал чтобы оно выделялось жирным, хотя в данном случае жирным выделяется второй уровень, так что тут надо подумать как сделать лучше :)
Лады. Сделаю тогда что-нибудь.
В Firefox :active как-то не так срабатывает.
Сделал так:
Но в FF остается выделенным элемент, если ссылку выбрать, а потом переходить по TAB далее

Что б с этим сделать? Пока так оставил.
Сделал так:
a:active, a:focus {
color: #666;
background-color: #f4f4f4;
}
Но в FF остается выделенным элемент, если ссылку выбрать, а потом переходить по TAB далее

Что б с этим сделать? Пока так оставил.
Кстати для указания текущего пункта меню можно использовать стрелку & larr; (←) как доп. указатель на текущий пункт. Вот в моем комментарии на рисунке видно habrahabr.ru/blogs/css/55753/#comment_1500188.
Только естественно эту стрелочку придется или скриптом или сервером ставить, т.к. :after не везде поддерживается.
Только естественно эту стрелочку придется или скриптом или сервером ставить, т.к. :after не везде поддерживается.
Я в шоке. Я помню, что вы заранее оговорились, что картинки специально не используете, но я, наверное, погиб бы от оргазма мозга, если бы маркер раскрывающегося списка был через list-style-image.
Opera 10alpha build 1355 — работает, IE6SP2 — работает, IE8 (релиз) — работает.
IE5.5 — не работает
IE5.5 — не работает
Автор никак не освоит графический редактор?;) Хотя сама идея нравится. Маркер border'ом — это прикольно))
Это просто удобно. Потом оформление можно будет менять прямо из CSS. Кроме того, это быстрее грузится.
Жаль только, со сложным (например, градиентным) фоном это не взлетит.
Жаль только, со сложным (например, градиентным) фоном это не взлетит.
Автор кроме верстальщика уже более 5 лет делает сайты, при необходимости берет Fireworks и твроит когда надо.
Здесь цель обозначена — без картинок. Это, так сказать, тематическое направление у меня такое.
Здесь цель обозначена — без картинок. Это, так сказать, тематическое направление у меня такое.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Многоуровневое дерево с маркерами (только HTML, CSS, без Javascript)