←返回笔记列表
01 · NOTES / WebGIS 开发

第 04 节 · 弹窗与提示

下载源码包 ⭳
2026 年 9 月 1 日

第 04 节 · 弹窗与提示

📌 版本信息:Leaflet 1.9.4(2026-08-29 核对) 📚 来源:Leaflet Popup | Tooltip 🎯 点击要素后"看什么、怎么看":Popup(阻断详情)与 Tooltip(轻提示)的正确分工。

一、这一节的目标

  1. 精通 Popup:bindPopup / openPopup / 事件式打开 / 内容模板化
  2. 精通 Tooltip:三种方向、permanent 常显、sticky 跟随
  3. 掌握"Popup 内容里的交互"(HTML 按钮 + 事件委托)
  4. 完成点击查看详情页

二、Popup:详情面板

// ① bindPopup:绑定后点击要素自动弹出(最常用)
marker.bindPopup('<b>武汉站</b><br>京广铁路枢纽', {
  maxWidth: 300,          // 默认 300;宽内容调大
  minWidth: 120,
  autoPan: true,          // 打开时自动平移地图确保可见
  closeButton: true,
  autoClose: true,        // 打开新的关掉旧的(默认 true)
  className: 'my-popup',  // 挂 CSS 类(定制样式:圆角/主题色)
});

// ② 手动开关
marker.openPopup();  marker.closePopup();  map.closePopup();   // 关掉所有

// ③ 事件式打开:任意时机在任意坐标弹(不只是绑在要素上)
map.on('click', (e) => {
  L.popup().setLatLng(e.latlng)
    .setContent(`你点在:${e.latlng.lat.toFixed(5)}, ${e.latlng.lng.toFixed(5)}`)
    .openOn(map);        // openOn(map) = openOn 地图并自动管理关闭
});

// ④ 内容模板化:Popup 内容就是个 HTML 字符串——函数生成即可
function popupHtml(city) {
  return `<b>${city.name}</b><br>坐标:${city.lat.toFixed(3)}, ${city.lng.toFixed(3)}
          <br><button onclick="window.fav('${city.id}')">⭐ 收藏</button>`;
}
window.fav = (id) => alert('收藏 ' + id);   // Popup 里的按钮:全局函数 + 事件委托(无框架时的套路)

三、Tooltip:轻量提示

// 悬停显示、移开消失——不需要点击的轻信息用它
marker.bindTooltip('武汉站', { direction: 'top' });   // top/bottom/left/right/auto

// 两种特殊形态:
layer.bindTooltip('常驻文字', { permanent: true });    // 常显:不需要悬停(区域标注常用)
layer.bindTooltip('跟随', { sticky: true });           // 粘随鼠标(大面要素上鼠标在哪提示在哪)

// Vector 图层的默认:悬停显示(面/线上很好用)

分工口诀:Tooltip = 是什么(identity),Popup = 详情与操作(details & actions)。两者可同时绑:悬停看名字,点击看详情。


四、动手跟练:04 · 点击查看详情

配套文件:04-popup-tooltip 源码包(含 lib,解压后直接打开 index.html)

步骤:

  1. 数据:6 个城市 POI(name/lat/lng/人口/简介),渲染标记 + Tooltip(名称)+ Popup(详情卡:名称/人口/坐标 + "收藏"按钮)
  2. 完成 6 个 TODO:Tooltip direction 各方向试、permanent 常显标注、sticky 演示(在地图上点一下加个透明面)、Popup 自定义 CSS 类(暗色风格弹窗)、地图点击坐标 Popup(文档 ③ 的套路)、Popup 内收藏按钮(全局函数 + 页面侧"已收藏列表"联动)
  3. 观察:autoClose 行为(开新的关旧的)——真实项目里"多选对比"需求要设 autoClose: false

通关标准:

  • Tooltip/Popup 同时绑定且分工正确
  • Popup 内按钮交互走通
  • 三种 Tooltip 形态(方向/常显/粘随)都演示过

五、自测题

  1. Tooltip 与 Popup 的分工口诀?
  2. permanent 与 sticky 分别解决什么?
  3. Popup 内容里的按钮事件,无框架时的标准做法?
  4. openOn(map) 与 openLatlng 的区别?
  5. "多选对比"场景 Popup 要改哪个参数?

参考答案

  1. Tooltip 答"是什么",Popup 给"详情与操作"。
  2. permanent 免悬停常显(区域/路名标注);sticky 提示跟随鼠标(面状要素任意位置)。
  3. 内容字符串里放 onclick 调 window 上的全局函数(或委托到 document)——Popup 内容不在 React 的事件体系里。
  4. openPopup 配要素;L.popup().setLatLng().openOn(map) 用于任意坐标且由 Leaflet 统一管理关闭。
  5. autoClose: false(允许多个同时开)。

六、下一步

点得动了 → 第 05 节:GeoJSON 图层——真正的"数据上地图"(本模块含金量最高的一节)。