原生JS三屏交互组件:一键收放与自动轮播实现
简介这份资源面向前端开发者与交互设计学习者聚焦「三屏效果 一键关闭、一键展开」这一常见界面交互模式适用于会议展示、产品介绍、数据可视化等需要分屏呈现信息的场景。包内共10个文件以6个html页面、2个js脚本、1个css样式表和1份docx说明文档为主压缩包约338KB结构轻量便于直接运行与二次修改。内容围绕HTML结构搭建、CSS响应式布局与过渡动画、JavaScript控制显隐与自动弹开逻辑展开并涉及焦点管理、无障碍访问及requestAnimationFrame性能优化等细节docx文档则补充了开发与设置说明。目前已有532人学习适合希望快速掌握分屏交互实现思路、对照源码理解完整逻辑的前端学习者参考。1. 三屏交互的真实需求从“堆三块 div”到一键收放很多前端开发者第一次接到“三屏效果”需求时脑子里蹦出来的方案就是横向排三个div加个overflow-x: auto就交差。但真正落地到会议展示、产品介绍页或者数据可视化大屏时问题立刻暴露用户想聚焦看某一屏时另外两屏占着横向空间想对比三屏数据时又得来回滚动。这个三屏.zip资源包里的threedemo目录给出的解法是“一键关闭、一键展开”加自动弹开——默认只露第一屏点击展开后三屏并排再点关闭收回同时支持定时轮播切换。它适合正在做前端页面大屏布局、需要快速复现一套可交互多屏结构的开发者尤其是手头有index.html、style.css、threedemo.js这套原生三件套、不想引入重型框架的场景。压缩包里还附了一份三屏开发与设置说明20211219.docx说明作者在交付时已经把配置项和调用方式整理过一轮不是扔一堆源码就完事。2. 拆开 threedemoHTML 骨架、CSS 状态机与 JS 定时器怎么配合2.1 三屏的 DOM 结构不是随便套三层 div打开index.html核心结构是三个并列的section每个section带一个screen类和一个独立的id外层包一个#three-screen-wrap作为定位和尺寸的锚点。这种写法的好处是CSS 可以直接用#three-screen-wrap .screen控制所有屏的公共样式用#screen-1、#screen-2、#screen-3做差异化处理。常见做法是给每个section内部再分两层一层放标题或缩略图一层放详细内容这样关闭状态下只显示标题层展开后详细内容才参与布局。!-- index.html 核心结构节选 -- div idthree-screen-wrap classis-collapsed section idscreen-1 classscreen div classscreen-head第一屏标题/div div classscreen-body第一屏详细内容/div /section section idscreen-2 classscreen div classscreen-head第二屏标题/div div classscreen-body第二屏详细内容/div /section section idscreen-3 classscreen div classscreen-head第三屏标题/div div classscreen-body第三屏详细内容/div /section button idtoggle-btn typebutton展开/button /div这里的关键参数是外层容器的is-collapsed类。它不控制单个屏的display而是控制整个包裹层的布局模式。展开时移除这个类三屏按flex或grid并排关闭时加上这个类只有#screen-1保持可见其余两屏通过transform: translateX或width: 0收起来。我一般会把is-collapsed作为唯一的状态开关避免在 JS 里同时操作多个屏的style.display那样后期加动画会非常痛苦。2.2 CSS 过渡与初始状态别让第一屏在加载时闪一下style.css里最值得抄的是初始状态的处理。很多实现直接写.screen { display: none; }然后 JS 加载后再显示第一屏结果页面会闪一下白。threedemo 的做法是在 CSS 里就把#screen-1设为opacity: 1; visibility: visible;其余两屏设为opacity: 0; visibility: hidden;同时给#three-screen-wrap加上transition: all 0.4s ease;。这样即使 JS 还没执行第一屏也是正常显示的不会出现内容跳动。/* style.css 状态与过渡节选 */ #three-screen-wrap { display: flex; gap: 16px; transition: all 0.4s ease; } #three-screen-wrap.is-collapsed .screen:not(#screen-1) { opacity: 0; visibility: hidden; width: 0; padding: 0; margin: 0; overflow: hidden; } #three-screen-wrap:not(.is-collapsed) .screen { opacity: 1; visibility: visible; flex: 1; } .screen { transition: opacity 0.3s ease, width 0.4s ease; }参数说明transition的0.4s是展开/关闭的动画时长太短会显得生硬太长会让用户觉得卡。gap: 16px是三屏之间的间距如果要做响应式可以在媒体查询里把flex-direction改成column同时把gap调小。注意width: 0和padding: 0必须同时写否则收起时仍会占位。overflow: hidden是为了防止内容在宽度收缩时溢出。2.3 JS 交互逻辑一键切换、自动弹开与定时器清理threedemo.js的核心只有三个函数toggleScreens()、startAutoPlay()、stopAutoPlay()。一键关闭/展开靠的是切换is-collapsed类自动弹开靠的是setInterval轮换当前激活的屏。这里有一个容易翻车的点自动轮播和手动展开会互相干扰。threedemo 的处理是用户点击展开或关闭按钮时先stopAutoPlay()再执行切换如果当前是展开状态且用户没有手动关闭则重新startAutoPlay()。// threedemo.js 交互逻辑节选 const wrap document.getElementById(three-screen-wrap); const toggleBtn document.getElementById(toggle-btn); let autoTimer null; let currentIndex 0; function toggleScreens() { stopAutoPlay(); const isCollapsed wrap.classList.toggle(is-collapsed); toggleBtn.textContent isCollapsed ? 展开 : 关闭; if (!isCollapsed) { startAutoPlay(); } } function startAutoPlay() { stopAutoPlay(); autoTimer setInterval(() { currentIndex (currentIndex 1) % 3; // 这里可以加高亮当前屏的逻辑比如切换 active 类 document.querySelectorAll(.screen).forEach((el, i) { el.classList.toggle(is-active, i currentIndex); }); }, 3000); } function stopAutoPlay() { if (autoTimer) { clearInterval(autoTimer); autoTimer null; } } toggleBtn.addEventListener(click, toggleScreens);逻辑说明toggleScreens先停掉定时器避免切换过程中自动轮播还在跑。classList.toggle返回布尔值直接用来判断当前是展开还是关闭比手动读className更稳。startAutoPlay里的3000是轮播间隔单位毫秒可以根据内容多少调整。stopAutoPlay里必须把autoTimer置为null否则下次startAutoPlay时clearInterval会拿到一个已经失效的 ID虽然不报错但逻辑上不干净。注意is-active类在 CSS 里可以配合box-shadow或border做当前屏高亮threedemo 的说明文档里提到过这个扩展点。3. 避坑与排查三屏效果从能跑到好用的五个坎3.1 展开后三屏宽度不均第三屏被挤扁现象点击展开后前两屏正常第三屏宽度明显小于其他两屏内容换行严重。原因flex: 1默认是flex: 1 1 0%但如果某个屏内部有固定宽度的元素比如一张width: 600px的图片它会撑开自身导致其他屏分到的空间变小。解决给.screen加上min-width: 0强制 flex 子项可以收缩到内容以下同时把内部图片改成max-width: 100%。3.2 自动轮播在用户点击关闭后仍在后台跑现象用户点了关闭三屏收起了但过几秒又自动展开或者高亮跳变。原因stopAutoPlay只在toggleScreens里调了一次但如果在其他地方比如窗口 resize也触发了startAutoPlay定时器会被重新创建。解决把autoTimer挂到模块级变量每次startAutoPlay前先执行stopAutoPlay并且只在展开状态下才允许启动。threedemo 的源码里就是这么写的但如果你自己改代码很容易漏掉 resize 监听里的清理。3.3 移动端上三屏并排导致横向滚动条现象在手机浏览器打开三屏展开后页面出现横向滚动条用户需要左右拖拽才能看全。原因flex布局在窄屏下仍然保持横向排列总宽度超过视口。解决在媒体查询里把#three-screen-wrap的flex-direction改成column同时把is-collapsed状态下的隐藏逻辑改成max-height: 0而不是width: 0。这样关闭时只露第一屏展开时三屏纵向堆叠符合移动端浏览习惯。3.4 过渡动画过程中点击按钮导致状态错乱现象快速连点展开/关闭按钮三屏会卡在中间状态或者按钮文字和实际状态对不上。原因CSStransition还在执行时JS 已经切换了类名浏览器需要重新计算布局如果此时再切换一次动画会叠加。解决在toggleScreens开头加一个isAnimating标志位动画期间忽略点击或者用wrap.addEventListener(transitionend, ...)在动画结束后再允许下一次操作。threedemo 的说明文档里建议用debounce但我更倾向于用标志位因为transitionend在多个属性过渡时会触发多次。3.5 无障碍访问缺失键盘用户无法操作现象用 Tab 键可以聚焦到按钮但展开后无法通过键盘在三屏之间切换焦点屏幕阅读器也读不出当前哪一屏是激活的。原因section没有加tabindex和aria-hidden按钮没有aria-expanded。解决给每个section加tabindex0在is-collapsed状态下给非第一屏加aria-hiddentrue按钮上加aria-expandedtrue/false并在 JS 里同步更新。这些属性不会影响视觉但能让辅助技术正确识别状态。4. 进阶技巧把三屏效果封装成可配置组件如果你不想每次做新页面都复制一遍threedemo的代码可以把它封装成一个接受配置项的构造函数。下面这个ThreeScreen类是我在 threedemo 基础上改的支持自定义轮播间隔、初始展开状态和切换回调。// 可配置的三屏组件封装 class ThreeScreen { constructor(options {}) { this.wrap document.querySelector(options.wrap || #three-screen-wrap); this.toggleBtn document.querySelector(options.toggleBtn || #toggle-btn); this.interval options.interval || 3000; this.startCollapsed options.startCollapsed ! false; this.onChange options.onChange || function() {}; this.autoTimer null; this.currentIndex 0; this.init(); } init() { if (this.startCollapsed) { this.wrap.classList.add(is-collapsed); this.toggleBtn.textContent 展开; } else { this.wrap.classList.remove(is-collapsed); this.toggleBtn.textContent 关闭; this.startAutoPlay(); } this.toggleBtn.addEventListener(click, () this.toggle()); } toggle() { this.stopAutoPlay(); const isCollapsed this.wrap.classList.toggle(is-collapsed); this.toggleBtn.textContent isCollapsed ? 展开 : 关闭; this.toggleBtn.setAttribute(aria-expanded, String(!isCollapsed)); if (!isCollapsed) { this.startAutoPlay(); } this.onChange(isCollapsed); } startAutoPlay() { this.stopAutoPlay(); this.autoTimer setInterval(() { this.currentIndex (this.currentIndex 1) % 3; this.wrap.querySelectorAll(.screen).forEach((el, i) { el.classList.toggle(is-active, i this.currentIndex); }); }, this.interval); } stopAutoPlay() { if (this.autoTimer) { clearInterval(this.autoTimer); this.autoTimer null; } } } // 调用示例 new ThreeScreen({ interval: 5000, startCollapsed: true, onChange: (collapsed) { console.log(当前状态, collapsed ? 已关闭 : 已展开); } });参数说明wrap和toggleBtn是选择器字符串方便在多个页面复用。interval控制轮播速度默认 3000 毫秒。startCollapsed决定初始是收起还是展开默认收起。onChange是状态切换后的回调可以用来埋点或者联动其他 UI。这个封装没有依赖任何框架直接放在threedemo.js后面就能用。如果你项目里用的是 Vue 或 React把classList.toggle换成响应式状态即可逻辑完全一样。验证方法打开index.html先确认初始只显示第一屏点击展开后三屏并排且间距均匀等待 5 秒看是否自动高亮切换再点击关闭确认收起且轮播停止。用手机浏览器打开检查是否变成纵向堆叠且没有横向滚动条。最后用 Tab 键走一遍确认按钮和每个屏都能聚焦。从那以后我每次做多屏交互都会先把状态类名和定时器清理逻辑写死再动 CSS 动画。这个三屏.zip里的threedemo虽然是个小 demo但把一键关闭、一键展开和自动弹开这三件事的边界处理得比较清楚适合拿来当起点改。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

MT53D LPDDR4规格书关键约束速查指南

MT53D LPDDR4规格书关键约束速查指南

简介:本资源为镁光(Micron)官方发布的LPDDR4/LPDDR4X内存芯片MT53D系列完整规格书PDF文档,面向嵌入式系统工程师、移动平台硬件设计人员及高速存储接口开发人员,用于深入理解低功耗双倍数据速率内存的电气特性、时序参…

2026/9/23 13:19:02 阅读更多 →
1060显卡多少钱:新手避坑指南与底层逻辑深度解析

1060显卡多少钱:新手避坑指南与底层逻辑深度解析

1060显卡多少钱:新手避坑指南与底层逻辑深度解析 面试被问原理答不上来,是不是让你瞬间冷汗直流?很多开发者刚入行时,面对硬件配置或底层机制的提问,往往因为只懂上层应用而卡壳,这种 新手避坑 的焦虑感我太熟悉了。…

2026/9/23 13:19:02 阅读更多 →
Java控制台图书管理系统:面向对象编程实践

Java控制台图书管理系统:面向对象编程实践

1. 项目概述这个基于Java控制台的图书管理系统是我在初学Java时完成的一个练手项目,它完美展现了面向对象编程的核心思想。系统通过区分管理员和普通用户两种角色,实现了图书的增删改查、借阅归还等基础功能。作为Java新手必做的经典项目之一&#xff0c…

2026/9/23 13:19:02 阅读更多 →

最新新闻

CAXA数控编程:解决机械加工行业用工荒的技术方案

CAXA数控编程:解决机械加工行业用工荒的技术方案

1. 项目背景与行业痛点在机械加工行业摸爬滚打十几年,最让我头疼的就是车间技术工人的招聘问题。上个月去人才市场摆摊招数控操作工,开出了比同行高15%的薪资,整整一天只收到3份简历,其中2个还是完全没经验的应届生。这种"用…

2026/9/23 14:01:59 阅读更多 →
SEW变频器调试全攻略:从开箱到PROFINET联调

SEW变频器调试全攻略:从开箱到PROFINET联调

简介:这份资源是面向工业自动化现场调试人员与电气工程师的SEW MoviFit变频器调试文档,聚焦大众VASS标准下的变频器配置与参数设定,适合具备一定驱动控制基础、需要上手专家模式调试的技术人员参考。压缩包内共1个pptx文件,约10.7…

2026/9/23 14:01:59 阅读更多 →
2026最新徐磊英语避坑指南:从语法到项目实战的5个致命陷阱

2026最新徐磊英语避坑指南:从语法到项目实战的5个致命陷阱

2026最新徐磊英语避坑指南:从语法到项目实战的5个致命陷阱 你是不是也这样:刷完了徐磊英语的所有语法课,单词背得滚瓜烂熟,可一旦让你独立搭个完整项目,脑子瞬间就空白?看着满屏的报错,连哪里下手修都不知道。这不仅是你的问题,也是2026最新…

2026/9/23 14:01:59 阅读更多 →
深度强化学习时序预测:从预测误差到决策收益的实战指南

深度强化学习时序预测:从预测误差到决策收益的实战指南

简介:深度强化学习与时间序列预测方向的学习者常面临理论多、可运行实例少的问题,此压缩包正好提供一个DRL预测项目。项目以DQN等经典算法为基础,结合正弦函数等模拟数据展示智能体如何通过与环境交互学习预测未来序列值,覆盖环境…

2026/9/23 14:01:59 阅读更多 →
从零搭建开源个人股票行情工作台:数据采集、存储与可视化实战

从零搭建开源个人股票行情工作台:数据采集、存储与可视化实战

我一直觉得,做投资研究最烦的不是没有想法,而是数据太散。今天想看看自选股的资金流,明天想复盘一下某只票的历史走势,后天又想把不同股票放在一个面板上对比——每一个需求都要单独开网站、单独查数据,时间全花在切换…

2026/9/23 14:01:59 阅读更多 →
CSS居中与空间分配全解析:从盒模型到Flex/Grid实战

CSS居中与空间分配全解析:从盒模型到Flex/Grid实战

1. 从一次布局翻车说起:为什么居中这么难刚入行那会儿,我接手了一个活动页的改版。设计稿上有一个卡片,要求水平垂直都居中,卡片里还有一行按钮,三个按钮要等宽平分整行。我当时心想,这有什么难的&#xff…

2026/9/23 14:00:58 阅读更多 →

日新闻

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A…

2026/9/23 0:00:23 阅读更多 →
2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我 刚把开发环境的显示器从1080P换到2K,跑老项目直接报错,版本升级后 API…

2026/9/23 0:01:25 阅读更多 →
3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点 官方文档翻了三遍还是云里雾里?别急,美眉图在实战项目中常被用来做数据可视化,但它的原理比你想的简单。今天咱们直接上手,用一个完整的小项目把美眉图跑通,不再死磕那些冗长的理论说明。…

2026/9/23 0:01:25 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/23 4:55:02 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/23 4:49:06 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/23 9:53:41 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/23 9:53:40 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/23 9:53:40 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/23 9:53:40 阅读更多 →