web移动端浮层滚动阻止window窗体滚动JS/CSS处理

在移动端,当有浮层出现时,我们通常会希望阻止底层的窗体(或页面)滚动。这可以通过使用JavaScript和CSS来实现。 HTML 结构:

html 复制代码
<div class="container">
  <button class="open-button">打开浮层</button>
  <div class="overlay">
    <div class="content">
      <!-- 浮层内容 -->
    </div>
  </div>
</div>

CSS 样式:

css 复制代码
.container {
  position: relative;
  height: 100vh; /* 设置容器高度为视口高度 */
  overflow: hidden; /* 防止底层内容溢出可视区域 */
}

.overlay {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: rgba(0, 0, 0, 0.5); /* 半透明黑色背景 */
  z-index: 9999; /* 确保浮层位于最顶层 */
  overflow-y: auto; /* 允许浮层内部内容滚动 */
}

.content {
  /* 浮层内容样式 */
}

JavaScript 代码:

javascript 复制代码
const openButton = document.querySelector('.open-button');
const overlay = document.querySelector('.overlay');

openButton.addEventListener('click', function() {
  overlay.classList.add('show'); // 显示浮层
  disableBodyScroll(); // 禁用窗体滚动
});

function disableBodyScroll() {
  document.body.style.overflow = 'hidden';
  document.addEventListener('touchmove', preventDefault, { passive: false });
}

function enableBodyScroll() {
  document.body.style.overflow = '';
  document.removeEventListener('touchmove', preventDefault);
}

function preventDefault(event) {
  event.preventDefault();
}

在上述示例中,我们首先使用CSS样式设置了容器的高度为视口高度,并给浮层添加了position: fixed;来固定它在页面上。同时,我们使用半透明黑色背景以及适当的z-index值来确保浮层在最顶层。

在JavaScript代码中,我们通过监听打开按钮的点击事件来显示浮层,并调用disableBodyScroll()函数来禁用窗体滚动。该函数通过将overflow属性设置为hidden来隐藏整个窗体的滚动条。然后,我们使用addEventListener来监听touchmove事件,并通过调用preventDefault()函数来阻止默认的滚动行为。

当需要关闭浮层时,你可以添加相应的关闭按钮,并在点击事件中调用enableBodyScroll()函数来恢复窗体的滚动。

重新写一个

HTML 结构:

html 复制代码
<div class="container">
  <button class="open-button">打开浮层</button>
  <div class="overlay">
    <div class="content">
      <!-- 浮层内容 -->
    </div>
  </div>
</div>

CSS 样式:

css 复制代码
.container {
  position: relative;
}

.overlay {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: rgba(0, 0, 0, 0.5);
  z-index: 9999;
  overflow-y: auto;
}

.content {
  /* 浮层内容样式 */
}

JavaScript 代码:

javascript 复制代码
const openButton = document.querySelector('.open-button');
const overlay = document.querySelector('.overlay');

openButton.addEventListener('click', function() {
  overlay.classList.add('show');
  disableBodyScroll();
});

function disableBodyScroll() {
  const scrollY = window.scrollY;
  document.body.style.position = 'fixed';
  document.body.style.top = `-${scrollY}px`;
  document.addEventListener('touchmove', preventDefault, { passive: false });
}

function enableBodyScroll() {
  const scrollY = parseFloat(document.body.style.top);
  document.body.style.position = '';
  document.body.style.top = '';
  window.scrollTo(0, Math.abs(scrollY));
  document.removeEventListener('touchmove', preventDefault);
}

function preventDefault(event) {
  event.preventDefault();
}

在这个续篇示例中,我们与之前的示例相比,对JavaScript代码进行了一些修改。具体来说:

  1. 在disableBodyScroll函数中,我们保存了窗体当前的滚动位置scrollY,然后将position属性设置为fixed并使用负值将top属性设为-${scrollY}px,从而固定整个窗体,并保持滚动位置不变。
  2. 在enableBodyScroll函数中,我们恢复了窗体的滚动。我们先通过parseFloat解析之前保存的滚动位置scrollY,然后将position属性和top属性重置为空字符串,并使用window.scrollTo()方法将窗体滚动到之前保存的位置。

通过这种方式,在浮层出现时,可以阻止底层窗体的滚动,同时保持滚动位置不变。当关闭浮层时,窗体的滚动行为将恢复原状。

相关推荐
Chrischaan30 分钟前
做 AI 塔罗小程序时,我为什么不让大模型自己抽牌:一次上线复盘
前端
骑着蜗牛撵大象3271 小时前
LangChain 工具调用从声明到闭环:给智能体接上真实的手脚
前端
数据掘金1 小时前
百度统计后台页面数据异常?从手动调用时机开始排查
前端
hunteritself1 小时前
10 层 4K 实时剪辑,国产工作站进入广电制作核心
大数据·前端·人工智能·深度学习·transformer
踩着两条虫1 小时前
我在浏览器里“盖”了一个村:Vue + Three.js 大屏开发踩坑记
前端·vue.js·three.js
mbshqqb1 小时前
TypeScript基础教程之同步生成器
前端·javascript·typescript
嘟嘟同学和妮妮同学2 小时前
【升级】一个中国历史可视化站:皇帝时间线梳理、古代思想流派、诗词鉴赏 (2)
前端·html
暗夜行者之光2 小时前
LangGraph + MCP 实战:构建"自然语言查数据"的 ChatBI Agent
前端·后端
一tiao咸鱼2 小时前
还在手动海投?我做了个 AI 求职助手,自动筛选 BOSS 职位再精准投递
前端·后端·面试
尤水就下2 小时前
🔥预热:在线文档的 block 架构是如何实现的(未完待续...)
前端·javascript·架构