第一种方案
已经背弃用的一种,需要了解一下,lib-flexible+postcss-pxtorem;lib-flexible 是阿里的一个开源的库,用于设置 font-size,同时可以对窗口的缩放进行处理,但是由于 rem 是相对于 html 元素字体的一个相对的单位,根本上来说是根据字体大小实现布局,总体来说不太适合;
第二种方案
viewport,postcss-px-to-viewport,就可以解决上面说的问题,这个插件主要是将 px 转换为视口单位 vw,vw 是一种百分比单位,100vw 就等于 100%,就是我们的 window.innerWidth,下面是具体的步骤
vue create myapp ; npm install postcss-px-to-viewport -D
在创建脚手架的时候需要特别注意,需要选择 css Pre-processors
2 在项目根目录下添加.postcssrc.js 文件,或者是 postcssrc.js,这个好像有 bug,建议没效果的时候可以去更改一下
3 添加配置
module.exports = { plugins: { autoprefixer: {}, // 用来给不同的浏览器自动添加相应前缀,如-webkit-,-moz-等等 "postcss-px-to-viewport": { unitToConvert: "px", // 要转化的单位 viewportWidth: 750, // UI设计稿的宽度 unitPrecision: 3, // 转换后的精度,即小数点位数 propList: ["*"], // 指定转换的css属性的单位,*代表全部css属性的单位都进行转换 viewportUnit: "vw", // 指定需要转换成的视窗单位,默认vw fontViewportUnit: "vw", // 指定字体需要转换成的视窗单位,默认vw selectorBlackList: ["wrap"], // 指定不转换为视窗单位的类名, minPixelValue: 1, // 默认值1,小于或等于1px则不进行转换 mediaQuery: true, // 是否在媒体查询的css代码中也进行转换,默认false replace: true, // 是否转换后直接更换属性值 exclude: [/node_modules/], // 设置忽略文件,用正则做目录名匹配 landscape: false, // 是否处理横屏情况 }, }, };
4 重新的区运行项目,不然没有效果,应为我们改变了配置文件
5 在创建好的项目中写一段 css 代码后查看,如果发现单位变成 vw 证明此时成功了,否则就是没有
需要注重的配置
1.ropList: 当有些属性的单位我们不希望转换的时候,可以添加在数组后面,并在前面加上!号,如 propList: ["*","!letter-spacing"],这表示:所有 css 属性的属性的单位都进行转化,除了 letter-spacing 的
2.selectorBlackList:转换的黑名单,在黑名单里面的我们可以写入字符串,只要类名包含有这个字符串,就不会被匹配。比如 selectorBlackList: ['wrap'],它表示形如 wrap,my-wrap,wrapper 这样的类名的单位,都不会被转换
关于兼容第三方的库
1.在引入第三方的库时,在上面配置的 exclude 去掉,表示全部内容进行一个 vw 转换,此时我们会发现我们的视图发生了一定程度的挤压,主要拿 vant 来说,打开 vant 的官网你会发现 vant 在适配时适配的是 375px,而我们的是 750,最最主要的是我们不可能要求 ui 去给我们重新区做 ui 图,所以我们需要在我们的适配的配置文件中去搞一下了,即更改我们的配置文件
2 更改后的配置文件
const path = require("path"); module.exports = ({ webpack }) => { const designWidth = webpack.resourcePath.includes( path.join("node_modules", "vant") ) ? 375 : 750; return { plugins: { autoprefixer: {}, "postcss-px-to-viewport": { unitToConvert: "px", viewportWidth: designWidth, unitPrecision: 6, propList: ["*"], viewportUnit: "vw", fontViewportUnit: "vw", selectorBlackList: [], minPixelValue: 1, mediaQuery: true, exclude: [], landscape: false, }, }, }; };
3 重新运行,完美适配