adaptive.js 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. ;(function (win, lib) {
  2. var doc = win.document;
  3. var docEl = doc.documentElement;
  4. var devicePixelRatio = win.devicePixelRatio;
  5. var dpr = 1; // 物理像素与逻辑像素的对应关系
  6. var scale = 1; // css像素缩放比率
  7. // 设置viewport
  8. function setViewport() {
  9. var isIPhone = !!win.navigator.appVersion.match(/iphone/gi);
  10. if (isIPhone) {
  11. if (devicePixelRatio >= 3) {
  12. dpr = 3;
  13. }
  14. else if (devicePixelRatio === 2) {
  15. dpr = 2;
  16. }
  17. else {
  18. dpr = 1;
  19. }
  20. }
  21. win.devicePixelRatioValue = dpr;
  22. //win.devicePixelRatio = win.devicePixelRatio*win.devicePixelRatio;
  23. scale = 1 / dpr;
  24. if(scale < 1){
  25. scale = 1;
  26. }
  27. // alert(devicePixelRatio +"==="+dpr+"==="+scale);
  28. var metaEl = doc.createElement('meta');
  29. metaEl.setAttribute('name', 'viewport');
  30. metaEl.setAttribute('content', 'initial-scale=' + scale + ', maximum-scale=' + scale + ', minimum-scale=' + scale + ', user-scalable=no');
  31. if (docEl.firstElementChild) {
  32. docEl.firstElementChild.appendChild(metaEl);
  33. }
  34. else {
  35. var wrap = doc.createElement('div');
  36. wrap.appendChild(metaEl);
  37. doc.write(wrap.innerHTML);
  38. }
  39. }
  40. setViewport();
  41. var newBase = 100;
  42. function setRem() {
  43. var visualView = Math.min(docEl.getBoundingClientRect().width, lib.maxWidth * dpr); // visual viewport
  44. newBase = 100 * visualView / lib.desinWidth;
  45. docEl.style.fontSize = newBase + 'px';
  46. }
  47. var tid;
  48. lib.desinWidth = 640;
  49. lib.baseFont = 18;
  50. lib.maxWidth = 540;
  51. lib.init = function () {
  52. win.addEventListener('resize', function () {
  53. clearTimeout(tid);
  54. tid = setTimeout(setRem, 300);
  55. }, false);
  56. /*win.addEventListener('onorientationchange', function () {
  57. clearTimeout(tid);
  58. tid = setTimeout(setRem, 300);
  59. }, false);*/
  60. win.addEventListener('pageshow', function (e) {
  61. if (e.persisted) {
  62. clearTimeout(tid);
  63. tid = setTimeout(setRem, 300);
  64. }
  65. }, false);
  66. if (doc.readyState === 'complete') {
  67. doc.body.style.fontSize = lib.baseFont * dpr + 'px';
  68. }
  69. else {
  70. doc.addEventListener('DOMContentLoaded', function (e) {
  71. doc.body.style.fontSize = lib.baseFont * dpr + 'px';
  72. }, false);
  73. }
  74. setRem();
  75. docEl.setAttribute('data-dpr', dpr);
  76. };
  77. })(window, window['adaptive'] || (window['adaptive'] = {}));