0


Vue 移动端、PC 端适配

  1. Vue 移动端、PC 端适配可以使用 lib-flexibleamfe-flexiblepostcss-pxtorem

postcss-px2rem 和 postcss-px-to-viewport 这几个插件****


  1. lib-flexible 是淘宝手机前端开发团队开发出来的一个开源插件,会自动在 html head 中添加一个 <meta name='viewport'> 的标签,同时会自动设置 html font-size 为屏幕宽度除以10
  2. amfe-flexible lib-flexible 的升级版本,使用 vw 作为布局单位,从底层根本上解决了不同尺寸屏幕的适配问题,因为每个屏幕的百分比是固定的、可预测、可控制的。
  3. postcss-pxtorem postcss-px2rem 插件,用于将 px 单位转化为 rem。可以和 lib-flexible 搭配使用。
  4. postcss-px-to-viewport 插件用于将 px 单位转化为 vw, vh, vmin, vmax 单位。可以和 amfe-flexible 搭配使用。

移动端

方案****

  1. 1

****lib-flexible & postcss-pxtorem

  1. 1. 安装依赖 lib-flexible
  1. npm install lib-flexible --save
  1. 2. main.js 中导入依赖:
  1. import 'lib-flexible/flexible'
  1. 3、安装依赖 postcss-pxtorem****
  1. :

  1. npm install postcss-pxtorem@5.0.0 --save-dev
  1. 4、配置 postcss-pxtorem****
  1. :

  1. vue-cli2:在根目录中的 postcss.config.js (没有新建即可),添加如下代码:
  1. module.exports = {
  2. plugins: {
  3. "postcss-pxtorem": {
  4. rootValue: 37.5, // lib-flexible 将屏幕分成10份(10rem),这里设置表示设计图宽度为10*37.5=375px
  5. unitPrecision: 5, // 保留rem小数点多少位
  6. propList: ['*', '!border'], // 存储将被转换的属性列表,'!font-size' 即不对字体进行rem转换
  7. selectorBlackList: ['.radius'], // 要忽略并保留为px的选择器,例如fs-xl类名,里面有关px的样式将不被转换,支持正则写法。
  8. replace: true,
  9. mediaQuery: false, //(布尔值)媒体查询( @media screen 之类的)中不生效
  10. minPixelValue: 4, // 设置要替换的最小像素值,px小于4的不会被转换
  11. exclude: /(node_module)/, //默认false,可以(reg)利用正则表达式排除某些文件夹的方法,例如/(node_module)/ 。如果想把前端UI框架内的px也转换成rem,请把此属性设为默认值
  12. }
  13. }
  14. }
  1. vue-cli3:在根目录中 vue.config.js (没有新建即可),添加如下代码:
  1. module.exports = {
  2. css: {
  3. loaderOptions: {
  4. postcss: {
  5. plugins: [
  6. require('postcss-pxtorem')({
  7. rootValue: 37.5, // lib-flexible 将屏幕分成10份(10rem),这里设置表示设计图宽度为10*37.5=375px
  8. unitPrecision: 5, // 保留rem小数点多少位
  9. propList: ['*', '!border'], // 存储将被转换的属性列表,'!font-size' 即不对字体进行rem转换
  10. selectorBlackList: ['.radius'], // 要忽略并保留为px的选择器,例如fs-xl类名,里面有关px的样式将不被转换,支持正则写法。
  11. replace: true,
  12. mediaQuery: false, //(布尔值)媒体查询( @media screen 之类的)中不生效
  13. minPixelValue: 4, // 设置要替换的最小像素值,px小于4的不会被转换
  14. exclude: /(node_module)/, //默认false,可以(reg)利用正则表达式排除某些文件夹的方法,例如/(node_module)/ 。如果想把前端UI框架内的px也转换成rem,请把此属性设为默认值
  15. })
  16. ]
  17. }
  18. }
  19. }
  20. }
  1. 5、注意事项
  • 配置完成后注意删除掉 index.html 里的视窗 meta 标签 <meta name='viewport'> 以便让 lib-flexible 插件帮你生成;
  • 如果某些 px 尺寸不想转换成 rem ,将 px大写即可。 .box{ width:200Px; height:200PX;}

方案2:lib-flexible & postcss-px2rem

  1. 1. 安装依赖 lib-flexible
  1. npm install lib-flexible --save
  1. 2. main.js 中导入依赖:
  1. import 'lib-flexible/flexible'
  1. 3、安装依赖 postcss-px2rem****
  1. :

  1. npm install postcss-px2rem --save-dev
  1. 4、配置 postcss-px2rem****
  1. :

  1. vue-cli2:在根目录中的 postcss.config.js (没有新建即可),添加如下代码:
  1. module.exports = {
  2. plugins: {
  3. "postcss-px2rem": {
  4. remUnit: 37.5 //lib-flexible 将屏幕分成10份(10rem),这里设置表示设计图宽度为10*37.5=375px
  5. }
  6. }
  7. }
  1. vue-cli3:在根目录中的 vue.config.js (没有新建即可),添加如下代码:
  1. module.exports = {
  2. css: {
  3. loaderOptions: {
  4. postcss: {
  5. plugins: [
  6. require('postcss-px2rem')({
  7. remUnit: 37.5 //lib-flexible 将屏幕分成10份(10rem),这里设置表示设计图宽度为10*37.5=375px
  8. })
  9. ]
  10. }
  11. }
  12. }
  13. }
  1. 5、注意事项
  • 配置完成后注意删除掉 index.html 里的视窗 meta 标签 <meta name='viewport'> 以便让 lib-flexible 插件帮你生成;
  • 如果某些 px 尺寸不想转换成 rem ,将 px大写即可。 .box{ width:200Px; height:200PX;}

方案3 (推荐):amfe-flexible & postcss-px-to-viewport

  1. 1、安装依赖 amfe-flexible
  1. npm install amfe-flexible --save
  1. 2、在 main.js 中导入依赖:
  1. import "amfe-flexible/index"
  1. 3、安装依赖 postcss-px-to-viewport
  1. npm install postcss-px-to-viewport --save-dev
  1. 4、配置 postcss-px-to-viewport
  2. vue-cli2:在根目录中的 postcss.config.js (没有新建即可),添加如下代码:
  1. module.exports = {
  2. plugins: {
  3. 'postcss-px-to-viewport': {
  4. unitToConvert: 'px', // 需要转换的单位
  5. viewportWidth: 750, // 视口宽度,等同于设计稿宽度
  6. unitPrecision: 5, // 精确到小数点后几位
  7. /**
  8. * 将会被转换的css属性列表,
  9. * 设置为 * 表示全部,如:['*']
  10. * 在属性的前面或后面设置*,如:['*position*'],*position* 表示所有包含 position 的属性,如 background-position-y
  11. * 设置为 !xx 表示不匹配xx的那些属性,如:['!letter-spacing'] 表示除了letter-spacing 属性之外的其他属性
  12. * 还可以同时使用 ! 和 * ,如['!font*'] 表示除了font-size、 font-weight ...这些之外属性之外的其他属性名头部是‘font’的属性
  13. * */
  14. propList: ['*'],
  15. viewportUnit: 'vw', // 需要转换成为的单位
  16. fontViewportUnit: 'vw',// 需要转换称为的字体单位
  17. /**
  18. * 需要忽略的选择器,即这些选择器对应的属性值不做单位转换
  19. * 设置为字符串,转换器在做转换时会忽略那些选择器中包含该字符串的选择器,如:['body']会匹配到 .body-class,也就意味着.body-class对应的样式设置不会被转换
  20. * 设置为正则表达式,在做转换前会先校验选择器是否匹配该正则,如果匹配,则不进行转换,如[/^body$/]会匹配到 body 但是不会匹配到 .body
  21. */
  22. selectorBlackList: [],
  23. minPixelValue: 1, // 最小的像素单位值
  24. mediaQuery: false, // 是否转换媒体查询中设置的属性值
  25. replace: true, // 替换包含vw的规则,而不是添加回退
  26. /**
  27. * 忽略一些文件,如'node_modules'
  28. * 设置为正则表达式,将会忽略匹配该正则的所有文件
  29. * 如果设置为数组,那么该数组内的元素都必须是正则表达式
  30. */
  31. exclude: [],
  32. landscape: false, // 是否自动加入 @media (orientation: landscape),其中的属性值是通过横屏宽度来转换的
  33. landscapeUnit: 'vw', // 横屏单位
  34. landscapeWidth: 1334 // 横屏宽度
  35. }
  36. }
  37. }
  1. vue-cli3:在根目录中的 vue.config.js (没有新建即可),添加如下代码:
  1. module.exports = {
  2. css: {
  3. loaderOptions: {
  4. postcss: {
  5. plugins: [
  6. require('postcss-px-to-viewport')({
  7. unitToConvert: 'px', // 需要转换的单位
  8. viewportWidth: 750, // 视口宽度,等同于设计稿宽度
  9. unitPrecision: 5, // 精确到小数点后几位
  10. /**
  11. * 将会被转换的css属性列表,
  12. * 设置为 * 表示全部,如:['*']
  13. * 在属性的前面或后面设置*,如:['*position*'],*position* 表示所有包含 position 的属性,如 background-position-y
  14. * 设置为 !xx 表示不匹配xx的那些属性,如:['!letter-spacing'] 表示除了letter-spacing 属性之外的其他属性
  15. * 还可以同时使用 ! 和 * ,如['!font*'] 表示除了font-size、 font-weight ...这些之外属性之外的其他属性名头部是‘font’的属性
  16. * */
  17. propList: ['*'],
  18. viewportUnit: 'vw', // 需要转换成为的单位
  19. fontViewportUnit: 'vw',// 需要转换称为的字体单位
  20. /**
  21. * 需要忽略的选择器,即这些选择器对应的属性值不做单位转换
  22. * 设置为字符串,转换器在做转换时会忽略那些选择器中包含该字符串的选择器,如:['body']会匹配到 .body-class,也就意味着.body-class对应的样式设置不会被转换
  23. * 设置为正则表达式,在做转换前会先校验选择器是否匹配该正则,如果匹配,则不进行转换,如[/^body$/]会匹配到 body 但是不会匹配到 .body
  24. */
  25. selectorBlackList: [],
  26. minPixelValue: 1, // 最小的像素单位值
  27. mediaQuery: false, // 是否转换媒体查询中设置的属性值
  28. replace: true, // 替换包含vw的规则,而不是添加回退
  29. /**
  30. * 忽略一些文件,如'node_modules'
  31. * 设置为正则表达式,将会忽略匹配该正则的所有文件
  32. * 如果设置为数组,那么该数组内的元素都必须是正则表达式
  33. */
  34. exclude: [],
  35. landscape: false, // 是否自动加入 @media (orientation: landscape),其中的属性值是通过横屏宽度来转换的
  36. landscapeUnit: 'vw', // 横屏单位
  37. landscapeWidth: 1334 // 横屏宽度
  38. })
  39. ]
  40. }
  41. }
  42. }
  43. }

PC 端适配

  1. 适配方法同移动端,但如果使用的是方案1和方案2,需要修改 lib-flexible 包中的 flexible.js 代码,注释掉如下的判断条件代码,让其在宽度大于540像素也适用。
  1. function refreshRem(){
  2. var width = docEl.getBoundingClientRect().width;
  3. // if (width / dpr > 540) {
  4. // width = 540 * dpr;
  5. // }
  6. var rem = width / 10;
  7. docEl.style.fontSize = rem + 'px';
  8. flexible.rem = win.rem = rem;
  9. }
  1. 如果需要在屏幕窗口变动时能无延迟适配窗口,可以修改 lib-flexible 包中的 flexible.js 代码:
  1. win.addEventListener('resize', function() {
  2. clearTimeout(tid);
  3. tid = setTimeout(refreshRem, 0);
  4. }, false);
  5. win.addEventListener('pageshow', function(e) {
  6. if (e.persisted) {
  7. clearTimeout(tid);
  8. tid = setTimeout(refreshRem, 0);
  9. }
  10. }, false);

本文转载自: https://blog.csdn.net/weixin_42754922/article/details/128157035
版权归原作者 安之若素づ 所有, 如有侵权,请联系我们删除。

“Vue 移动端、PC 端适配”的评论:

还没有评论