方案一:vw实现移动端适配
https://www.w3cplus.com/css/vw-for-layout.html
方案二:手淘rem实现移动端适配
页面头部增加
<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=0,minimum-scale=1.0,maximum=scale=1.0">
npm安装lib-flexible,并在入口js引入
cmd:npm i lib-flexible
src/index.js:import 'lib-flexible'
webpack4 postcss-pxtorem安装
npm install --save-dev postcss-loader@4.3.0npm install postcss --save-devnpm install postcss-pxtorem@5.1.1 --save-dev
配置:
rules:[{test : /\.css$/, //正则,处理css文件use : ['style-loader','css-loader',{loader: 'postcss-loader',options: {postcssOptions: {plugins: {"postcss-pxtorem":{rootValue: 100,unitPrecision: 5,propList: ['*'],selectorBlackList: [],replace: true,mediaQuery: false,minPixelValue: 0,exclude: /node_modules/i}}}}}] //从head里面插入style,开发模式使用//use : [MiniCssExtractPlugin.loader,"css-loader"] //直接生成css文件},]
相关文档:
https://www.npmjs.com/package/postcss-loader/v/4.3.0
https://www.npmjs.com/package/postcss-pxtorem
https://www.npmjs.com/package/postcss
注意事项:
1、版本问题,webpack4支持postcss-loader@4.3.0,postcss-pxtorem@5.1.1,再高会报错api不存在
2、写法问题需要注意版本不同配置写法不同
webpack4 安装 px2rem-loader 很遗憾,不适用,无法排除不想转换的css文件
npm install px2rem-loader --save-dev
module.exports = {// ...module: {rules: [{test: /\.less$/,use: ['style-loader', 'css-loader', 'less-loader', {loader: 'px2rem-loader',options: {remUni: 75, // 适合750的设计稿 1rem = 75pxremPrecision: 8 // px转rem小数点保留的位置}}]}]}}
安装postcss-px2rem-exclude
npm i --save-dev postcss-px2rem-exclude
根目录下建立postcss.config.js,配置如下
module.exports = {plugins: {//remUnit这个配置项的数值是多少呢??? 通常我们是根据设计图来定这个值,原因很简单,便于开发。//假如设计图给的宽度是750,我们通常就会把remUnit设置为75,这样我们写样式时,可以直接按照设计图标注的宽高来1:1还原开发。'postcss-px2rem-exclude': {remUnit: 75,minPixelValue: 2, //设置要替换的最小像素值(2px会被转rem)。 默认 0exclude: /node_modules|folder_name/i,// rootValue: 100, //换算基数, 默认100 ,这样的话把根标签的字体规定为1rem为50px,这样就可以从设计稿上量出多少个px直接在代码中写多上px了。// unitPrecision: 5, //允许REM单位增长到的十进制数字。//propWhiteList: [], //默认值是一个空数组,这意味着禁用白名单并启用所有属性。// propBlackList: [], //黑名单selectorBlackList: ['noRem'], //要忽略并保留为px的选择器// ignoreIdentifier: false, //(boolean/string)忽略单个属性的方法,启用ignoreidentifier后,replace将自动设置为true。// replace: true, // (布尔值)替换包含REM的规则,而不是添加回退。//mediaQuery: false, //(布尔值)允许在媒体查询中转换px。}}}
初始化样式
* { -webkit-tap-highlight-color: transparent; outline: 0; margin: 0; padding: 0; vertical-align: baseline; }body, h1, h2, h3, h4, h5, h6, hr, p, blockquote, dl, dt, dd, ul, ol, li, pre, form, fieldset, legend, button, input, textarea, th, td { margin: 0; padding: 0; vertical-align: baseline; }img { border: 0 none; vertical-align: top; }i, em { font-style: normal; }ol, ul { list-style: none; }input, select, button, h1, h2, h3, h4, h5, h6 { font-size: 100%; font-family: inherit; }table { border-collapse: collapse; border-spacing: 0; }a { text-decoration: none; color: #666; }body { margin: 0 auto; min-width: 320px; height: 100%; font-size: 14px; font-family: -apple-system,Helvetica,sans-serif; line-height: 1.5; color: #666; -webkit-text-size-adjust: 100% !important; text-size-adjust: 100% !important; }
通用类Meta
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
移动端激活css:active点击态
document.body.addEventListener('touchstart', function() {});
一些坑
1、微信浏览器特殊设定,需要把document.body.style.fontSize = (1 * dpr) + 'px'dpr需要更改
2、安卓设备不支持base64的image/png进行图片合成,会丢失,而是应该转为base64的image/jpeg格式才能正常合成
