我用纯 JavaScript 和动画创建手风琴。问题是只有第一行按我的需要工作,其余的不打开:
let slideUp = (target, duration = 500) => {
target.style.transitionProperty = 'height, margin, padding';
target.style.transitionDuration = duration + 'ms';
target.style.boxSizing = 'border-box';
target.style.height = target.offsetHeight + 'px';
target.offsetHeight;
target.style.overflow = 'hidden';
target.style.height = 0;
target.style.paddingTop = 0;
target.style.paddingBottom = 0;
target.style.marginTop = 0;
target.style.marginBottom = 0;
window.setTimeout(() => {
target.style.display = 'none';
target.style.removeProperty('height');
target.style.removeProperty('padding-top');
target.style.removeProperty('padding-bottom');
target.style.removeProperty('margin-top');
target.style.removeProperty('margin-bottom');
target.style.removeProperty('overflow');
target.style.removeProperty('transition-duration');
target.style.removeProperty('transition-property');
}, duration);
}
let slideDown = (target, duration = 500) => {
target.style.removeProperty('display');
let display = window.getComputedStyle(target).display;
if (display === 'none')
display = 'block';
target.style.display = display;
let height = target.offsetHeight;
target.style.overflow = 'hidden';
target.style.height = 0;
target.style.paddingTop = 0;
target.style.paddingBottom = 0;
target.style.marginTop = 0;
target.style.marginBottom = 0;
target.offsetHeight;
target.style.boxSizing = 'border-box';
target.style.transitionProperty = "height, margin, padding";
target.style.transitionDuration = duration + 'ms';
target.style.height = height + 'px';
target.style.removeProperty('padding-top');
target.style.removeProperty('padding-bottom');
target.style.removeProperty('margin-top');
target.style.removeProperty('margin-bottom');
window.setTimeout(() => {
target.style.removeProperty('height');
target.style.removeProperty('overflow');
target.style.removeProperty('transition-duration');
target.style.removeProperty('transition-property');
}, duration);
}
let slideToggle = (target, duration = 500) => {
if (window.getComputedStyle(target).display === 'none') {
return slideDown(target, duration);
} else {
return slideUp(target, duration);
}
}
var accordionTitle = document.querySelector('.accordion-title');
accordionTitle.addEventListener('click', function () {
slideToggle(document.querySelector('.collapse'), 400);
accordionTitle.classList.toggle('collapsed');
});
.collapse:not(.show) {
display: none;
}
<div class="accordion-card">
<button class="accordion-title collapsed">
Значения параметров
</button>
<div class="collapse">
<p>
Аргумент должен соответствовать допустимой строке селектора, содержащей один или несколько селекторов. При указании нескольких селекторов необходимо разделять значения запятыми. Если по какой-то причине вы используете в наименовании селекторов символы,
которые не являются частью стандартного синтаксиса CSS, то при поиске такие символы должны быть экранированы с помощью символа обратной косой черты ("\"). Поскольку обратная косая черта также является специальным символом (escape) в JavaScript,
то при вводе литеральной строки ее необходимо экранировать дважды. Обязательный параметр.
</p>
</div>
</div>
<div class="accordion-card">
<button class="accordion-title collapsed">
Исключения
</button>
<div class="collapse">
<p>
Возникает в том случае, если синтаксис указанного селектора или селекторов некорректен.
</p>
</div>
</div>
<div class="accordion-card">
<button class="accordion-title collapsed">
Результат нашего примера:
</button>
<div class="collapse">
<p>
В этом примере с использованием атрибута событий onclick при нажатии на кнопку (HTML элемент) вызываем функцию myFunc(), которая с использованием JavaScript метода document.querySelectorAll() выбирает все элементы с классом block и инициализируем переменную
этим значением (объект NodeList). После этого мы проходим циклом по всем элементам этого массивоподобного объекта (объект NodeList) и устанавливаем зеленый цвет текста каждому элементу.
</p>
</div>
</div>
我确定问题出在这篇文章中:
accordionTitle.addEventListener('click', function () {
slideToggle(document.querySelector('.collapse'), 400);
accordionTitle.classList.toggle('collapsed');
});
行 varaccordionTitle = document.querySelector('.accordion-title'); 你只取第一个元素并在它上面挂一个点击监听器,这就是它发生的原因。您需要坚持一切,即使用 document.querySelectorAll 获取所有内容。在处理程序中,类似于通过https://developer.mozilla.org/ru/docs/Web/API/Node/nextSibling获取下一个元素(实际上需要折叠/展开)
一般来说,我稍微调整了你的代码