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 点击后,焦点要立刻移到第一个可聚焦元素(如首个 a 或 button),关闭时焦点需回到原触发按钮。漏掉这点,键盘用户会卡死在空白处。示例中用 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权限判定与策略规则配置
大连 网站制作,大连天途有线官网?

