#javascript #html #css
#javascript #HTML #css
Вопрос:
Как мне остановить появление других модалов, когда уже открыт модальный.
Вот мой HTML:
<section class="portfolio">
<h1>Portfolio</h1>
<div class="projects">
<div data-modal="modal1">
<div>
<p>Coffee</p>
</div>
<img src="https://upload.wikimedia.org/wikipedia/commons/4/45/A_small_cup_of_coffee.JPG" alt="">
</div>
<div data-modal="modal2">
<div>
<p>Tea</p>
</div>
<img src="https://hips.hearstapps.com/hmg-prod.s3.amazonaws.com/images/tea-cup-bag-high-res-stock-photography-1570544677.jpg" alt="">
</div>
<div data-modal="modal3">
<div>
<p>Kava</p>
</div>
<img src="https://www.kanata-entreprises.com/wp-content/uploads/2014/03/the-tisanes.jpg" alt="">
</div>
</div>
<div class="project-card hidden" id="modal1">
<button class="close">X</button>
<div class="overlay">
<img src="https://upload.wikimedia.org/wikipedia/commons/4/45/A_small_cup_of_coffee.JPG" alt="">
</div>
</div>
<div class="project-card hidden" id="modal2">
<button class="close">X</button>
<div class="overlay">
<img src="https://hips.hearstapps.com/hmg-prod.s3.amazonaws.com/images/tea-cup-bag-high-res-stock-photography-1570544677.jpg" alt="">
</div>
</div>
<div class="project-card hidden" id="modal3">
<button class="close">X</button>
<div class="overlay">
<img src="https://www.kanata-entreprises.com/wp-content/uploads/2014/03/the-tisanes.jpg" alt="">
</div>
</div>
</section>
Вот js-код для открытия модального:
const coffeeGrounds = document.querySelectorAll('.projects > div[data-modal^=modal]');
const closeBtn = document.querySelectorAll('.close');
const allModals = document.querySelectorAll('.project-card');
// Open Modals
for (var i = 0; i < coffeeGrounds.length; i ) {
coffeeGrounds[i].addEventListener('click', function () {
var x = this.getAttribute('data-modal');
var a = document.getElementById(x);
a.setAttribute('style','display:block');
});
}
Вот код js, когда щелкните снаружи, чтобы закрыть модальный:
// when clicked outside to close the modal:
window.addEventListener('click', function(e) {
if (!e.path.some(x => x.className amp;amp; x.className.includes('project-card'))) {
allModals.forEach(x => x.style.display = 'none');
}
}, true)
Пожалуйста, любая помощь будет оценена. Не стесняйтесь оптимизировать мой код.
Вот визуальное представление: Codepen
Ответ №1:
Ну, вы могли бы взять свою закрытую модальную функцию, а затем просто применить ее, прежде чем показывать новую модальную. Итак, идея в том, чтобы — скрыть все модальные -> показать модальный x.
const coffeeGrounds = document.querySelectorAll('.projects > div[data-modal^=modal]');
const closeBtn = document.querySelectorAll('.close');
const allModals = document.querySelectorAll('.project-card');
const hideModals = (e) => {
if (!e.path.some(x => x.className amp;amp; x.className.includes('project-card'))) {
allModals.forEach(x => x.style.display = 'none');
}
};
// Open Modals
for (var i = 0; i < coffeeGrounds.length; i ) {
coffeeGrounds[i].addEventListener('click', function (e) {
hideModals(e);
var x = this.getAttribute('data-modal');
var a = document.getElementById(x);
a.setAttribute('style','display:block');
});
}
Комментарии:
1. Я пытался реализовать это, но по какой-то причине я не могу получить доступ к .path из функции. Можете ли вы применить это к Jsfiddle или Codepen.
2. Извините, я немного ввел вас в заблуждение. В моем примере я не передал событие вниз.
3. Отредактировано выше ^ Также пример codepen: codepen.io/POWERGLOVE/pen/qBaNPwz
4. ^ Обновлен Codepen. Насколько я понимаю, вы описываете маску. Я добавил один в примере. Итак, за активным модалом находится активная маска. Это обложка, которая блокирует все взаимодействия с вещами в фоновом режиме, пока она не будет отключена. Только когда он закрыт, вы можете снова взаимодействовать. Является ли этот опыт ожидаемым? Повторно прикрепленная ссылка, например: codepen.io/POWERGLOVE/pen/qBaNPwz
5. Рад слышать! Это скорее концепция, чем реальная функция. Короче говоря, это похоже на создание невидимого модала, который покрывает всю страницу, но находится за фактическим модалом, с которым вы взаимодействуете. Что он делает, так это создает невидимую стену, чтобы события мыши не проникали за ее пределы. Аналогичная альтернатива использованию event.stopPropagation() в JavaScript.