viewport 适配方案

2022-01-03  本文已影响0人  mark666

viewport 单位得到众多浏览器的兼容,所以目前基于 viewport 的移动端适配方案被各大厂团队所采用。

vw 作为布局单位,从底层根本上解决了不同尺寸屏幕的适配问题,因为每个屏幕的百分比是固定的、可预测、可控制的。 viewport 相关概念如下:

假设我们拿到的视觉稿宽度为 750px,视觉稿中某个字体大小为 75px,则我们的 css 属性只要如下这么写,不需要额外的去用 js 进行设置,也不需要去缩放屏幕等;

.text{
  font-size: 10vw;     // 1vw = 750px * 1% = 7.5px
}

当然上述方案我们可能在某些第三方库或者某些案列中发现布局这样写,其实我们绝大多数利用uniapp开发会发现它是利用 rpx 方案,当然viewport方案也是没问题的,如果项目中我独立开发配置,完全可以利用webpack配置插件的方式支持vw适配,不用自己去手动写 vw.

安装

npm install postcss-px-to-viewport --save-dev
// 或者
yarn add  postcss-px-to-viewport -D

配置

module.exports = {
  plugins: {
    // ...
    'postcss-px-to-viewport': {
      // options
      unitToConvert: 'px',    // 需要转换的单位,默认为"px"
      viewportWidth: 750,     // 设计稿的视窗宽度
      unitPrecision: 5,       // 单位转换后保留的精度
      propList: ['*', '!font-size'], // 能转化为 vw 的属性列表, font-size 不进行转换 vw
      viewportUnit: 'vw',     // 希望使用的视窗单位
      fontViewportUnit: 'vw', // 字体使用的视窗单位
      selectorBlackList: [],  // 需要忽略的 CSS 选择器,不会转为视窗单位,使用原有的 px 等单位
      minPixelValue: 1,       // 设置最小的转换数值,如果为 1 的话,只有大于 1 的值会被转换
      mediaQuery: false,      // 媒体查询里的单位是否需要转换单位
      replace: true,          // 是否直接更换属性值,而不添加备用属性
      exclude: undefined,     // 忽略某些文件夹下的文件或特定文件,例如 'node_modules' 下的文件
      include: /\/src\//,     // 如果设置了include,那将只有匹配到的文件才会被转换
      landscape: false,       // 是否添加根据 landscapeWidth 生成的媒体查询条件
      landscapeUnit: 'vw',    // 横屏时使用的单位
      landscapeWidth: 1125,   // 横屏时使用的视窗宽度
    },
  },
};

当然我们可以在代码中配置是否支持转化

.title{
  /* px-to-viewport-ignore-next */ 下一行不进行转换.
  width: 10px;
  padding: 10px;
  height: 10px; /* px-to-viewport-ignore */  当前行不进行转换
}

VW 方案兼容问题

Android 4.4 之下和 iOS 8 以下的版本有一定的兼容性问题( 但是目前市场占比低,如果不考虑也可以不处理),但是社区提供了兼容性解决方案,其为 viewport 的 buggyfill:Viewport Units Buggyfill

npm install viewport-units-buggyfill --save-dev
const hacks = require('viewport-units-buggyfill/viewport-units-buggyfill.hacks');
require('viewport-units-buggyfill').init({
  hacks: hacks
});
.my-viewport-units-using-thingie {
  width: 50vmin;
  height: 50vmax;
  top: calc(50vh - 100px);
  left: calc(50vw - 100px);

  /* hack to engage viewport-units-buggyfill */
  content: 'viewport-units-buggyfill; width: 50vmin; height: 50vmax; top: calc(50vh - 100px); left: calc(50vw - 100px);';
}

但是我们不同每个样式都采取上去手动方式添加,我们需要利用引入插件方式

npm install postcss-viewport-units --save-dev

在我们的项目配置文件 webpack.config.js 中进行对应的插件引入配置:

{
  loader: 'postcss-loader',
  options: {
    ident: 'postcss',
    plugins: () => [
      // 我们加的配置
      require('postcss-viewport-units'),
    ],
    sourceMap: isProductionEnv, // sourcemap生产环境不需要生成
  },
},
上一篇下一篇

猜你喜欢

热点阅读