Модалы открываются, когда уже открыт модальный Javascript

#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.