.img-block
, а у их самых дальних не общих предков, т.е., у .documents_block
. В этом случае не придётся переписывать js-код, если вдруг потребуется стилизовать ещё-что то, кроме .img-block
, или если решите изменить внутреннюю структуру .documents_block
. Вместо .класс
дополнительные стили надо будет прописывать у .класс .img-block
.const itemSelector = '.documents_block';
const buttonSelector = `${itemSelector} .open-doc-list`;
const contentSelector = '.documents-content';
const activeClass = 'active';
const toggleEffect = 'slideToggle'; // или fadeToggle, или toggle
const onClick = e => $(e.currentTarget)
.closest(itemSelector)
.toggleClass(activeClass)
.find(contentSelector)
[toggleEffect]();
// обработчик клика подключаем к кнопкам
$(buttonSelector).click(onClick);
// или, если предполагается добавление новых блоков уже после подключения
// обработчика, то лучше будет повесить его на документ, тогда всё будет
// работать как надо без каких-либо дополнительных действий
$(document).on('click', buttonSelector, onClick);
<span role="alert" class="wpcf7-not-valid-tip">Поле обязательно.</span>
wpcf7-not-valid-tip
wpcf7-response-output
<div class="wpcf7-response-output wpcf7-display-none wpcf7-validation-errors" style="display: block;" role="alert">Одно или несколько полей содержат ошибочные данные. Пожалуйста проверьте их и попробуйте ещё раз.</div>
где то ошибка о не заполненой форме отображается снизу в контейнере формы, где то она выходит за пределы этой формы, где то есть ошибка "Поле не заполнено", где то нет
if (window.innerHeight + document.documentElement.scrollTop ===
document.documentElement.offsetHeight) {
sliderInit();
}
element.isIntersecting
это будет загрузка всех стилей/скриптов слайдера и его инициализация.input
вместо change
.<TrainBox2 data={{title=" something text", term : "some term", term2 : "some term 2"}} />
<div className="one_floor_top">
<div className="floor_big">{props.data.title}</div>
<div className="floor_small">{props.data.term}</div>
<div className="floor_big">{props.data.title}</div>
<div className="floor_small">{props.data.term2}</div>
</div>
<TrainBox2
data={{title=" something text", term : "some term"}}
data2={{title=" something text", term : "some term"}}
/>
<div className="one_floor_top">
<div className="floor_big">{props.data.title}</div>
<div className="floor_small">{props.data.term}</div>
<div className="floor_big">{props.data2.title}</div>
<div className="floor_small">{props.data2.term}</div>
</div>
function interval(arr, delay, callback) {
let i = ~-arr.length;
return arr.length
? setInterval(() => callback(arr[i], arr[i = -~i % arr.length]), delay)
: null;
}
// или
function interval(arr, delay, callback) {
let timeoutId = null;
arr.length && (function step(i) {
timeoutId = setTimeout(() => {
callback(arr[i++], arr[i %= arr.length]);
step(i);
}, delay);
})(arr.length - 1);
return () => clearTimeout(timeoutId);
}
interval(
document.querySelectorAll('.banner-block'),
300,
(prev, curr) => {
prev.classList.remove('active');
curr.classList.add('active');
}
);
interval
, для первой версии передавать этот результат в clearInterval
, а для второй вызвать его. const str = 'Очень длинная строка';
if (str.length <= 200) {
document.querySelector('.button').style.display = 'none';
}