flexible.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  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"] = {}));