#javascript #jquery #html #css #html-lists
#javascript #jquery #HTML #css #html-списки
Вопрос:
У меня есть html, подобный
<ul>
<li class="dropdown">text</li>
<li>text</li>
<li>text</li>
<li>text</li>
<li>text</li>
<li class="dropdown">text</li>
<li>text</li>
<li>text</li>
<li class="dropdown">text</li>
<li>text</li>
<li>text</li>
<li>text</li>
</ul>
CSS:
li {display:none;}
li.dropdown {display:block;}
Когда мы нажимаем на li.dropdown
, все <li>
классы без классов, от текущего до следующего li.dropdown
, должны стать видимыми. И противоположное действие, когда мы нажимаем на него снова — скрыть <li>
без класса dropdown
.
Как мне это сделать?
Ответ №1:
Правильным способом сделать это было бы с помощью подменю, поэтому:
<ul>
<li class="dropdown">text
<ul>
<li>text</li>
<li>text</li>
<li>text</li>
<li>text</li>
</ul>
</li>
etc...
</ul>
Затем вы можете сделать
$('li.dropdown').click(function() {
$(this).find('ul').slideToggle('slow');
});
В противном случае вам придется использовать nextUntil
:
$('li.dropdown').click(function() {
$(this).nextUntil('li.dropdown').slideToggle('slow');
});
Недостатком этого будет скрытие каждого из вложенных li
элементов по отдельности, а не в виде блока. Сделайте первое, если сможете.
Комментарии:
1. Я не могу изменить структуру html.
2. @Rooney Вы все еще можете изменить структуру HTML с помощью jQuery (если вам действительно нужно показать / скрыть их в виде блока). В противном случае nextUntil должен работать нормально.
Ответ №2:
Я бы рекомендовал использовать структуру вложенного списка, подобную этой:
<ul>
<li class="dropdown">text
<ul>
<li>text</li>
<li>text</li>
<li>text</li>
<li>text</li>
</ul>
</li>
<li class="dropdown">text
<ul>
<li>text</li>
<li>text</li>
</ul>
</li>
</ul>
Создайте CSS, подобный этому:
li.dropdown ul {
display : none;
}
И затем показывать / скрывать только вложенные неупорядоченные списки:
$('li.dropdown').click(function() {
$(this).children('ul').toggle();
});
Ответ №3:
Если у вас есть элемент в переменной $dropdown, вы можете использовать это:
$dropdown.next( "li:not(.dropdown)" ).hide();
Это скроет все not .выпадающие списки;
Чтобы сделать это до следующего выпадающего списка, вам нужно будет использовать:
$dropdown.next("li").each(...);
Ответ №4:
$("li.dropdown").click(function() {
$(this).nextUntil(".dropdown").toggle();
});