当前位置:首页 > HTML

h5实现穿透

2026-03-06 12:39:14HTML

H5 实现事件穿透

在移动端 H5 开发中,事件穿透通常指点击事件穿透到下层元素。常见场景如弹窗、遮罩层需要阻止底层页面滚动或点击。

使用 CSS 属性 pointer-events

通过 CSS 的 pointer-events 属性控制元素是否响应鼠标事件:

.overlay {
  pointer-events: none; /* 允许事件穿透 */
}
.mask {
  pointer-events: auto; /* 阻止事件穿透 */
}

动态控制穿透行为

通过 JavaScript 动态切换穿透状态:

document.getElementById('mask').addEventListener('click', function() {
  this.style.pointerEvents = 'none'; 
  setTimeout(() => { this.style.pointerEvents = 'auto'; }, 300);
});

阻止默认行为

对于滚动穿透,在 touchmove 事件中阻止默认行为:

document.body.addEventListener('touchmove', function(e) {
  if (document.querySelector('.modal-open')) {
    e.preventDefault();
  }
}, { passive: false });

弹窗场景处理

弹窗出现时给 body 添加固定定位:

body.modal-open {
  position: fixed;
  width: 100%;
}

通过 JavaScript 动态切换:

function openModal() {
  document.body.classList.add('modal-open');
  document.body.style.top = `-${window.scrollY}px`;
}

function closeModal() {
  const scrollY = document.body.style.top;
  document.body.classList.remove('modal-open');
  window.scrollTo(0, parseInt(scrollY || '0') * -1);
}

第三方库解决方案

使用专门解决穿透问题的库如 body-scroll-lock

h5实现穿透

import { disableBodyScroll, enableBodyScroll } from 'body-scroll-lock';

disableBodyScroll(document.getElementById('modal'));
enableBodyScroll(document.getElementById('modal'));

分享给朋友:

相关文章

h5实现单选框未勾选

h5实现单选框未勾选

实现单选框未勾选状态的方法 在HTML5中,单选框(<input type="radio">)默认未勾选。若需确保初始状态为未勾选或动态控制,可通过以下方式实现: 初始未勾选状态 直接使…

h5实现弹幕

h5实现弹幕

实现弹幕的基本原理 弹幕功能的核心在于动态创建并控制多个文本元素在屏幕上移动。通过HTML5的Canvas或CSS3动画可以实现弹幕效果。Canvas适合高性能需求,CSS3动画实现更简单。 使用C…

h5实现vr

h5实现vr

H5实现VR的基础方法 使用WebXR API结合Three.js等库实现VR效果。WebXR是WebVR的升级版,支持AR/VR设备访问。需要现代浏览器(Chrome、Firefox)支持,并通过W…

h5直播的实现方式

h5直播的实现方式

H5直播的实现方式 H5直播可以通过多种技术方案实现,主要包括基于WebRTC的实时直播、基于HTTP-FLV或HLS的流媒体直播以及第三方SDK集成方案。 基于WebRTC的实时直播 WebRTC…

h5实现扫一扫

h5实现扫一扫

使用HTML5实现扫一扫功能 在HTML5中实现扫一扫功能通常依赖于浏览器的摄像头API和第三方库。以下是几种常见的方法: 使用getUserMedia API访问摄像头 通过navigator.m…

h5实现拖拽

h5实现拖拽

实现拖拽的基本步骤 在HTML5中,拖拽功能可以通过拖拽事件和draggable属性实现。以下是一个简单的实现方式: <div id="dragElement" draggable="true…