Khi một elementoverlay (div che phủ) chặn sự kiện click đến element bên dưới, bạn có 2 cách giải quyết:
Cách 1: CSS pointer-events: none (Khuyên dùng)
.overlay {
pointer-events: none;
}
Element sẽ trở nên "vô hình" đối với sự kiện chuột (click, hover, drag...), sự kiện sẽ xuyên qua đến element bên dưới. Element con của overlay vẫn có thể bật lại bằng pointer-events: auto.
Cách 2: JavaScript - Chuyển tiếp sự kiện thủ công
- Lấy tọa độ click:
event.clientX,event.clientY. - Ẩn overlay tạm thời:
overlay.style.display = 'none'. - Dùng
document.elementFromPoint(x, y)để tìm element thật sự tại vị trí đó. - Kích hoạt click trên element đó (hoặc xử lý logic).
- Hiện lại overlay.
overlay.addEventListener('click', function(e) {
var x = e.clientX, y = e.clientY;
this.style.display = 'none';
var target = document.elementFromPoint(x, y);
this.style.display = '';
if (target) target.click(); // hoặc xử lý tùy ý
});
So sánh
| Tiêu chí | pointer-events: none | JS elementFromPoint |
|---|---|---|
| Độ phức tạp | Rất đơn giản (1 dòng CSS) | Phức tạp, cần xử lý nhiều trường hợp |
| Hiệu năng | Tốt nhất | Kém hơn (reflow/repaint khi ẩn/hiện) |
| Hỗ trợ trình duyệt | IE11+, tất cả modern | Tất cả |
| Cho phép con nhận event | Có (pointer-events: auto) | Khó kiểm soát |
Khuyến nghị: Luôn ưu tiên pointer-events: none trừ khi cần logic phức tạp không thể làm bằng CSS.