页面自适应采用 transform: "scale()"方式,
- 获取当前页面的分辨率
- 获取当前页面的长宽和设计的页面的长宽的倍数
- 采用scale将长宽按倍数进行放大缩小
let w = $(window).width(); let h = $(window).height(); let ratioX = w / 1920; let ratioY = h / 1080; $('html').css({ transform: "scale(" + ratioX + "," + ratioY + ")", transformOrigin: "left top", backgroundSize: "100% 100%", width: 1920 + "px", height: 1080 + "px", overflow: 'hidden', });
上面是页面自适应的方式,这样嵌入的百度地图也会进行自适应缩小放大,这个时候鼠标在百度地图点位是跟真实的点位不对应的。解决方案如下:
-
获取放大缩小后的坐标相对于父元素的位置
-
将X,Y等比例还原
//将父元素的相对位置放入缓存 this.$nextTick(() => { let mapLocal = this.getElementPos($(".out-container")[0]); localStorage.setItem("mapLocal", JSON.stringify(mapLocal)); }) //计算父元素的相对位置 getElementPos(el) { if (el.parentNode === null || el.style.display == 'none') { return false; } var parent = null; var pos = []; var box; if (el.getBoundingClientRect) { //IE box = el.getBoundingClientRect(); var scrollTop = Math.max(document.documentElement.scrollTop, document.body.scrollTop); var scrollLeft = Math.max(document.documentElement.scrollLeft, document.body.scrollLeft); return {x: box.left + scrollLeft, y: box.top + scrollTop}; } else { pos = [el.offsetLeft, el.offsetTop]; parent = el.offsetParent; if (parent != el) { while (parent) { pos[0] += parent.offsetLeft; pos[1] += parent.offsetTop; parent = parent.offsetParent; } } } return {x: pos[0], y: pos[1]}; }, //在百度获取坐标进行还原 let mapLocal = localStorage.getItem("mapLocal"); let ratioX1 = Number(localStorage.getItem('ratioX')); let ratioY1 = Number(localStorage.getItem('ratioY')); if (mapLocal) { mapLocal = JSON.parse(mapLocal); } if (mapLocal) { ax = (a.clientPos.x - mapLocal.x) / ratioX1; ay = (a.clientPos.y - mapLocal.y) / ratioY1; } else { ax = a.x; ay = a.y; }