area标签不能直接作为按钮使用,必须嵌套在map元素内并与img的usemap属性匹配,且需确保img有明确尺寸、coords与原图分辨率一致;href跳转最轻量可靠,onclick需加return false防默认行为,响应式场景建议用CSS或SVG替代。

area 标签不能直接做按钮,必须配合 map 和 img
很多人试过直接把 area 写在页面里,点不动、没响应、控制台也没报错——因为 area 本身不渲染,也不触发点击事件,它只是图像映射的坐标定义。真正能被用户交互的,是套了 usemap 的 img 元素。浏览器根据 area 的 shape 和 coords 去识别鼠标落在哪一块区域,再触发对应链接或 JS 行为。
常见错误现象:area 写对了但完全没反应;用 display: block 强行显示 area(无效);给 area 绑定 onclick 却发现事件根本没注册上。
-
area必须嵌套在map元素内,且map的name必须和img的usemap值一致(注意:usemap值要带#前缀) -
img必须有明确尺寸(width/height或 CSS 固定),否则坐标计算会偏移 -
coords数值单位是像素,必须与原图分辨率匹配;缩放后的图片上坐标会失效
用 href 实现跳转型按钮群,比 JS 更轻量可靠
如果按钮群目标是跳转不同页面(比如导航菜单、产品分类入口),直接用 area 的 href 属性最稳妥——不用等 JS 加载,不依赖事件绑定,SEO 可抓取,移动端也原生支持点击反馈。
使用场景:后台管理页顶部功能区、老系统兼容需求、静态站点快速搭建。
立即学习“前端免费学习笔记(深入)”;
<img src="menu.png" usemap="#mainmap" alt="功能菜单"> <map name="mainmap"> <area shape="rect" coords="10,10,100,40" href="/dashboard" alt="仪表盘"> <area shape="circle" coords="150,25,20" href="/users" alt="用户管理"> <area shape="poly" coords="200,10,280,10,280,40,200,40" href="/settings" alt="设置"> </map>
-
shape支持rect(左上x,y + 右下x,y)、circle(圆心x,y + 半径)、poly(多边形顶点 x,y,x,y…) - 所有
coords必须是整数,小数会导致部分浏览器忽略该区域 -
alt不可省略,影响可访问性和部分屏幕阅读器行为
用 onclick 触发 JS 功能时,别漏掉 return false
当需要执行 JS(比如弹窗、表单提交、状态切换),给 area 加 onclick 是可行的,但默认行为可能干扰预期——例如 href="#" 会触发页面跳到顶部,href="javascript:void(0)" 在某些环境有兼容问题。
性能影响:每个 area 都绑独立函数会增加内存占用;不如统一监听 img 的 click,再用 event.target 判断来源区域。
- 推荐写法:
<area shape="rect" coords="0,0,100,30" onclick="doAction('save'); return false;"> - 更健壮的替代方案:给
img绑click,用document.elementFromPoint(x, y)或预存区域数据做坐标判断 - 移动端要注意:部分 iOS Safari 对
area点击区域识别较窄,建议coords留出至少 5px 边距
响应式适配难,优先考虑 CSS 方案替代
area 的坐标是绝对像素值,一旦图片缩放、容器变宽、视口切换,所有 coords 就失效——这不是 bug,是设计使然。强行用 JS 监听 resize 并重算坐标,代码复杂、性能差、易出错。
容易被忽略的地方:设计师给的切图是 @2x,但你按 1x 尺寸写 coords;或者用了 background-image 替换 img,结果 area 完全失联。
- 真要响应式,改用 SVG
<use>+viewBox,或纯 CSS 的position: absolute按钮层叠在图片上 - 若必须用
area,确保图片用max-width: 100%+height: auto,且所有coords按原始分辨率编写,禁用任何 CSS 缩放 - 测试时务必在真实设备横竖屏切换下验证点击热区是否偏移



















