You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于WebP地图的<area>坐标实现CSS悬停深色覆盖咨询

实现WebP地图区域悬停深色半透明效果(基于坐标)

需求背景

我正在制作奇幻地图项目,使用无损WebP格式的大地图。想要基于<area>标签的coords坐标制作CSS覆盖层,通过生成SVG实现仅在悬停对应区域时显示深色半透明效果。之前参考的教程都是基于SVG底图,但WebP转SVG工作量太大,现有HTML和CSS代码如下:

现有HTML代码

<div class="map">
      <img src="https://github.com/DylonKejhu/DylonKejhu.github.io/blob/main/resources/images/AurelisMap.webp" usemap="#image-map">
      <map name="image-map">
      <area target="" alt="DylonKejhu Union" title="DylonKejhu Union" href="/countries/dku.html" coords="3787,1099,3804,1126,3795,1183,3809,1223,3778,1263,3787,1298,3817,1303,3870,1347,3915,1351,3946,1338,3981,1316,4016,1320,4047,1307,4140,1276,4224,1294,4290,1303,4325,1303,4361,1289,4409,1272,4462,1267,4511,1232,4507,1188,4502,1161,4489,1099,4454,1068,4449,1033,4484,1007,4520,1007,4560,1015,4590,1020,4630,1011,4666,967,4696,958,4714,914,4776,861,4670,790,4643,773,4502,711,4462,715,4383,813,4325,816,4277,790,4228,790,4188,781,4162,746,4113,728,4074,728,4038,759,3954,834,3902,891,3857,900,3813,931,3774,953,3818,1010,3787,1046" shape="poly">
      </map>
</div>

现有CSS代码

.map {
     height: 750px;
     width: 100%;
     overflow: scroll;
     Border: 12px double black;
}

解决方案

无需将整个WebP转为SVG,只需在地图容器内添加SVG覆盖层,复用<area>的坐标即可实现悬停效果,步骤如下:

1. 修改HTML结构

在<img>和<map>之间添加SVG元素,用<polygon>复用<area>的coords作为points值:

<div class="map">
  <img src="https://github.com/DylonKejhu/DylonKejhu.github.io/blob/main/resources/images/AurelisMap.webp" usemap="#image-map">
  <!-- SVG覆盖层,用于悬停效果 -->
  <svg class="map-overlay">
    <polygon class="area-hover" points="3787,1099,3804,1126,3795,1183,3809,1223,3778,1263,3787,1298,3817,1303,3870,1347,3915,1351,3946,1338,3981,1316,4016,1320,4047,1307,4140,1276,4224,1294,4290,1303,4325,1303,4361,1289,4409,1272,4462,1267,4511,1232,4507,1188,4502,1161,4489,1099,4454,1068,4449,1033,4484,1007,4520,1007,4560,1015,4590,1020,4630,1011,4666,967,4696,958,4714,914,4776,861,4670,790,4643,773,4502,711,4462,715,4383,813,4325,816,4277,790,4228,790,4188,781,4162,746,4113,728,4074,728,4038,759,3954,834,3902,891,3857,900,3813,931,3774,953,3818,1010,3787,1046" />
  </svg>
  <map name="image-map">
    <area target="" alt="DylonKejhu Union" title="DylonKejhu Union" href="/countries/dku.html" coords="3787,1099,3804,1126,3795,1183,3809,1223,3778,1263,3787,1298,3817,1303,3870,1347,3915,1351,3946,1338,3981,1316,4016,1320,4047,1307,4140,1276,4224,1294,4290,1303,4325,1303,4361,1289,4409,1272,4462,1267,4511,1232,4507,1188,4502,1161,4489,1099,4454,1068,4449,1033,4484,1007,4520,1007,4560,1015,4590,1020,4630,1011,4666,967,4696,958,4714,914,4776,861,4670,790,4643,773,4502,711,4462,715,4383,813,4325,816,4277,790,4228,790,4188,781,4162,746,4113,728,4074,728,4038,759,3954,834,3902,891,3857,900,3813,931,3774,953,3818,1010,3787,1046" shape="poly">
  </map>
</div>

2. 更新CSS样式

调整容器定位,设置SVG覆盖层和悬停效果:

.map {
  height: 750px;
  width: 100%;
  overflow: scroll;
  border: 12px double black;
  position: relative; /* 让SVG覆盖层可以相对地图定位 */
}

/* SVG覆盖层:完全覆盖地图,点击穿透到下方area */
.map-overlay {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  pointer-events: none;
}

/* 区域样式:默认透明,允许悬停触发 */
.area-hover {
  fill: transparent;
  pointer-events: auto;
  transition: fill 0.3s ease; /* 平滑过渡效果 */
}

/* 悬停时显示深色半透明 */
.area-hover:hover {
  fill: rgba(0, 0, 0, 0.5);
}

关键说明

  • 直接复用<area>的coords作为SVG<polygon>的points,无需额外坐标转换
  • pointer-events属性确保SVG不拦截<area>的点击跳转功能,同时能触发悬停样式
  • 过渡动画让悬停效果更自然,可根据需求调整透明度(rgba最后一位)和过渡时长

内容的提问来源于stack exchange,提问作者DylonKejhu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 22:01:08