JavaScript для верстальщика. Урок 09. Создание аккордеона 2
Продолжение предыдущей темы в котором рассматривается вариант,где блоки с контентом не лежат непосредственно под блоком с заголовком. Тогда, чтобы объяснить скрипту, какой блок нужно открыть при клике по данному заголовку используем уже известный по предыдущим урокам приём, когда блоку с контентом присваиваем уникальный id, а потом его же указываем в атрибуте href заголовка.
Код выглядит следующим образом
$(".js-faq-title").on("click", function(e) {
e.preventDefault();
var $this = $(this),
answerId = $this.attr("href");
if( !$this.hasClass("active") ) {
$(".js-faq-content").slideUp();
$(".js-faq-title").removeClass("active");
}
$this.toggleClass("active");
$(answerId).slideToggle();
});
Кстати, только сейчас я поняла зачем нужна была эпопея с присвоением и удалением открытому блоку класса active, о чём шла речь ещё в предыдущей теме. Так как строка $(".js-faq-content").slideUp(); закрывает все открытые блоки с контентом, то следующая строка $(answerId).slideToggle(); будет не переключать открытие блока (открытый закрыть, закрытый открыть) а всегда открывать блок, закрытый предыдущей строкой. Поэтому нам понадобилось на блок, который открываем, вешать переключатель класса $this.toggleClass("active"); и закрывать только те блоки, у которых такого переключателя нет.
if( !$this.hasClass("active") ) {
$(".js-faq-content").slideUp();
$(".js-faq-title").removeClass("active");
}
Код выглядит следующим образом
$(".js-faq-title").on("click", function(e) {
e.preventDefault();
var $this = $(this),
answerId = $this.attr("href");
if( !$this.hasClass("active") ) {
$(".js-faq-content").slideUp();
$(".js-faq-title").removeClass("active");
}
$this.toggleClass("active");
$(answerId).slideToggle();
});
Кстати, только сейчас я поняла зачем нужна была эпопея с присвоением и удалением открытому блоку класса active, о чём шла речь ещё в предыдущей теме. Так как строка $(".js-faq-content").slideUp(); закрывает все открытые блоки с контентом, то следующая строка $(answerId).slideToggle(); будет не переключать открытие блока (открытый закрыть, закрытый открыть) а всегда открывать блок, закрытый предыдущей строкой. Поэтому нам понадобилось на блок, который открываем, вешать переключатель класса $this.toggleClass("active"); и закрывать только те блоки, у которых такого переключателя нет.
if( !$this.hasClass("active") ) {
$(".js-faq-content").slideUp();
$(".js-faq-title").removeClass("active");
}