#html #css #angularjs
Вопрос:
Я пытаюсь создать всплывающее окно, в котором контейнер представляет собой просто черный фон с некоторой непрозрачностью, а затем этот контейнер div содержит содержимое всплывающего окна.
В основном это выглядит примерно так:
<button (click)="showPopup = !showPopup">Open popup</button>
<div class="overlay-bg" (click)="showPopup = !showPopup" [ngClass]="showPopup ? 'is-active' : ''">
<div class="content">Some content</div>
</div>
CSS выглядит примерно так:
.overlay {
width: 100vw;
height: 100vh;
background: rgba(0, 0, 0, 0.5);
display: grid;
position: fixed;
pointer-events: none;
opacity: 0;
amp;.is-active {
opacity: 1;
pointer-events: all;
}
.content {
width: 400px;
height: 400px;
place-self: center;
background: red;
}
}
Таким образом, в основном, когда состояние неактивно, оно не отображается, а когда is-active
оно включено нажатием кнопки, отображается наложение содержимое. Теперь я также хотел бы, чтобы при нажатии на фон всплывающее окно закрывалось, что и происходит. Однако проблема в том, что всплывающее окно также закрывается, когда я просто нажимаю на содержимое, чего не должно быть, поскольку оно должно быть несколько интерактивным.
Итак,как мне предотвратить закрытие всплывающего окна при взаимодействии с разделом содержимого ?
Комментарии:
1. Я не знаю, что это за синтаксис
(click)="showPopup = !showPopup"
, но если вы используете обычный javascript и добавляете обработчик событий, вы получитеevent
параметр. Проверьтеevent.target
, чтобы узнать, откуда произошло событие щелчка.if event.target === <overlay-bg-reference>
тогда только выполняйтеshowPopup = !showPopup
2. Можете ли вы воспроизвести проблему в stackblitz и поделиться ею здесь?
Ответ №1:
Проблема
Причина, по которой это происходит, связана с потоком событий в javascript, который представляет собой порядок обработки событий. Это важно, когда есть вложенные элементы, например, с вашими двумя разделами («наложение-bg» и «содержимое»). Современные браузеры используют пузырение событий, что означает, что самый внутренний дочерний элемент обрабатывает событие первым. Затем событие «пузырится» и выходит наружу. В вашем случае div «содержимое» должен сначала обработать событие. Вы не хотите, чтобы всплывающее окно исчезало при нажатии на раздел «содержимое», но вы делаете это при нажатии на раздел «наложение-bg». Поэтому вы должны найти способ предотвратить появление пузырьков события, зафиксировав его с помощью события onclick в разделе «содержимое». Это можно сделать с помощью stopPropagation()
метода объекта события.
Решение
Чтобы событие не всплывало вверх, когда пользователь нажимает на раздел «содержимое», добавьте обработчик события onclick в HTML:
<div class="content" onclick="preventBubbling(event)">Some content</div>
Затем с помощью JavaScript вы можете использовать stopPropagation()
метод объекта события, который передается в качестве параметра функции. Для достижения этой цели функция будет выглядеть следующим образом:
function preventBubbling(event) {
event.stopPropagation();
}
Это останавливает появление события в родительском div, поэтому событие щелчка никогда не запускается, а всплывающее окно не скрывается (когда пользователь нажимает на раздел содержимого).