记vue3 高德地图、图表 大屏处理- postcss-pxtorem

237 阅读1分钟

最开始找了很多方案,比如scale缩放,通过计算设计图分辨率和浏览器的可显示区域进行缩放,实际使用下来有几个弊端:

  1. 页面上下或者左右会留白。不太适合整体地图当背景,而且要可操作的情况。
  2. 页面字体会显得很模糊,使用3d属性也没能解决。
  3. 页面整体使用scale 后,高德地图点位点击偏移。

很多组件好像都是基于这个scale来实现大屏的处理。不太符合项目要求。最后还是决定使用 postcss-pxtorem,整体效果还是达到预期。

rem.ts

// 设置 rem 函数
function setRem() {
  // 1920 默认大小16px; 1920px = 120rem ;每个元素px基础上/16
  const screenWidth = 1920;
  const scale = screenWidth / 16;
  const htmlWidth = document.documentElement.clientWidth || document.body.clientWidth;
  // 得到html的Dom元素
  const htmlDom = document.getElementsByTagName("html")[0];
  // 设置根元素字体大小
  htmlDom.style.fontSize = htmlWidth / scale + "px";
}
// 初始化
setRem();
// 改变窗口大小时重新设置 rem
window.addEventListener("resize", () => {//改为这样设置可以重新设置
  setRem();
});

postcss.config.cjs

module.exports = {
  plugins: {
    // to edit target browsers: use "browserslist" field in package.json
    autoprefixer: {},
    "postcss-pxtorem": {
      rootValue: 16, // 结果为:设计稿元素尺寸/16,比如元素宽320px,最终页面会换算成 20rem
      propList: ["*"],
      exclude: e => {
        if (/src(\\|\/)views(\\|\/)largeScreen/.test(e)) {
          return false;
        } else {
          return true;
        }
      } // 只对src/views/largeScreen文件进行px转rem,其他文件不转换
    }
  }
};

但是rem对element的自带行内样式 和echarts 的字体样式不能适配,需要单独处理。

export function echartFontSize(num: number) {
  let clientWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
  if (!clientWidth) return;
  // 此处的1920为设计稿的宽度,记得修改!
  let fontSize = clientWidth / 1920;
  return num * fontSize;
}

参考链接: