美文网首页
viewport 适配方案

viewport 适配方案

作者: mark666 | 来源:发表于2022-01-03 19:55 被阅读0次

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

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

  • vw:是 viewport's width 的简写,1vw 等于 window.innerWidth 的 1%;
  • vh:和 vw 类似,是 viewport's height 的简写,1vh 等于 window.innerHeihgt 的 1%;
  • vmin:vmin 的值是当前 vw 和 vh 中较小的值;
  • vmax:vmax 的值是当前 vw 和 vh 中较大的值;

假设我们拿到的视觉稿宽度为 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
});
  • 使用
    在CSS 可以使用以下方式
.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生产环境不需要生成
  },
},

相关文章

  • 移动端适配

    移动端适配 1.适配宽高等问题REM方案:改变页面根部的font-size js方案:通过缩放viewport,达...

  • vue移动端适配方案

    一、rem适配方案 准备工具,viewport: 手机浏览器是把页面放在一个虚拟的"窗口"(viewport)中,...

  • viewport 适配方案

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

  • vue-cli3.0移动端屏幕适配

    vm vh适配方案 npm i postcss-px-to-viewport -save -dev 配置packa...

  • 移动端是如何做适配的?

    移动端的适配要分为三点来讨论:使用viewport媒体查询动态rem方案 一、使用viewport 也就是使用 ,...

  • 适配iphoneX系列

    适配方案 安全区 meta viewpoint 内添加 viewport-fit=cover,即 注:ios 设备...

  • 前端页面适配

    为啥需要适配 安卓 IOS 各种不同的屏幕尺寸 适配方案 基本上都会设置 viewport 百分比:width, ...

  • 移动端适配开发

    主要有两种方案,通过viewport设置画布缩放比例、通过设置html的font-size用rem适配。 方案一:...

  • meta-viewport

    相关动态REM的文章 移动端高清、多屏适配方案使用Flexible实现手淘H5页面的终端适配 viewport v...

  • 移动端适配方案

    移动端适配方案:1)viewport(scale=1/dpr)2)rem3)flex4)vm/vh一、什么是移动端...

网友评论

      本文标题:viewport 适配方案

      本文链接:https://www.haomeiwen.com/subject/mcxfcrtx.html