移动端适配 视口viewport

214 阅读4分钟

1.视口概念

描述:视口,就是视图窗口的简称
      页面中视口的大小实际上就是html元素大小
说明:
      页面想要在移动端加载必须进行视口的配置
      如果不对页面进行调整,那么默认页面在移动端加载的时候,都认为视口宽度为980px

1.1解决方案

 描述:<meta name="viewport" content="width=device-width,user-scalable=no,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0" />
 说明:1.只要做移动端适配,就对页面添加此标签,此标签能够使得页面不再按照980px
       2.必要内容:
                  width=device-width 设置页面视口大小和设配尺寸大小相同
                  user-scalable=no 设置用户不可对页面进行放大缩小设置
                  initial-scale=1.0 设置页面加载倍率为1倍
       3.可选内容:
                   minimum-scale=1.0 设置页面最小缩小倍率为1.0
                   maximum-scale=1.0 设置页面最大放大倍率为1.0
 补充:这个标签在页面中并不是所有的移动端设备都能生效,几乎所有的移动端设备都不生效
 安卓的UC浏览器可以生效,chrome可以生效

2.rem单位

描述:rem 是css中的一个尺寸单位,和px,%,em等单位一样,都是用来设置大小的
      rem代表的含义为:[是html或者根元素的字体大小的多少倍]
语法:document.documentElement.style.fontSize=(document.documentElement.clientWidth/750)*100+'px';
      在750px大小的设备当中,1rem=100px;
      在350px大小的设备当中,1rem=50px;
解释:将设备的屏幕尺寸 划分为 设计稿的大小的750份;假设当前设备尺寸375,375/750=0.5的标准单位,此时 1rem=0.5px;
问题?因谷歌浏览器对字体大小的限制为16px,如果此时我们需要给一个div设置50rem的大小,那么这个div在350下就是25px;
如果此时手误设置成了5rem,那么这个div就是2.5px,问题就出现在这里,浏览器就是更正字体大小为16px;所以为了方便我们的计算,将它扩大一百倍。
为什么标准单位是按照750计算?
开发者和设计者之间的问题,现在比较流行的设计稿都是按照750设计的,不会按照设备的大小来做,比如350来做,因为太小了,所以按照750设计;
750的设计稿需要进行2倍图的换算,也就是要在375的设备上操作,因为iphone采用1像素=>2像素点,也就是在iphone屏幕上1像素点会存2像素点,也就是iphone像素高清。
示例:window.onresize = function () {
        //页面加载完,设置html字体大小
        //标准化rem标准单位的具体数值
      document.documentElement.style.fontSize =
            (document.documentElement.clientWidth / 750) * 100 + "px";
            };

2.1插件配合代码示例

vscode插件:下载px to rem & rpx & vw (cssrem),点击扩展设置,找到rem进行配置。

插件配置示例图: 这里的单位设置为:根据设计稿计算过后的具体数值。如: 在750px大小的设备当中,1rem=100px; 在375px大小的设备当中,1rem=50px; 1697358112258.jpg 代码示例: 根据配置好的插件,直接写绝对单位px,插件会根据配置好的单位,进行换算。

1697358951589.jpg

3.第三方库插件

下载:
    上线依赖(生产环境依赖):yarn add amfe-flexible 
    只在开发时依赖:yarn add postcss-pxtorem@5.0.0 -D
1.amfe-flexible
  amfe-flexible是配置可伸缩布局方案,用于计算跟标签的font-size的大小
2.postcss-pxtorem
  postcss-pxtorem是postcss的插件,用于将像素单位生成rem单位

amfe-flexible

1.下载
2.引入到min.js:import 'amfe-flexible';
例如:当前设备是375,viewWidth/10,font-size:37.5px;1rem=37.5px

postcss-pxtorem

1.下载
2.基于 vite 项目使用:在vite.confing.js 写入postcss-pxtorem 配置
  基于 vue cli 项目使用:新建postcss.config.js 写入配置
3.重启项目
postcss-pxtorem 的 REM 适配方案:把一行分为 10 份,每份就是十分之一
所以 rootValue 应该设置为我们设计稿的十分之一
假设:我们设计稿是750,rootValue 应该设置为 750 / 10 = 75
注意:vant 的设计稿是37.5的,vant 同时建议设置为37.5
例如:rootValue参数表示根元素的字体37.5px,那么转换后37.5px=1rem
import { fileURLToPath, URL } from "node:url";
import postcssPxtorem from "postcss-pxtorem";
import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";

// https://vitejs.dev/config/
export default defineConfig({
    plugins: [vue()],
    resolve: {
        alias: {
            "@": fileURLToPath(new URL("./src", import.meta.url)),
        },
    },
    css: {
        postcss: {
            plugins: [
                postcssPxtorem({
                    rootValue: 37.5,
                    propList: ["*"],
                }),
            ],
        },
    },
});

// postcss.config.js
module.exports = {
  plugins: {
    'postcss-pxtorem': {
      rootValue: 37.5,
      propList: ['*'],
    },
  },
};

postcss-pxtorem其他设计稿尺寸

如果设计稿的尺寸不是 375,而是 750 或其他大小,可以将 rootValue 配置调整为:

// postcss.config.js
module.exports = {
  plugins: {
    // postcss-pxtorem 插件的版本需要 >= 5.0.0
    'postcss-pxtorem': {
      rootValue({ file }) {
        return file.indexOf('vant') !== -1 ? 37.5 : 75;
        // 如果是 vant 使用 37.5 否则使用 75-> 75为我们自己设计稿的尺寸
      },
      propList: ['*'],
      exclude:'styles' // 参数:文件名即可,不包含后缀
    },
  },
};