在使用Vue框架搭建网站时,其中有一网页用于展示坐标点,使用Vue Baidu Map进行数据的绑定,地图初始时,宽度必须要设定,否则无法完成地图渲染。在<baidu-map>
标签中设置style
属性值如下:
<div id="map">
<baidu-map :style="{width:map.width,height:map.height}" />
</div>
在地图初始函数handler
中设置地图的初始值,
this.map.width = document.getElementById("map").clientWidth +'px';
this.map.height = document.getElementById("map").clientHeight +'px';
当点击折叠菜单按钮时,通过获取元素map的宽度来刷新地图的宽度。但是尝试几个方法来设置都失败,最终将子元素宽度设置为100%后,地图宽度得以屏幕自适应,仰天一叹 😦 :吃了没有详细看CSS的亏。
首先看一下我都尝试了哪些操作。
一、计算方法
1.1 监听折叠按钮的变化,获取map的值
collapsed: function (val){
console.log('current map width', document.getElementById("map").clientWidth);
this.bigWidth = 1051 +'px';
if(val){
this.smallWidth = document.getElementById("map").clientWidth +'px';
}else{
this.bigWidth = document.getElementById("map").clientWidth +'px';
}
if(val){
this.map.width = this.bigWidth;
}else{
this.map.width = this.smallWidth;
}
},
结论:当监听到折叠按钮变化时,直接获取的是未进行更新的DOM元素的值,因此我还设置了宽度值,因为第一次获取的时候是undefined
。
1.2 监听map元素的resize变化,更新地图的宽度
import elementResizeDetectorMaker from "element-resize-detector";//导入该库
let that = this;
let elements = [];
elements.push(document.getElementById("map"));
elementResizeDetectorMaker().listenTo(elements,() => {
that.map.width = document.getElementById("map").clientWidth;
console.log(that.map.width);
});
结论:虽然能够取到折叠后的宽度,但是设置不生效,原因未知(估摸着是浏览器渲染问题,待深入研究其机理再分析,本文先提供几个试错的样本,避免再走弯路)。
1.3 延时更新map元素宽度
let that = this;
setTimeout(()=>{
that.map.width = document.getElementById("map").clientWidth;
console.log('setTimeout',that.map.width);
},1200);
结论:同1.2。
二、极简方法
通过style属性,将子元素宽度设置为100%。
:style="{width:'100%',height:map.height}