需要

  • 挪动端自适应
  • pc端自适应(在肯定屏幕范畴内)

实现原理

应用amfe-flexible 和 postcss-px2rem依赖包,编译我的项目后主动把px转换成rem, 会依据屏幕大小来动静扭转html的font-size值

想理解rem实现自适应的原理,大家能够自行谷歌,这里就不讲原理了

不懂原理的同学们也没关系,上面跟着操作就能够实现。

实现教程

第一步,装置组件依赖

npm install amfe-flexible -Snpm install postcss-px2rem -S

第二步,引入lib-flexible.js

上面是以vue我的项目作为例子

在入口文件main.js中引入

import "amfe-flexible/index.js";

第三步,在目录 public/index.html文件退出上面一行代码

<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">

第四步,配置postcss-px2rem

如果是vue-cli3构建的我的项目,那么在根目录找到vue.config.js文件,(没有找到的话,就新建一个)

配置内容如下

css: {    loaderOptions: {        css: {},        postcss: {          plugins: [              require("postcss-px2rem")({              remUnit: 75              })          ]       }    }}

下面一段代码放到 module.exports = {},的大括号外面

残缺代码如下:

module.exports = {    // 根本门路    publicPath: './',    css: {        loaderOptions: {          css: {},          postcss: {        plugins: [          require("postcss-px2rem")({            remUnit: 75          })        ]      }        }    },    // 代理    devServer: {        port: 8080,        // host: 'localhost',        https: false, // https:{type:Boolean}        open: true, // 配置主动启动浏览器        disableHostCheck: true,        "proxy": {        "/*": {            "target": "http://xxx",            "changeOrigin": true        }        }    },}

下面的 remUnit: 75, 这里的设置75, 就是设计图是750px, 如果你的设计图是 640px, 那么你改成64即可,如果你的设计图是1920px,那么你改成192即可

如果你的我的项目是 vue-cli2 构建的

装置依赖 postcss-pxtorem

npm i -D postcss-pxtorem

找到根目录下.postcssrc.js文件,在外面增加以下代码:

module.exports = {  plugins: {    'postcss-import': {},    'postcss-url': {},    autoprefixer: {      browsers: ['Android >= 4.0', 'iOS >= 7']    },    'postcss-pxtorem': {      rootValue: 75,      propList: ['*', '!border*']    }  }}

propList 示意匹配的属性 (示意匹配所有属性) 能够在外面用 !border 示意不装备边框,这样不会把边框1px变成1rem

在css中不想px转rem能够这样, 在款式前面写/no/正文即可
.nav {  width: 400px;  height: 300px;  background: red;  border: 1px solid black; /*no*/}

以上配置完后,关上你们的我的项目编译后的页面,关上调试页面扭转宽度就看到了,html的font-size值实时产生扭转,和你写的css px值,都主动转成rem了

第五步,pc端做自适应解决方案

以上的是全自适应,如果你想管制自适应的范畴,比如说,你做pc我的项目, 想在1300px - 1800px之间做自适应,小于1300px就设置个固定的html font-size值, 大于1800px就设置个固定的html font-size值

这样就能够使得pc我的项目布局的页面,不至于始终放大自适应,也不至于始终放大

要害原理是通过媒体查问来管制,代码如下, 在你公共款式(或者全局款式)文件写上

/* 屏幕大于1800px的时候写死html的font-size值为200px */@media screen and (min-width: 1800px) {    html {        font-size: 200px !important;        /*no*/    }}/* 屏幕小于1300px的时候写死html的font-size值为130px */@media screen and (max-width: 1300px) {    html {        font-size: 130px !important;        /*no*/    }}

以上只是一个例子, 挪动端你就能够不必设置了, pc端,你想在什么范畴,依据你的我的项目页面调就好了

vite 打包的我的项目配置

新建个 postcss.config.js 文件, 下如下代码

装置依赖 postcss-pxtorem

npm i -D postcss-pxtorem
module.exports = {  plugins: {    autoprefixer: {      overrideBrowserslist: ['Android >= 4.0', 'iOS >= 7']    },    'postcss-pxtorem': {      rootValue: 192,      propList: ['*', '!border*']    }  }}

根目录创立 .browserslistrc 文件

last 2 versions> 1%iOS 7last 3 iOS versions

记得先写后面三步!!!

踩坑以及解决

当你应用webpack打包的时候,如果你在款式里写了 /*no*/, 就是不想px转换成rem的时候, 例如下面说过的代码

/* 屏幕大于1800px的时候写死html的font-size值为200px */@media screen and (min-width: 1800px) {    html {        font-size: 200px !important;        /*no*/    }}

这个px不转rem是依赖正文的,可是生产环境打包的时候就会把正文去掉,这样导致你写了 /*no*/不转这条css属性,也没成果,打包删除了正文,它就会主动帮你转了。

解决办法一. 能够把款式写到index.html文件的style标签中

这样打包不会删除index.html的css正文,如果你的webpack也把index.html的正文给删除了,那么你能够通过webpack把index.html不删除正文, 这个自行谷歌搜寻很多不打包压缩index.html文件,我我的项目不会删除index.html的正文

解决办法二. 通过配置sass-loader,使得打包时不删除所有的css正文

参考文章: webpack 中 postcss-px2rem 生产环境中正文生效

参考文章

前端中应用amfe-flexible和postcss-pxtorem

vite中配置postcss与postcss-plugin-px2rem