使用vue-webpack开发,地图使用百度地图JsAPI,最近开发移动端的网页,发现webpack打包后的移动端界面地图显覆盖物示有问题。
1. vue-webpack环境覆盖物不显示
vue-webpack环境,在PC端的界面能正常显示百度地图,移动端地图能显示,但画上去的覆盖物(圆,正方形之类的覆盖物)不能显示;如果使用单页面,不是webpack打包可以移动端正常显示覆盖物。
vue-webpack PC端
vue-webpack 移动端
单HTML页面移动端
2. 查找原因
打印了覆盖物变量发现PC端覆盖物是SVG,移动端的覆盖物是Canvas
// 百度地图API功能
var map = new BMap.Map("allmap");
map.setMinZoom(3);
map.setMaxZoom(19);
// 添加控件
map.addControl(
new BMap.MapTypeControl({
mapTypes: [BMAP_NORMAL_MAP, BMAP_SATELLITE_MAP]
})
);
map.addControl(new BMap.ScaleControl());
map.enableScrollWheelZoom(true);
// 添加带有定位的导航控件
var navigationControl = new BMap.NavigationControl({
anchor: BMAP_ANCHOR_TOP_LEFT,
type: BMAP_NAVIGATION_CONTROL_LARGE,
enableGeolocation: true
});
map.addControl(navigationControl);
var point = new BMap.Point(116.404, 39.915);
map.centerAndZoom(point, 15);
var marker = new BMap.Marker(new BMap.Point(116.404, 39.915)); // 创建点
var circle = new BMap.Circle(point, 500, {
strokeColor: "blue",
strokeWeight: 2,
strokeOpacity: 0.5
}); //创建圆
map.addOverlay(marker);
map.addOverlay(circle);
setTimeout(function(){
console.log(circle);
},50)
PC端是SVG
移动端是Canvas,vue-webpack环境下canvas的clientHeight和clientWidth(offseHeight,offsetWidth,scrollHeight,scrollWidth)为0,而单页面是canvas的clientHeight和clientWidth对应上width和height的值,所以vue-webpack环境下canvas不显示
3. 反馈问题
将问题反馈给百度地图的开发者平台,回答是暂时没有考虑兼容vue-webpack
4.解决办法
延时设置canvas的父容器和canvas的style为canvas的height和width
var circle = new BMap.Circle(point, 500, {
strokeColor: "blue",
strokeWeight: 2,
strokeOpacity: 0.5
}); //创建圆
map.addOverlay(circle);
setTimeout(function() {
if (circle.V.tagName.toLowerCase() == "canvas") {
circle.V.parentElement.style.width = circle.V.width + "px";
circle.V.parentElement.style.height = circle.V.height + "px";
circle.V.style.width = circle.V.width + "px";
circle.V.style.height = circle.V.height + "px";
}
console.log(circle);
}, 100);