前端实战:滚动监听实现顶部 logo 平滑显隐效果

发布时间:2026/9/24 17:03:43
前端实战:滚动监听实现顶部 logo 平滑显隐效果 开发弹窗、侧边抽屉、全屏遮罩这类组件时经常会遇到一个问题弹窗弹出后底层页面依然可以滚动体验很差。常见方案就是控制body的滚动本文使用 jQuery 实现禁止页面滑动和恢复页面滑动同时说明坑点。核心原理修改body的overflow属性禁止滚动条阻止页面滚动。代码示例1. 禁止页面滚动// 禁止滚动 $(body).css(overflow, hidden);2. 恢复页面滚动// 恢复滚动就是你写的这句 $(body).css(overflow, auto);完整演示弹窗场景!DOCTYPE html html langzh-CN head meta charsetUTF-8 title禁止页面滚动演示/title script srchttps://cdn.jsdelivr.net/npm/jquery3.7.1/dist/jquery.min.js/script style .mask{ display: none; position: fixed; top:0;left:0; width:100%;height:100%; background: rgba(0,0,0,0.5); } /style /head body styleheight:2000px; button classopen打开弹窗禁止滚动/button div classmask button classclose关闭弹窗恢复滚动/button /div script // 打开弹窗禁止body滚动 $(.open).on(click, function(){ $(.mask).show(); $(body).css(overflow, hidden); }) // 关闭弹窗恢复body滚动 $(.close).on(click, function(){ $(.mask).hide(); $(body).css(overflow, auto); }) /script /body /html存在的问题重点滚动条消失页面会发生横向抖动overflow:hidden会直接隐藏滚动条页面宽度瞬间变大出现页面往右 “弹一下” 的抖动。解决思路禁止滚动时给 body 增加padding-right值等于滚动条宽度。// 获取滚动条宽度 function getScrollWidth(){ const div document.createElement(div); div.style.width 100px; div.style.height 100px; div.style.overflow scroll; div.style.position absolute; div.style.left -9999px; document.body.appendChild(div); const width div.offsetWidth - div.clientWidth; document.body.removeChild(div); return width; } // 禁止滚动 $(body).css({ overflow: hidden, paddingRight: getScrollWidth() px }); // 恢复滚动 $(body).css({ overflow: auto, paddingRight: 0px });移动端兼容性差在手机浏览器单纯设置body {overflow:hidden}经常失效手指依然可以上下拖动页面。移动端推荐搭配touchmove事件阻止。// 禁止移动端touch滚动 function preventTouch(e){ e.preventDefault(); } // 禁止滚动时绑定 document.addEventListener(touchmove, preventTouch, {passive:false}); // 恢复滚动时解绑 document.removeEventListener(touchmove, preventTouch);注意passive:false是新版浏览器要求否则无法执行e.preventDefault()页面滚动位置丢失设置overflow:hidden后部分浏览器会重置滚动位置。如果需要保留滚动位置需要额外记录scrollTop。其他方案对比表格方案优点缺点body overflow:hidden简单一行 jQuery 代码移动端失效、滚动条抖动固定定位 fixed 锁页面兼容性好需要记录保存 scrollTop阻止 touchmove 事件移动端效果好会禁止弹窗内部滚动总结PC 端简单场景直接使用//禁止 $(body).css(overflow,hidden) //恢复 $(body).css(overflow,auto)生产环境需要处理滚动条抖动移动端场景不能只靠 overflow必须配合 touchmove 事件。注意如果弹窗内部有滚动区域不能全局阻止 touchmove否则弹窗内部也无法滚动需要做事件判断

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询