前端適配通用js文件

1.在需要的項目或者頁面中引入該js文件即可(文字大小會隨根節點變化 不同尺寸下展示效果不一直)

// 新建JS文件拷入下方代碼
(function flexible(window, document) {
  var docEl = document.documentElement; 
    
  var dpr = window.devicePixelRatio || 1;
  var isIframe = window.self !== window.top;
  if (isIframe) {
    // 當前頁面被嵌套在一個iframe中
    console.log("當前頁面在iframe中。");
  } else {
    // 當前頁面不在iframe中
    console.log("當前頁面不在iframe中。");
  }

  // adjust body font size
  // function setBodyFontSize () {
  //   if (document.body) {
  //     document.body.style.fontSize = (12 * dpr) + 'px'
  //   }
  //   else {
  //     document.addEventListener('DOMContentLoaded', setBodyFontSize)
  //   }
  // }
  // setBodyFontSize();
  function detectZoom() {
    let ratio = 0;
    const screen = window.screen;
    const ua = navigator.userAgent.toLowerCase();
    if (window.devicePixelRatio !== undefined) {
      ratio = window.devicePixelRatio;
    } else if (~ua.indexOf("msie")) {
      if (screen.deviceXDPI && screen.logicalXDPI) {
        ratio = screen.deviceXDPI / screen.logicalXDPI;
      }
    } else if (
      window.outerWidth !== undefined &&
      window.innerWidth !== undefined
    ) {
      ratio = window.outerWidth / window.innerWidth;
    }
    if (ratio) {
      ratio = Math.round(ratio * 100);
    }
    return ratio;
  }
  // set 1rem = viewWidth / 10
  function setRemUnit() {
    var rem = docEl.clientWidth / 120;
    if (!isIframe) {
      if(document.body){
        document.body.classList.add('hidden');
      } 
      if(document.body){ 
        setTimeout(() => {
          document.body.classList.remove('hidden');
        }, 100);
      
      } 
      let zoom = 100 / detectZoom();
      // console.log(rem, zoom,'zoom')
      if(zoom < 1.2 && zoom > 0.8){
        docEl.style.fontSize = rem + rem * (1 - zoom  )  + "px";
      }else if(zoom >= 1.2){
        docEl.style.fontSize = rem + rem * (1 - 1.2  )  + "px";
      }else if(zoom <= 0.8){
        docEl.style.fontSize = rem + rem * (1 - 0.8  )  + "px";
      }
     
    
    } else {
      //獲取 window.top.document font-size
      var fontSize = window.top.document.documentElement.style.fontSize;
      docEl.style.fontSize = fontSize;
    }
  }

  setRemUnit();
  function throttle(func, delay) {
    let timer = null;
    return function() {
        if (!timer) {
            timer = setTimeout(function() {
                func.apply(this, arguments);
                timer = null;
            }, delay);
        }
    };
}
  // reset rem unit on page resize
  window.addEventListener("resize", throttle(setRemUnit,200));
  window.addEventListener("pageshow", function (e) {
    if (e.persisted) {
      setRemUnit();
    }
  });

  // detect 0.5px supports
  if (dpr >= 2) {
    var fakeBody = document.createElement("body");
    var testElement = document.createElement("div");
    testElement.style.border = ".5px solid transparent";
    fakeBody.appendChild(testElement);
    docEl.appendChild(fakeBody);
    if (testElement.offsetHeight === 1) {
      docEl.classList.add("hairlines");
    }
    docEl.removeChild(fakeBody);
  }

  window.addEventListener('mousewheel', function (event) {
    if (event.ctrlKey === true || event.metaKey) {
          let zoom =  detectZoom();
          if(zoom <=  80 && event.deltaY > 0){
            event.preventDefault();
          }else if(zoom >= 120 && event.deltaY < 0){
            event.preventDefault();
          }
      }
  }, {passive: false});

  //firefox
  window.addEventListener('DOMMouseScroll', function (event) {
    if (event.ctrlKey === true || event.metaKey) {
      let zoom =  detectZoom();
      if(zoom <=  80 && event.deltaY > 0){
        event.preventDefault();
      }else if(zoom >= 120 && event.deltaY < 0){
        event.preventDefault();
      }
  }
  }, {passive: false}); 
 
  document.addEventListener('keydown', function (event) {
    const zoom = detectZoom(); // 獲取屏幕縮放比例 
    if ((event.ctrlKey || event.metaKey) && [61, 107, 173, 109, 187, 189].includes(event.which)) {
        if ((zoom >= 120 && (event.which === 107 || event.which === 61)) || (zoom <= 80 && (event.which === 109 || event.which === 173))) {
            event.preventDefault(); // 阻止默認行為
        } 
    }
}, false);
})(window, document);

2.在需要的項目或者頁面中引入該js文件即可(文字大小不會隨根節點變化及不同尺寸下展示效果一直)

(function (window, document) {
  var docEl = document.documentElement;
  var resizeEvt =
    "orientationchange" in window ? "orientationchange" : "resize";
  var recalc = function () {
    var clientWidth = docEl.clientWidth;
    if (!clientWidth) return;

    // 以設計稿寬度 1920px 為基準,調整根字體大小
    // 目標:1rem = 16px, 基準寬度:1920px
    docEl.style.fontSize = (clientWidth / 1920) * 16 + "px";
  };

  function detectZoom() {
    let ratio = 0;
    const screen = window.screen;
    const ua = navigator.userAgent.toLowerCase();
    if (window.devicePixelRatio !== undefined) {
      ratio = window.devicePixelRatio;
    } else if (~ua.indexOf("msie")) {
      if (screen.deviceXDPI && screen.logicalXDPI) {
        ratio = screen.deviceXDPI / screen.logicalXDPI;
      }
    } else if (
      window.outerWidth !== undefined &&
      window.innerWidth !== undefined
    ) {
      ratio = window.outerWidth / window.innerWidth;
    }
    if (ratio) {
      ratio = Math.round(ratio * 100);
    }
    return ratio;
  }

  window.addEventListener('mousewheel', function (event) {
    if (event.ctrlKey === true || event.metaKey) {
          let zoom =  detectZoom();
          if(zoom <=  80 && event.deltaY > 0){
            event.preventDefault();
          }else if(zoom >= 120 && event.deltaY < 0){
            event.preventDefault();
          }
      }
  }, {passive: false});

  //firefox
  window.addEventListener('DOMMouseScroll', function (event) {
    if (event.ctrlKey === true || event.metaKey) {
      let zoom =  detectZoom();
      if(zoom <=  80 && event.deltaY > 0){
        event.preventDefault();
      }else if(zoom >= 120 && event.deltaY < 0){
        event.preventDefault();
      }
  }
  }, {passive: false}); 

  // 初始調用
  if (!document.addEventListener) return;
  window.addEventListener(resizeEvt, recalc, false);
  document.addEventListener("DOMContentLoaded", recalc, false);
  // 調用一次 recalc 來初始化字體大小
  recalc();
})(window, document);
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容