0


vue项目:大屏自适应解决方案(两种)

css缩放方案: 利用transform:scale 进行适配

推荐使用v-scale-screen

值得注意的是:

vue 2.6、2.7 要使用

  1. npm install v-scale-screen@1.0.2

vue3:要使用v-scale-screen版本

  1. npm install v-scale-screen@2.0.0

用法:

  1. <v-scale-screen width="1920" height="1080">
  2. </v-scale-screen>

Api详见: README.md · v3.0 · mirrors / Alfred-Skyblue / v-scale-screen · GitCode

rem方案

原理: 利用html的font-size变换,在移动端也经常使用此方法。

第一步

在utils目录下创建flexible.js, 复制下方代码。黏贴保存。

注意可能会有报错, 因为eslint, 使用设置好格式化插件的格式化一下就行了。

  1. (function (win, lib) {
  2. var doc = win.document;
  3. var docEl = doc.documentElement;
  4. var metaEl = doc.querySelector('meta[name="viewport"]');
  5. var flexibleEl = doc.querySelector('meta[name="flexible"]');
  6. var dpr = 0;
  7. var scale = 0;
  8. var tid;
  9. var flexible = lib.flexible || (lib.flexible = {});
  10. if (metaEl) {
  11. console.warn("将根据已有的meta标签来设置缩放比例");
  12. var match = metaEl.getAttribute("content").match(/initial-scale=([d.]+)/);
  13. if (match) {
  14. scale = parseFloat(match[1]);
  15. dpr = parseInt(1 / scale);
  16. }
  17. } else if (flexibleEl) {
  18. var content = flexibleEl.getAttribute("content");
  19. if (content) {
  20. var initialDpr = content.match(/initial-dpr=([d.]+)/);
  21. var maximumDpr = content.match(/maximum-dpr=([d.]+)/);
  22. if (initialDpr) {
  23. dpr = parseFloat(initialDpr[1]);
  24. scale = parseFloat((1 / dpr).toFixed(2));
  25. }
  26. if (maximumDpr) {
  27. dpr = parseFloat(maximumDpr[1]);
  28. scale = parseFloat((1 / dpr).toFixed(2));
  29. }
  30. }
  31. }
  32. if (!dpr && !scale) {
  33. // var isAndroid = win.navigator.appVersion.match(/android/gi);
  34. var isIPhone = win.navigator.appVersion.match(/iphone/gi);
  35. var devicePixelRatio = win.devicePixelRatio;
  36. if (isIPhone) {
  37. // iOS下,对于2和3的屏,用2倍的方案,其余的用1倍方案
  38. if (devicePixelRatio >= 3 && (!dpr || dpr >= 3)) {
  39. dpr = 3;
  40. } else if (devicePixelRatio >= 2 && (!dpr || dpr >= 2)) {
  41. dpr = 2;
  42. } else {
  43. dpr = 1;
  44. }
  45. } else {
  46. // 其他设备下,仍旧使用1倍的方案
  47. dpr = 1;
  48. }
  49. scale = 1 / dpr;
  50. }
  51. docEl.setAttribute("data-dpr", dpr);
  52. if (!metaEl) {
  53. metaEl = doc.createElement("meta");
  54. metaEl.setAttribute("name", "viewport");
  55. metaEl.setAttribute(
  56. "content",
  57. "initial-scale=" +
  58. scale +
  59. ", maximum-scale=" +
  60. scale +
  61. ", minimum-scale=" +
  62. scale +
  63. ", user-scalable=no"
  64. );
  65. if (docEl.firstElementChild) {
  66. docEl.firstElementChild.appendChild(metaEl);
  67. } else {
  68. var wrap = doc.createElement("div");
  69. wrap.appendChild(metaEl);
  70. doc.write(wrap.innerHTML);
  71. }
  72. }
  73. function refreshRem() {
  74. var width = docEl.getBoundingClientRect().width;
  75. if (width / dpr > 1920) {
  76. // 这个位置划重点 1920是设计稿的大小 如果你的设计稿是750 那么就需要将1920替换成750
  77. width = (docEl.clientWidth / 1920) * 1920;
  78. }
  79. var rem = width / 10;
  80. docEl.style.fontSize = rem + "px";
  81. flexible.rem = win.rem = rem;
  82. }
  83. win.addEventListener(
  84. "resize",
  85. function () {
  86. clearTimeout(tid);
  87. tid = setTimeout(refreshRem, 300);
  88. },
  89. false
  90. );
  91. win.addEventListener(
  92. "pageshow",
  93. function (e) {
  94. if (e.persisted) {
  95. clearTimeout(tid);
  96. tid = setTimeout(refreshRem, 300);
  97. }
  98. },
  99. false
  100. );
  101. if (doc.readyState === "complete") {
  102. doc.body.style.fontSize = 12 * dpr + "px";
  103. } else {
  104. doc.addEventListener(
  105. "DOMContentLoaded",
  106. function () {
  107. doc.body.style.fontSize = 12 * dpr + "px";
  108. },
  109. false
  110. );
  111. }
  112. refreshRem();
  113. flexible.dpr = win.dpr = dpr;
  114. flexible.refreshRem = refreshRem;
  115. flexible.rem2px = function (d) {
  116. var val = parseFloat(d) * this.rem;
  117. if (typeof d === "string" && d.match(/rem$/)) {
  118. val += "px";
  119. }
  120. return val;
  121. };
  122. flexible.px2rem = function (d) {
  123. var val = parseFloat(d) / this.rem;
  124. if (typeof d === "string" && d.match(/px$/)) {
  125. val += "rem";
  126. }
  127. return val;
  128. };
  129. })(window, window["lib"] || (window["lib"] = {}));

在main.js中导入一下就行

  1. import '@/utils/flexible'

第二步

利用vscode插件

扩展搜索:

填写内容:

设计稿的宽度 * 0.1 = 填写的数字

1920 * 0.1 = 192

750 * 0.1 = 75

使用展示

选择第二个选项就会自动计算出来啦

参考链接:javascript - vue大屏自适应解决方案_个人文章 - SegmentFault 思否


本文转载自: https://blog.csdn.net/qq_44560147/article/details/128019723
版权归原作者 梦居少年 所有, 如有侵权,请联系我们删除。

“vue项目:大屏自适应解决方案(两种)”的评论:

还没有评论