# 信息窗体 (InfoWindow)
信息窗体用于在地图上弹出一个浮层,展示详细信息。它可以绑定到特定位置或覆盖物上。
## 基础用法
```javascript
// 1. 创建信息窗体
const infoWindow = new AMap.InfoWindow({
content: '
标题
这是信息窗体的内容
', // 支持 HTML 字符串或 DOM 元素
anchor: 'bottom-center', // 锚点位置: top-left, top-center, top-right, middle-left, center, middle-right, bottom-left, bottom-center, bottom-right
offset: new AMap.Pixel(0, -30), // 偏移量,避免遮挡标记
isCustom: false, // 是否自定义外观 (设为 true 则不显示默认边框和关闭按钮)
autoMove: true, // 是否自动调整地图视野使窗体可见
closeWhenClickMap: true, // 点击地图其他空白处关闭窗体
});
// 2. 打开信息窗体
infoWindow.open(map, [116.397, 39.909]); // 在指定位置打开
// 或者绑定点击事件
marker.on('click', function(e) {
infoWindow.open(map, e.target.getPosition());
});
```
## 自定义样式
如果将 `isCustom` 设为 `true`,则可以完全控制窗体的外观。
```javascript
const customInfoWindow = new AMap.InfoWindow({
isCustom: true,
content: createCustomContent(), // 返回一个 DOM 元素
offset: new AMap.Pixel(16, -45)
});
function createCustomContent() {
const div = document.createElement('div');
div.className = 'my-info-window';
div.innerHTML = `
高德地图
自定义样式的窗体
`;
return div;
}
// 需要手动实现关闭逻辑
window.closeInfoWindow = function() {
map.clearInfoWindow();
}
```
## 更新内容
```javascript
infoWindow.setContent('新的内容
');
infoWindow.setPosition([116.40, 39.90]);
```
## 配置项
| 参数 | 类型 | 默认值 | 说明 |
| :--- | :--- | :--- | :--- |
| content | String/HTMLElement | - | 内容,支持 HTML 字符串或 DOM 元素 |
| anchor | String | 'bottom-center' | 锚点位置 |
| offset | Pixel | - | 偏移量 |
| isCustom | Boolean | false | 是否自定义样式 |
| autoMove | Boolean | false | 是否自动调整地图视野 |
| closeWhenClickMap | Boolean | false | 点击地图其他区域是否关闭 |
| size | Size | - | 窗体大小 |
| avoid | Array | - | 避让的像素区域 |
### 锚点位置 (anchor)
- `top-left` - 左上
- `top-center` - 上中
- `top-right` - 右上
- `middle-left` - 左中
- `center` - 中心
- `middle-right` - 右中
- `bottom-left` - 左下
- `bottom-center` - 下中(默认)
- `bottom-right` - 右下
## 与标记配合使用
```javascript
const marker = new AMap.Marker({
position: [116.397, 39.909],
title: '点击查看详情'
});
map.add(marker);
const infoWindow = new AMap.InfoWindow({
content: 'POI 详情信息
',
offset: new AMap.Pixel(0, -30)
});
marker.on('click', function(e) {
infoWindow.open(map, e.target.getPosition());
});
```
## 自定义样式
设置 `isCustom: true` 完全控制窗体外观:
```javascript
const customInfoWindow = new AMap.InfoWindow({
isCustom: true,
content: createCustomContent(),
offset: new AMap.Pixel(16, -45)
});
function createCustomContent() {
const div = document.createElement('div');
div.className = 'custom-info-window';
div.innerHTML = `
`;
return div;
}
// 全局关闭方法
window.closeInfoWindow = function() {
map.clearInfoWindow();
};
```
### 自定义样式 CSS
```css
.custom-info-window {
background: #fff;
border-radius: 8px;
box-shadow: 0 4px 12px rgba(0,0,0,0.15);
min-width: 200px;
position: relative;
}
.info-header {
background: linear-gradient(135deg, #1890ff, #096dd9);
color: #fff;
padding: 12px 16px;
border-radius: 8px 8px 0 0;
display: flex;
justify-content: space-between;
align-items: center;
}
.info-title {
font-weight: 600;
}
.info-close {
cursor: pointer;
font-size: 18px;
width: 24px;
height: 24px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 50%;
}
.info-close:hover {
background: rgba(255,255,255,0.2);
}
.info-body {
padding: 16px;
}
.info-arrow {
position: absolute;
bottom: -8px;
left: 50%;
transform: translateX(-50%);
width: 0;
height: 0;
border-left: 8px solid transparent;
border-right: 8px solid transparent;
border-top: 8px solid #fff;
}
```
## 动态更新内容
```javascript
// 更新内容
infoWindow.setContent('新的内容
');
// 更新位置
infoWindow.setPosition([116.40, 39.90]);
// 获取当前位置
const position = infoWindow.getPosition();
// 获取是否打开
const isOpen = infoWindow.getIsOpen();
```
## 事件监听
```javascript
infoWindow.on('open', function() {
console.log('信息窗体已打开');
});
infoWindow.on('close', function() {
console.log('信息窗体已关闭');
});
infoWindow.on('change', function() {
console.log('信息窗体内容或位置已改变');
});
```
## 完整示例
```javascript
const map = new AMap.Map('container', {
zoom: 14,
center: [116.397, 39.909]
});
// POI 数据
const pois = [
{ name: '天安门', address: '北京市东城区', position: [116.397428, 39.90923] },
{ name: '故宫', address: '北京市东城区景山前街4号', position: [116.397026, 39.918058] },
{ name: '王府井', address: '北京市东城区', position: [116.410904, 39.913904] }
];
// 创建信息窗体
const infoWindow = new AMap.InfoWindow({
isCustom: true,
offset: new AMap.Pixel(0, -40)
});
// 添加标记
pois.forEach(poi => {
const marker = new AMap.Marker({
position: poi.position,
title: poi.name
});
marker.on('click', function(e) {
const content = `
`;
infoWindow.setContent(content);
infoWindow.open(map, e.target.getPosition());
});
map.add(marker);
});
// 全局方法
window.navigateTo = function(lng, lat) {
console.log('导航到:', lng, lat);
};
window.shareLocation = function(name) {
console.log('分享位置:', name);
};
```
## 关闭信息窗体
```javascript
// 方式一:调用 close 方法
infoWindow.close();
// 方式二:清除地图上的信息窗体
map.clearInfoWindow();
```
## 注意事项
1. **同时只能打开一个**: 地图上同时只能打开一个信息窗体
2. **自定义样式**: `isCustom: true` 时不显示默认的边框和关闭按钮
3. **偏移量**: 根据标记图标大小调整 offset,避免遮挡
4. **自动调整**: `autoMove: true` 可以自动调整地图视野使窗体可见
5. **事件冒泡**: 窗体内的点击事件需要阻止冒泡,否则可能触发地图点击事件