news 2026/3/29 0:48:41

横向滚动上方列表查看进度条变化

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
横向滚动上方列表查看进度条变化
<!DOCTYPEhtml><html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport"content="width=device-width, initial-scale=1.0"><title>横向滚动列表与进度条</title><style>.container{width:80vw;margin:10px auto;box-sizing:border-box;}.list{width:80vw;height:100px;display:flex;overflow-x:auto;scroll-behavior:smooth;scrollbar-width:none;/* Firefox */-ms-overflow-style:none;/* IE/Edge */}.list::-webkit-scrollbar{display:none;/* Chrome/Safari/Opera */}.item{width:100px;height:100px;background-color:#4CAF50;color:white;display:flex;align-items:center;justify-content:center;font-size:18px;font-weight:bold;flex-shrink:0;border:1px solid #45a049;box-sizing:border-box;}.item:nth-child(even){background-color:#2196F3;}.item:nth-child(3n){background-color:#FF9800;}.progress-container{width:40vw;height:40px;margin:20px auto;position:relative;background-color:#e0e0e0;border-radius:5px;}.progress-box{width:10vw;height:100%;position:absolute;left:0;top:0;background-color:#f44336;border-radius:5px;transition:left0.1s ease-out;}.scroll-indicator{text-align:center;margin-top:10px;color:#666;font-size:14px;}</style></head><body><divclass="container"><divclass="list"id="listContainer"><divclass="item">Item1</div><divclass="item">Item2</div><divclass="item">Item3</div><divclass="item">Item4</div><divclass="item">Item5</div><divclass="item">Item6</div><divclass="item">Item7</div><divclass="item">Item8</div><divclass="item">Item9</div><divclass="item">Item10</div></div><divclass="progress-container"id="progressContainer"><divclass="progress-box"id="progressBox"></div></div><divclass="scroll-indicator">横向滚动上方列表查看进度条变化</div></div><script>document.addEventListener('DOMContentLoaded',function(){constlistContainer=document.getElementById('listContainer');constprogressBox=document.getElementById('progressBox');constprogressContainer=document.getElementById('progressContainer');// 设置进度条容器的宽度constcontainerWidth=progressContainer.offsetWidth;constprogressBarWidth=progressBox.offsetWidth;constmaxScrollLeft=listContainer.scrollWidth-listContainer.offsetWidth;// 总可滚动距离// 监听滚动事件listContainer.addEventListener('scroll',function(){// 计算滚动比例 (0 到 1)constscrollRatio=listContainer.scrollLeft/maxScrollLeft;// 计算进度条应移动的距离// 进度条的最大移动距离是容器宽度减去自身宽度constmaxProgressMove=containerWidth-progressBarWidth;constprogressPosition=scrollRatio*maxProgressMove;// 应用位置progressBox.style.left=`${progressPosition}px`;});// 初始化进度条位置progressBox.style.left='0px';});</script></body></html>

效果

这段 HTML + CSS + JavaScript 代码实现了一个横向滚动列表,并配合一个水平进度条来反映用户滚动的位置。下面从整体结构和核心逻辑两个方面进行解释。


🧩 整体结构说明

1.HTML 结构

  • .list:一个横向可滚动的容器,包含多个.item元素(共10个)。
  • .progress-container:一个固定宽度的灰色背景容器,用于显示进度条。
  • .progress-box:红色小方块,作为“进度指示器”,会随着滚动位置左右移动。

2.CSS 样式重点

  • .list设置了overflow-x: autoscroll-behavior: smooth,使其可以横向平滑滚动,并隐藏滚动条(通过各浏览器兼容写法)。
  • .item使用flex-shrink: 0确保不会被压缩,保持固定宽度。
  • .progress-box使用position: absolute定位在.progress-container内部,通过修改left值来移动。

⚙️ 核心逻辑解析(JavaScript 部分)

1.获取关键 DOM 元素

constlistContainer=document.getElementById('listContainer');constprogressBox=document.getElementById('progressBox');constprogressContainer=document.getElementById('progressContainer');

2.计算基础尺寸

constcontainerWidth=progressContainer.offsetWidth;// 进度条容器宽度(例如 40vw)constprogressBarWidth=progressBox.offsetWidth;// 进度条自身宽度(例如 10vw)constmaxScrollLeft=listContainer.scrollWidth-listContainer.offsetWidth;
  • maxScrollLeft是列表最多能向右滚动的距离(总内容宽度 - 可视区域宽度)。

3.监听滚动事件

listContainer.addEventListener('scroll',function(){constscrollRatio=listContainer.scrollLeft/maxScrollLeft;constmaxProgressMove=containerWidth-progressBarWidth;constprogressPosition=scrollRatio*maxProgressMove;progressBox.style.left=`${progressPosition}px`;});
🔍 关键公式:
  • 滚动比例
    scrollRatio = 当前滚动距离 / 最大可滚动距离
    → 范围是0 ~ 1(未滚动到滚到底)。

  • 进度条最大移动距离
    maxProgressMove = 容器宽度 - 进度条自身宽度
    → 因为进度条不能移出容器右边。

  • 进度条当前位置
    progressPosition = scrollRatio × maxProgressMove
    → 将滚动比例映射到进度条的移动范围。

✅ 这样就实现了:滚动列表时,红色进度条同步平滑移动,反映当前滚动进度

4.初始化位置

progressBox.style.left='0px';

确保页面加载时进度条在最左侧(对应未滚动状态)。


🎯 总结:核心思想

将横向滚动的“相对进度”(0% ~ 100%)线性映射到进度条在容器内的“绝对位置”

这种模式常用于:

  • 指示长内容的阅读/浏览进度
  • UI 中的导航辅助(如故事流、商品轮播)
  • 增强用户对可滚动区域长度的感知

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/28 9:39:48

(从零到万级节点) 云原生Agent的Docker批量部署架构设计全公开

第一章&#xff1a;云原生Agent批量部署的背景与挑战随着企业级应用向云原生架构迁移&#xff0c;微服务、容器化和动态编排成为主流技术范式。在这一背景下&#xff0c;监控、安全与运维类 Agent 需要在成千上万的节点上实现自动化部署与统一管理。传统的手动或脚本化部署方式…

作者头像 李华
网站建设 2026/3/23 3:45:17

【仅限专业人士】量子电路可视化导出的3个关键细节你忽视了吗?

第一章&#xff1a;量子电路可视化的导出格式在量子计算领域&#xff0c;可视化是理解与调试量子电路的关键环节。为了实现跨平台共享与进一步处理&#xff0c;将量子电路导出为标准化的可视化格式变得尤为重要。常见的导出格式包括LaTeX、QASM、SVG以及JSON结构化表示&#xf…

作者头像 李华
网站建设 2026/3/25 2:16:35

三分钟搭建专业歌词API:LrcApi快速部署完整教程

三分钟搭建专业歌词API&#xff1a;LrcApi快速部署完整教程 【免费下载链接】LrcApi A Flask API For StreamMusic 项目地址: https://gitcode.com/gh_mirrors/lr/LrcApi 还在为音乐应用开发中的歌词功能而烦恼吗&#xff1f;LrcApi作为一款基于Flask框架构建的轻量级歌…

作者头像 李华
网站建设 2026/3/28 23:15:33

【VSCode Jupyter量子编程实战】:掌握5大高效代码片段提升开发效率

第一章&#xff1a;VSCode Jupyter量子编程环境搭建与配置在现代量子计算开发中&#xff0c;VSCode 结合 Jupyter Notebook 提供了高效、直观的编程体验。通过集成 Python 与量子计算框架&#xff08;如 Qiskit&#xff09;&#xff0c;开发者可在本地快速构建和测试量子电路。…

作者头像 李华
网站建设 2026/3/27 12:34:42

os.path.dirname()用法

BASE_DIR os.path.dirname(os.path.dirname(os.path.abspath(__file__)))这行代码用于获取Python项目的根目录路径&#xff0c;具体解释如下&#xff1a;‌os.path.abspath(__file__)‌返回当前脚本文件&#xff08;__file__&#xff09;的绝对路径&#xff08;完整路径&#…

作者头像 李华
网站建设 2026/3/27 9:16:37

在Linux桌面环境中轻松部署Notion原生应用:notion-linux完整指南

在Linux桌面环境中轻松部署Notion原生应用&#xff1a;notion-linux完整指南 【免费下载链接】notion-linux Native Notion packages for Linux 项目地址: https://gitcode.com/gh_mirrors/no/notion-linux 作为一款革命性的知识管理工具&#xff0c;Notion以其"万…

作者头像 李华