HTML
Предполагая, что HTML является чередующимся шаблоном схем .question
и .answer
.
<ul class="faq">
<li class="question">...</li>
<li class="answer">...</li>
...
</ul>
Сузить основной селектор до .faq
. $("body")
и $(document)
должны использоваться для определенных событий, таких как "key"
или "load"
типы событий - не распространенные события, такие как "click"
.
jQuery
Второй параметр event.data
используется для обозначения this
(в этом случае также event.target
). В приведенном ниже примере .question
- это this
:
$('.faq').on('click', '.question', function(event) {...
Ссылка $(this).next('.answer')
с переменной. Переменная, ссылающаяся на jQuery Объект, обычно имеет префикс $
(рекомендуется, но не обязательна).
let $answer = $(this).next('.answer');
Требуемое поведение - это поведение аккордеона :
Если щелкнуть элемент из нескольких одинаковых элементов одного элемента (.question
, то есть this
или event.target
), произойдет открывать (и / или связанный с ним элемент - $answer
), если он был изначально закрыт, и наоборот.
$answer.slideToggle(250).toggleClass('active');
$(this).toggleClass('active');
Все родственные элементы закроются с исключение this
(и связанных элементов, если применимо). Исключение можно выбрать с помощью метода .not()
.
$('.question').not(this).removeClass('active')
$('.answer').not($answer).slideUp(250).removeClass('active');
'shopify:block:select/deselect'
- это нестандартные события, уникальные для Shopify платформа. Не уверен на 100%, сработает ли следующее, но если их можно делегировать с помощью метода .on()
, то, вероятно, его можно запустить с помощью метода .trigger()
.
if ($(this).hasClass('active')) {
$answer.trigger('shopify:block:select');
$('.answer').not($answer).trigger('shopify:block:deselect');
} else {
$('.answer').trigger('shopify:block:deselect');
}
Демо
$(function() {
$('.answer').hide();
$('.faq').on('click', '.question', function(e) {
let $answer = $(this).next('.answer');
$answer.slideToggle(250).toggleClass('active');
$(this).toggleClass('active');
$('.question').not(this).removeClass('active');
$('.answer').not($answer).slideUp(250).removeClass('active');
if ($(this).hasClass('active')) {
$answer.trigger('shopify:block:select');
$('.answer').not($answer).trigger('shopify:block:deselect');
} else {
$('.answer').trigger('shopify:block:deselect');
}
});
});
:root {
font: 400 3vw/6vh Arial
}
li {
padding: 3vh 2vw 1vh;
margin-bottom: 2vh
}
.question {
cursor: pointer
}
.answer {
list-style: none;
color: blue
}
.active {
text-decoration: underline;
font-weight: 900
}
<main>
<section>
<header>
<h1>FAQ</h1>
</header>
<ul class='faq'>
<li class='question'>Question?</li>
<li class='answer'>Answer.</li>
<li class='question'>Question?</li>
<li class='answer'>Answer.</li>
<li class='question'>Question?</li>
<li class='answer'>Answer.</li>
<li class='question'>Question?</li>
<li class='answer'>Answer.</li>
<li class='question'>Question?</li>
<li class='answer'>Answer.</li>
</ul>
</section>
</main>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>