css响应式设计项目_制作一个自适应的多功能菜单

发布时间 - 2026-01-11 00:00:00    点击率:
响应式菜单应按容器宽度而非固定视口断点判断,用 container 查询或 48rem + 触摸媒体查询;flex-wrap 实现多行自适应,IE11 降级为 inline-block;汉堡菜单需同步 aria-expanded、hidden 及焦点管理;下拉菜单须 JS 控制并兼容触摸,预留 44×44px 热区。

@media 控制菜单断点,别硬套 768px

很多项目直接抄「max-width: 768px」做移动端菜单,结果在 iPad Pro(1024px 宽但常横屏)、Surface Go(1366px 但小屏)上体验割裂。真实做法是按容器而非视口判断:给菜单外层加 class="nav-container",用 container 查询或 JS 监听其宽度变化。纯 CSS 方案更稳——把断点设在 48rem(即 768px,但基于根字体大小),同时补一条 @media (hover: none) and (pointer: coarse) 捕获触摸设备,触发汉堡菜单。

display: flex + flex-wrap 实现多行自适应导航项

横向菜单撑出滚动条?说明没处理换行逻辑。主容器设 display: flex flex-wrap: wrap,子项用 flex: 1 1 calc(25% - 1rem)(四列布局,留间隙),再配合 min-width: 120px 防止单项过窄。注意:IE11 不支持 flex-wrap,若需兼容,得用 display: inline-block + text-align: justify 模拟,但会丢失对齐精度。

汉堡菜单的 aria-expanded 和焦点管理不能省

点击后菜单展开但屏幕阅读器不知道状态?必须同步操作 aria-expanded 属性和 hidden 属性。更关键的是焦点流:button 点击后,焦点要立刻移到第一个可聚焦元素(如首个 abutton),关闭时焦点需回到原触发按钮。漏掉这点,键盘用户会卡死在空白处。示例中用 document.querySelector('.nav-menu a, .nav-menu button').focus() 实现,但得加 try/catch 防止空节点报错。

const menuBtn = document.querySelector('[aria-controls="main-nav"]');
const menu = document.getElementById('main-nav');

menuBtn.addEventListener('click', () => { const isExpanded = menuBtn.getAttribute('aria-expanded') === 'true'; menuBtn.setAttribute('aria-expanded', !isExpanded); menu.hidden = isExpanded;

if (!isExpanded) { try { menu.querySelector('a, button').focus(); } catch (e) {} } });

悬停下拉菜单在触摸设备上会失效

:hover 触发的二级菜单,在 iOS 和 Android 上基本不可用——第一次点击只触发 hover,第二次才跳转。必须改用 JS 控制显隐,并用 touchstart + click 双事件绑定。同时加个 300ms 延迟判断是否为真点击(防误触),否则快速连点会闪退。另外,下拉区域要预留至少 44×44px 点击热区,否则手指点不中。

立即学习“前端免费学习笔记(深入)”;

响应式菜单最难的不是写样式,是判断「什么时候该收起」「谁该获得焦点」「触摸和悬停如何共存」——这些细节没测到真实设备上,代码就只是看起来能跑。


# css  # android  # js  # go  # ipad  # ai  # ipad pro  # ios  # 响应式设计  # try  # catch  # class  # pointer 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在IIS管理器中快速创建并配置网站?  如何正确下载安装西数主机建站助手?  非常酷的网站设计制作软件,酷培ai教育官方网站?  如何在万网ECS上快速搭建专属网站?  lovemo网页版地址 lovemo官网手机登录  如何在 React 中条件性地遍历数组并渲染元素  Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】  原生JS获取元素集合的子元素宽度实例  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  如何用IIS7快速搭建并优化网站站点?  Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门  Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】  Win11怎样安装网易有道词典_Win11安装词典教程【步骤】  VIVO手机上del键无效OnKeyListener不响应的原因及解决方法  中山网站制作网页,中山新生登记系统登记流程?  Laravel中的withCount方法怎么高效统计关联模型数量  如何在万网主机上快速搭建网站?  Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】  googleplay官方入口在哪里_Google Play官方商店快速入口指南  Laravel如何为API编写文档_Laravel API文档生成与维护方法  Laravel如何使用Service Container和依赖注入?(代码示例)  如何用VPS主机快速搭建个人网站?  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法  如何在不使用负向后查找的情况下匹配特定条件前的换行符  Laravel API资源类怎么用_Laravel API Resource数据转换  Android滚轮选择时间控件使用详解  英语简历制作免费网站推荐,如何将简历翻译成英文?  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  SQL查询语句优化的实用方法总结  Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】  Laravel如何升级到最新版本?(升级指南和步骤)  原生JS实现图片轮播切换效果  微信小程序 wx.uploadFile无法上传解决办法  Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)  详解CentOS6.5 安装 MySQL5.1.71的方法  如何在IIS中新建站点并解决端口绑定冲突?  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  Laravel如何配置Horizon来管理队列?(安装和使用)  消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工  Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】  如何在Ubuntu系统下快速搭建WordPress个人网站?  北京专业网站制作设计师招聘,北京白云观官方网站?  如何在Tomcat中配置并部署网站项目?  如何在阿里云香港服务器快速搭建网站?  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  香港服务器租用每月最低只需15元?  Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置  大连 网站制作,大连天途有线官网?