0

0

实现水平滚动区域的双向滚动控制(支持向上/向下滚轮切换方向)

聖光之護

聖光之護

发布时间:2025-12-26 13:17:22

|

782人浏览过

|

来源于php中文网

原创

实现水平滚动区域的双向滚动控制(支持向上/向下滚轮切换方向)

本文解决水平滚动容器中无法向上滚动返回起始位置的问题,通过判断滚动方向与边界状态,精准控制 `scrollleft` 变化,确保用户既能向右浏览内容,也能顺畅向左返回起点。

在实现自定义水平滚动(如使用 wheel 事件监听并修改 scrollLeft)时,一个常见陷阱是:无条件执行 scrollLeft += evt.deltaY 会导致滚动“卡死”在最左或最右端——尤其当用户试图向上滚动(即 deltaY 浏览器可能因事件被持续拦截而失去垂直滚动能力,导致无法返回上方的 .container 区域。

根本原因在于:原始代码中 evt.preventDefault() 总是被调用,且 scrollLeft 被强制累加 evt.deltaY(一个负值),但未检查是否已达左边界(scrollLeft === 0)。这不仅造成无效操作,更关键的是——它劫持了所有 wheel 事件,使页面丧失原生垂直滚动能力,用户因此“被困”在 .info 区域,无法向上滚动回到顶部 .container。

✅ 正确解法是:仅在安全范围内允许水平滚动,并将其他情况交还给浏览器处理。以下是优化后的核心逻辑:

const scrollContainer = document.querySelector(".info");

scrollContainer.addEventListener("wheel", (evt) => {
  const scrollingDown = evt.deltaY > 0; // 向下滚动 → 向右滑动
  const isAtEnd = scrollContainer.scrollWidth <= scrollContainer.scrollLeft + scrollContainer.offsetWidth;
  const isAtStart = scrollContainer.scrollLeft === 0;

  // 仅当:(向下滚且未到最右) 或 (向上滚且未到最左) 时,才执行自定义水平滚动
  if ((scrollingDown && !isAtEnd) || (!scrollingDown && !isAtStart)) {
    evt.preventDefault();
    scrollContainer.scrollLeft += evt.deltaY;
  }
  // 其余情况(如已到起点却向上滚、或已到终点却向下滚)不 preventDefault,
  // 浏览器会自然触发页面垂直滚动,从而可返回顶部区域
});

? 关键要点说明:

白瓜AI
白瓜AI

白瓜AI,一个免费图文AI创作工具,支持 AI 仿写,图文生成,敏感词检测,图片去水印等等。

下载
  • scrollingDown 判断用户意图:deltaY > 0 表示鼠标滚轮向下(常规理解为“前进”),对应向右滚动;反之则向左。
  • isAtEnd 使用 scrollWidth
  • isAtStart 直接判断 scrollLeft === 0,确保左边界精准可控。
  • 不调用 preventDefault() 的场景会被浏览器接管,恢复原生垂直滚动,这是实现“可返回顶部”的技术核心。

? 额外建议:

  • 为提升体验,可添加 scroll-behavior: smooth 到 .info,让水平滚动更流畅;
  • 若需支持触摸板惯性滚动,建议结合 touch-action: none(谨慎使用,需确保不影响其他交互);
  • 在真实项目中,建议对 scrollContainer 做存在性校验,避免脚本报错:if (!scrollContainer) return;。

通过该方案,用户既能通过滚轮左右浏览 .content 序列,又能在任意时刻向上滚动,无缝返回顶部 .container 区域——真正实现水平滚动与页面整体垂直导航的和谐共存。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

743

2023.08.22

C++ 单元测试与代码质量保障
C++ 单元测试与代码质量保障

本专题系统讲解 C++ 在单元测试与代码质量保障方面的实战方法,包括测试驱动开发理念、Google Test/Google Mock 的使用、测试用例设计、边界条件验证、持续集成中的自动化测试流程,以及常见代码质量问题的发现与修复。通过工程化示例,帮助开发者建立 可测试、可维护、高质量的 C++ 项目体系。

9

2026.01.16

java数据库连接教程大全
java数据库连接教程大全

本专题整合了java数据库连接相关教程,阅读专题下面的文章了解更多详细内容。

32

2026.01.15

Java音频处理教程汇总
Java音频处理教程汇总

本专题整合了java音频处理教程大全,阅读专题下面的文章了解更多详细内容。

14

2026.01.15

windows查看wifi密码教程大全
windows查看wifi密码教程大全

本专题整合了windows查看wifi密码教程大全,阅读专题下面的文章了解更多详细内容。

42

2026.01.15

浏览器缓存清理方法汇总
浏览器缓存清理方法汇总

本专题整合了浏览器缓存清理教程汇总,阅读专题下面的文章了解更多详细内容。

6

2026.01.15

ps图片相关教程汇总
ps图片相关教程汇总

本专题整合了ps图片设置相关教程合集,阅读专题下面的文章了解更多详细内容。

9

2026.01.15

ppt一键生成相关合集
ppt一键生成相关合集

本专题整合了ppt一键生成相关教程汇总,阅读专题下面的的文章了解更多详细内容。

6

2026.01.15

php图片上传教程汇总
php图片上传教程汇总

本专题整合了php图片上传相关教程,阅读专题下面的文章了解更多详细教程。

2

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
如何进行WebSocket调试
如何进行WebSocket调试

共1课时 | 0.1万人学习

TypeScript全面解读课程
TypeScript全面解读课程

共26课时 | 5万人学习

前端工程化(ES6模块化和webpack打包)
前端工程化(ES6模块化和webpack打包)

共24课时 | 5.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号