百度地图-点击覆盖物自定义div弹窗

1.创建地图

var map = new BMap.Map("container");    
var point = new BMap.Point(116.404, 39.915); //中心点 
map.centerAndZoom(point, 15);    
var marker = new BMap.Marker(point);        // 创建标注    
map.addOverlay(marker);  
this.map=map
this.test()

2.创建一个图片覆盖物点击显示div弹窗

 mounted() {
 	//弹窗div上onclick的方法,需要挂载到window上面,全局访问
    window["closeDiv"] = (e) => {
      this.closeDiv(e); // 这个也就是我定义的方法
    };
 },
test() {
  let self = this;
  let point = new BMapGL.Point(116.404, 39.915);
  var myIcon = new BMapGL.Icon("/img/shexiangtou.png",new BMapGL.Size(80, 80));
  // 创建标注对象并添加到地图
  var marker = new BMapGL.Marker(point, { icon: myIcon });
  self.map.addOverlay(marker);
  //添加覆盖物点击事件
  marker.addEventListener("click", (e) => {
     self.imgClick(e);
  });
  //展现的div html通用模板
  //1.click事件只能用原生的onclick,不能用vue的@click,而且方法必须挂载在window上,否则就是underfind 找不到methods里的方法
  //2.class的样式,放在style里,不能加scope,要全局的
  let strHtml = `<div class="content"><div class='title' style="color:#fff">{{title}}<span onclick=closeDiv({{mapId}}) >x</span></div><div class='content'>{{content}}</div></div>`;

    self.$nextTick(() => {
        createDiv();
    });

    // 创建地图上点击图片要显示的内容信息
    function createDiv() {
      //可用for循环创建多个
        let pixel = self.map.pointToOverlayPixel(point); // 获取地图上点的位置坐标left, top
        let div = document.createElement("div");
        let html = "";
        //替换想要的数据
        html = strHtml
          .replace("{{title}}", "嘻嘻嘻嘻")
          .replace("{{mapId}}", "MAP1");

        // 修改样式
        div.id = "MAP" + 1;// "MAP" + i 循环情况
        div.style.backgroundColor = "#EE5D5B";
        div.style.display = "none";
        div.style.border = "1px solid #BC3B3A";
        div.style.position = "absolute";
        div.style.height = "200px";
        div.style.width = "200px";
        div.style.fontSize = "20px";
        div.style.wordWrap = "break-word";
        div.style.left = pixel.x + "px";
        div.style.top = pixel.y + "px";
        div.innerHTML = html;

        self.map.getPanes().labelPane.appendChild(div); // 将生成的div添加到百度地图
        self.map.addOverlay(div);
      }
    },
    //点击x关闭弹窗
closeDiv(a) {
   let map1 = document.getElementById(a.id);
   map1.style.display = "none";
},
  //覆盖物点击出现弹窗
imgClick(e) {
    // document.querySelector("#MAP" + 1).style.display = "block";
   let map1 = document.getElementById("MAP1");
   map1.style.display = "block";
    },

缺点:弹窗无法根据地图缩放移动,建议使用infoBox.js
百度地图自定义弹窗infoBox

### 实现 Vue-Baidu-Map 点击撒点后弹窗展示信息的方法 要在 `vue-baidu-map` 中实现点击地图上的撒点后弹窗展示信息的功能,可以通过以下方式完成: #### 1. 使用 `<bm-marker>` 组件绑定自定义事件 通过 `<bm-marker>` 的 `@click` 事件监听用户的点击操作,并动态设置信息窗口的位置和内容。 ```html <template> <baidu-map class="map-class" :center="mapCenter" :zoom="mapZoom"> <!-- 定义标记 --> <bm-marker v-for="(marker, index) in markers" :key="index" :position="{lng: marker.lng, lat: marker.lat}" @click="showInfoWindow(marker)" /> <!-- 信息窗口 --> <bm-info-window :position="infoWindowPosition" :title="infoWindowTitle" :content="infoWindowContent" :show="isInfoWindowShow" @close="hideInfoWindow()" > </bm-info-window> </baidu-map> </template> <script> export default { data() { return { mapCenter: { lng: 116.404, lat: 39.915 }, mapZoom: 15, markers: [ { lng: 116.404, lat: 39.915, content: '这是第一个位置' }, { lng: 116.407, lat: 39.918, content: '这是第二个位置' } ], infoWindowPosition: null, infoWindowTitle: '', infoWindowContent: '', isInfoWindowShow: false }; }, methods: { showInfoWindow(marker) { this.infoWindowPosition = { lng: marker.lng, lat: marker.lat }; // 设置信息窗口位置 this.infoWindowTitle = '位置详情'; // 设置信息窗口标题 this.infoWindowContent = marker.content; // 设置信息窗口内容 this.isInfoWindowShow = true; // 显示信息窗口 }, hideInfoWindow() { this.isInfoWindowShow = false; // 隐藏信息窗口 } } }; </script> <style scoped> .map-class { width: 100%; height: 500px; } </style> ``` 此代码实现了当用户点击某个标记时,会触发 `showInfoWindow` 方法[^1]。该方法负责更新信息窗口的相关数据并将其显示出来。 --- #### 2. 自定义覆盖物 (Overlay) 如果需要更复杂的交互效果或者样式控制,可以使用百度地图自定义覆盖物功能 (`bm-overlay`) 来替代默认的信息窗口组件。 以下是基于 `bm-overlay` 的实现方案: ```html <template> <baidu-map class="map-class" :center="mapCenter" :zoom="mapZoom"> <!-- 定义标记 --> <bm-marker v-for="(marker, index) in markers" :key="index" :position="{lng: marker.lng, lat: marker.lat}" @click="toggleCustomOverlay(marker)" /> <!-- 自定义覆盖物 --> <bm-overlay v-if="customOverlayVisible" pane="labelPane" @draw="onDrawCustomOverlay" ></bm-overlay> </baidu-map> </template> <script> export default { data() { return { mapCenter: { lng: 116.404, lat: 39.915 }, mapZoom: 15, markers: [ { lng: 116.404, lat: 39.915, content: '这是第一个位置' }, { lng: 116.407, lat: 39.918, content: '这是第二个位置' } ], customOverlayVisible: false, overlayData: {} }; }, methods: { toggleCustomOverlay(marker) { this.overlayData = marker; // 更新当前选中的标记数据 this.customOverlayVisible = !this.customOverlayVisible; // 切换覆盖物可见状态 }, onDrawCustomOverlay({ el, BMap, map }) { const { lng, lat, content } = this.overlayData; // 清空之前的 DOM 结构 while (el.firstChild) { el.removeChild(el.firstChild); } // 创建新的 HTML 元素作为覆盖物的内容 const div = document.createElement('div'); div.className = 'sample'; div.innerHTML = ` <div> <p>${content}</p> </div> `; // 计算覆盖物的位置 const pixel = map.pointToOverlayPixel(new BMap.Point(lng, lat)); el.style.left = `${pixel.x}px`; el.style.top = `${pixel.y - 30}px`; // 调整垂直偏移量 el.appendChild(div); // 将新创建的元素附加到覆盖物容器中 } } }; </script> <style scoped> .map-class { width: 100%; height: 500px; } .sample { width: 120px; line-height: 40px; background: rgba(0, 0, 0, 0.5); overflow: hidden; box-shadow: 0 0 5px #000; color: #fff; text-align: center; padding: 10px; position: absolute; } </style> ``` 在此示例中,我们利用了 `bm-overlay` 提供的高度灵活性来绘制自定义覆盖物[^5]。每次点击标记时都会重新渲染覆盖物的内容及其位置。 --- #### 总结 以上两种方法都可以满足在 `vue-baidu-map` 上实现点击撒点后弹窗展示信息的需求。第一种方法简单易用,适合大多数场景;第二种方法则提供了更高的定制能力,适用于复杂需求下的开发工作。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值