0

0

如何实现可点击的垂直手风琴式导航组件

花韻仙語

花韻仙語

发布时间:2026-02-20 12:00:16

|

947人浏览过

|

来源于php中文网

原创

如何实现可点击的垂直手风琴式导航组件

本文介绍如何将基于 CSS :hover 的垂直布局改造为支持点击切换的 JavaScript 驱动手风琴组件,通过添加/移除 .selected 类控制展开状态,并提供简洁、现代、兼容性良好的实现方案。

本文介绍如何将基于 css `:hover` 的垂直布局改造为支持点击切换的 javascript 驱动手风琴组件,通过添加/移除 `.selected` 类控制展开状态,并提供简洁、现代、兼容性良好的实现方案。

在响应式网页设计与作品集展示场景中,垂直手风琴(Vertical Accordion)是一种高效利用空间、提升信息层级体验的交互模式。你当前使用纯 CSS :hover 实现了悬停展开效果,但用户期望更可靠、可预测的点击交互——尤其在触摸设备或无障碍访问场景下,click 比 hover 更具语义性与兼容性。

下面我们将以渐进增强方式,用轻量级原生 JavaScript 替换 :hover 逻辑,实现单击展开、其他项自动收起的“独占展开”行为,并同步优化 CSS 以符合现代标准。

✅ 核心实现思路

  • CSS 层:将原 li:hover 规则替换为 li.selected,定义展开时的 flex 值(如 30vw);
  • JS 层:为每个
  • 绑定 click 事件,点击时先清除所有 .selected 类,再为目标项添加该类;
  • 去冗余:移除已过时的 -webkit-、-moz-、-ms- 等厂商前缀(现代浏览器均已原生支持 flex 和 transition);
  • 结构健壮性:确保 HTML 中嵌套标签闭合正确(原示例存在多处未闭合的
    ,已修正)。

    ? 完整代码示例

    HTML(精简结构,语义清晰):

    <ul id="accordion">
      <li>
        <div class="projects">
          <a href="matilde/matilde.html">
            <div class="maintitle">Networked Infrastructures</div>
            <div class="subtitle">Three geographies (environmental, economic, political)</div>
            <img src="gif5.gif" alt="Project preview">
          </a>
        </div>
        <!-- 可继续添加多个 .projects -->
      </li>
      <li>Project 2</li>
      <li>Project 3</li>
      <!-- ... 其他 li -->
    </ul>

    CSS(现代化、精简、高可维护):

    Musico
    Musico

    Musico 是一个AI驱动的软件引擎,可以生成音乐。 它可以对手势、动作、代码或其他声音做出反应。

    下载
    body {
      width: 100vw;
      height: 100vh;
      margin: 0;
    }
    
    ul, li {
      margin: 0;
      padding: 0;
      list-style: none;
    }
    
    ul {
      display: flex;
      overflow: hidden;
      height: 100vh;
      width: 100vw;
    }
    
    li {
      overflow-y: auto;
      flex: 1;
      width: 8.3vw;
      height: calc(100% - 1%);
      transition: flex 500ms ease-out;
      padding: 20px;
      box-shadow: 2px 0px 4px -1px rgba(0, 0, 0, 0.66);
    }
    
    li.selected {
      flex: 30vw;
    }
    
    .projects {
      width: 100%;
      height: auto;
      margin-bottom: 5vh;
    }
    
    /* 文字与媒体样式保持不变 */
    a { text-decoration: none; color: black; }
    a:hover { opacity: 0.5; }
    .maintitle { font-size: 30px; text-transform: uppercase; font-family: Arial, sans-serif; }
    .subtitle { font-size: 20px; font-family: Arial, sans-serif; }
    img { padding-top: 20px; width: 25vh; height: auto; }

    JavaScript(无依赖、ES6+、防重复绑定):

    document.addEventListener('DOMContentLoaded', () => {
      const listItems = document.querySelectorAll('#accordion li');
    
      const unselectAll = () => {
        listItems.forEach(item => item.classList.remove('selected'));
      };
    
      listItems.forEach((item, index) => {
        item.addEventListener('click', () => {
          unselectAll();
          item.classList.add('selected');
        });
      });
    });

    ⚠️ 注意事项与最佳实践

    • 可访问性(a11y)增强建议:为
    • 添加 role="tab",对应内容区添加 role="tabpanel",并用 aria-expanded 和 aria-controls 关联状态,便于屏幕阅读器识别;
    • 移动端适配:若需支持 iOS Safari 点击穿透或延迟问题,可在
    • 上添加 cursor: pointer 并确保其有明确的 tabindex="0"(尤其当内容不可聚焦时);
    • 性能考量:本方案使用事件委托的简化版(直接绑定),适用于固定数量项;若列表动态增删,推荐改用事件委托至
    • 无限自动滚动?:题中提及的“infinite auto scroll”属于独立动效需求,不属手风琴核心逻辑。如需实现,建议用 scrollIntoView({ behavior: 'smooth' }) 或 CSS @keyframes + animation 配合 JS 控制,但需注意与手风琴交互的冲突,建议作为可选增强模块单独封装。

    ✅ 总结

    通过将 :hover 切换为 .selected 类 + 简洁的 DOM 事件控制,你获得了一个语义清晰、跨设备可用、易于维护的垂直手风琴组件。它不仅满足课程项目对交互可靠性的要求,也为后续扩展(如动画回调、加载状态、服务端集成)提供了良好基础。记住:好的交互组件 = 清晰的状态管理 + 最小化副作用 + 显式可测试行为。

    现在,只需将上述三段代码分别放入 .html、.css、.js 文件,即可立即运行一个专业级点击式垂直手风琴。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
es6新特性
es6新特性

es6新特性有:1、块级作用域变量;2、箭头函数;3、模板字符串;4、解构赋值;5、默认参数;6、 扩展运算符;7、 类和继承;8、Promise。本专题为大家提供es6新特性的相关的文章、下载、课程内容,供大家免费下载体验。

106

2023.07.17

es6新特性有哪些
es6新特性有哪些

es6的新特性有:1、块级作用域;2、箭头函数;3、解构赋值;4、默认参数;5、扩展运算符;6、模板字符串;7、类和模块;8、迭代器和生成器;9、Promise对象;10、模块化导入和导出等等。本专题为大家提供es6新特性的相关的文章、下载、课程内容,供大家免费下载体验。

196

2023.08.04

JavaScript ES6新特性
JavaScript ES6新特性

ES6是JavaScript的根本性升级,引入let/const实现块级作用域、箭头函数解决this绑定问题、解构赋值与模板字符串简化数据处理、对象简写与模块化提升代码可读性与组织性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

229

2025.12.24

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

524

2023.06.20

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

434

2023.07.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

594

2023.08.03

js是什么意思
js是什么意思

JS是JavaScript的缩写,它是一种广泛应用于网页开发的脚本语言。JavaScript是一种解释性的、基于对象和事件驱动的编程语言,通常用于为网页增加交互性和动态性。它可以在网页上实现复杂的功能和效果,如表单验证、页面元素操作、动画效果、数据交互等。

5689

2023.08.17

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

491

2023.09.01

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

776

2026.02.13

热门下载

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

精品课程

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

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