postcss-plugin-px2rem 移动端适配原理

 1 安装postcss-plugin-px2rem

npm i postcss-plugin-px2rem  --save-dev

2 webpack配置postcss-loader

const px2rem = require("postcss-plugin-px2rem");

const px2remOpts = {
	rootValue: 100,
	exclude: /(node_module)/,
	mediaQuery: false,
	minPixelValue: 3,
};


.......




      {
        loader: require.resolve("postcss-loader"),
        options: {
          ident: "postcss",
          plugins: () => [
            require("postcss-flexbugs-fixes"),
            require("postcss-preset-env")({
              autoprefixer: {
                flexbox: "no-2009",
              },
              stage: 3,
            }),
            px2rem(px2remOpts),
            postcssNormalize(),
          ],
          sourceMap: isEnvProduction ? shouldUseSourceMap : isEnvDevelopment,
        },
      },

postcss-plugin-px2rem 配置明细

const px2remOpts = {
	rootValue: 100,
	// unitPrecision: 5, //允许REM单位增长到的十进制数字。
	//propWhiteList: [],  //默认值是一个空数组,这意味着禁用白名单并启用所有属性。
	// propBlackList: [], //黑名单
	exclude: /(node_module)/, //默认false,可以(reg)利用正则表达式排除某些文件夹的方法,例如/(node_module)/ 。如果想把前端UI框架内的px也转换成rem,请把此属性设为默认值
	// selectorBlackList: [], //要忽略并保留为px的选择器
	// ignoreIdentifier: false,  //(boolean/string)忽略单个属性的方法,启用ignoreidentifier后,replace将自动设置为true。
	// replace: true, // (布尔值)替换包含REM的规则,而不是添加回退。
	mediaQuery: false, //(布尔值)允许在媒体查询中转换px。
	minPixelValue: 3, //设置要替换的最小像素值(3px会被转rem)。 默认 0
};

rootValue是代码中px转rem的一个计算基准。100的意思就是100px=1rem,如果代码中设置为200px,那么最后在浏览器显示的就是2rem。

浏览器显示的是2rem,底层在渲染的时候是按照2rem*font-size=xxxpx渲染的。

这个时候就有问题了,在不同大小屏幕下,200px都会被转换成2rem,不同屏幕的font-size不一样,那么底层渲染出来的2rem也不一样。就会有兼容问题。并且我的设计搞的375px,那么我就想让375px等于屏幕的宽。

样式代码:

.demo {
	margin-top: 50px;
	width: 375px;
	height: 30px;
	background-color: red;
}

postcss-plugin-px2rem 移动端适配原理_第1张图片

 postcss-plugin-px2rem 移动端适配原理_第2张图片

解决办法:

如果我们的UI给出的设计稿是375px,然后我们切换到iphone6下面直接给视图设置357px,先不进行rem转换,那么宽度肯定是刚好占满屏幕。

我们再就行rem转换,375px被转换成3.75rem,那么这个3.75rem要刚好等于屏幕的宽,发现没有等于屏幕的宽。那要怎么才能等于屏幕的宽呢?

1 先解决如何让375px也就是3.75rem占满屏幕

我们需要3.75rem在渲染的时候被底层换算成375px,那么就可以刚好占满屏幕宽度。

3.75rem * font-size=375px,那么font-size=100px。

2 如何让不同机型都可以把3.75rem换算成屏幕的宽

问题又来了,我把机型换成iphone XR,设备宽度为414px,也就是需要3.75rem在渲染时候被换算成414px

所以我们就不能把fontSize设置成固定的100px。

3.75rem*font-size=414px,上面的是

3.75rem * font-size=375px,

等价于

3.75rem*font-size=clientWidth,

3.75rem * font-size=clientWidth,

clientWidth(设备屏幕宽度)

font-size=clientWidth/3.57=clientWidth/357 *100 px

所以我们需要把上面的代码再完善一下

这样在所以屏幕中3.75rem就代表了设备屏幕的宽。

postcss-plugin-px2rem 移动端适配原理_第3张图片

postcss-plugin-px2rem 移动端适配原理_第4张图片

完美解决。

这样我们就可以按照设计搞给的px直接设置在代码中,不用再考虑页面兼容和rem的换算问题。

你可能感兴趣的:(h5移动端适配,postcss,javascript,css)