如何快速实现响应式多屏幕适配

88 阅读3分钟

项目涉及的场景比较简单,所以我个人的配置也比较粗糙简单,如果要对于更详细的多端适配,可能需要更细致的设定,如果希望一键快速实现大体上过得去的pc端多端适配,可以用这个法子。

  1. 安装postcss(必须)+tailwindcss(可选)
  2. 安装postcss-plugin-px2rem(必须)
  3. 在豆包搜索postcss-plugin-px2rem如何配置应用在postcss.config.js文件里面按需配置(关键)
module.exports = {
  plugins: [
    require('postcss-plugin-px2rem')({
      rootValue: 16, // 根元素字体大小(默认 16px,即 1rem = 16px)
      unitPrecision: 5, // 转换后的 rem 保留小数位数(默认 5)
      propList: ['*'], // 需要转换的 CSS 属性(默认 ['*'],即所有属性)
      selectorBlackList: [], // 不转换的选择器(如 ['body'],则 body 下的 px 不转换)
      replace: true, // 是否直接替换原 px 值(默认 true,不保留原 px)
      mediaQuery: false, // 是否转换媒体查询中的 px(默认 false,不转换)
      minPixelValue: 0, // 最小转换像素值(默认 0,即所有 px 都转换)
      exclude: /node_modules/i // 排除的文件路径(如 node_modules 下的样式不转换)
    })
  ]
}

后续需要详细配置的话,需要关注的两个属性

selectorBlackList: [], 
mediaQuery: false, 
  1. 计算出基准线

因为我们项目主流的屏幕大小是1920px,最大是2540px,最小是1280px,希望尽可能一套css代码实现复用,再使用media媒体查询去进行特殊处理。

所以希望1920px下1rem是16px,其他环境下,最大的fontSize不超过20px,最小不低于12px,于是:

1920/16 === 120

120*20 = 2400(最大屏幕宽度,超过则取2400px)

120*12 = 1200(最小屏幕宽度,低于则取1400px)

如果设备屏幕宽度在1400px-2400px,则取 fontSize = 当前屏幕宽度/120,不然当前屏幕宽度则按照MAX_DEVICESIZE和MIN_DEVICESIZE计算。

更加详细的多屏幕适配方案
  1. 视口(viewport)配置

    (1)device-width 设备屏幕宽度 (2)initial-width 初始缩放比例 1:1

  2. Box-sizing:border-box 设置为IE盒模型width=padding+真实宽度

  3. normalize.css基础样式重置,postcss-preset-env/autoprefixer(处理浏览器前缀)+tailwindcss的preflight(基础样式重置)统一浏览器差异

Q: 为什么重置?

A: 不同浏览器有自己的默认样式,而这可能导致Chrome显示正常,但是别的浏览器布局显示不正常

  1. flex布局+vw/vh或rem实现自适应
  2. 断点设计:盲目断点不可取

断点优先业内主流屏幕大小:

  • 640px 主流小屏手机大小
  • 768px 主流平板/大屏手机大小
  • 1024px 笔记本大小
  • 1280px 部分笔记本大小
  • 1540px 部分大屏笔记本
  • 1920px 大屏
  • 2560px 超大屏

业内优先小屏然后再调整到大屏上,但因为我的项目主要是1920px的屏幕,只有部分在2560px以及很少人在1280px,所以项目以1920px作为基准调准

  1. 组件适配,对于部分屏幕大小跨度太大的情况,可以在pc端走一个文件,移动端走一个vue文件,通过判断当前屏幕宽度,选择渲染不同组件
  2. css Module和scoped进行不同组件css文件隔离,编译生成唯一的hash名称+文件名进行数据隔离
  3. 使用tailwindcss,使用rem为单位
  4. 以及以上的px-to-rem的方法和根px设置

如果实现7.5px大小的fontsize,使用transform:scale缩放字体,先设置整数像素15px然后缩放0.5倍