前端適配通用js文件

1.在需要的項(xiàng)目或者頁(yè)面中引入該js文件即可(文字大小會(huì)隨根節(jié)點(diǎn)變化 不同尺寸下展示效果不一直)

// 新建JS文件拷入下方代碼
(function flexible(window, document) {
  var docEl = document.documentElement; 
    
  var dpr = window.devicePixelRatio || 1;
  var isIframe = window.self !== window.top;
  if (isIframe) {
    // 當(dāng)前頁(yè)面被嵌套在一個(gè)iframe中
    console.log("當(dāng)前頁(yè)面在iframe中涮较。");
  } else {
    // 當(dāng)前頁(yè)面不在iframe中
    console.log("當(dāng)前頁(yè)面不在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(); // 阻止默認(rèn)行為
        } 
    }
}, false);
})(window, document);

2.在需要的項(xiàng)目或者頁(yè)面中引入該js文件即可(文字大小不會(huì)隨根節(jié)點(diǎn)變化及不同尺寸下展示效果一直)

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

    // 以設(shè)計(jì)稿寬度 1920px 為基準(zhǔn),調(diào)整根字體大小
    // 目標(biāo):1rem = 16px, 基準(zhǔn)寬度: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}); 

  // 初始調(diào)用
  if (!document.addEventListener) return;
  window.addEventListener(resizeEvt, recalc, false);
  document.addEventListener("DOMContentLoaded", recalc, false);
  // 調(diào)用一次 recalc 來(lái)初始化字體大小
  recalc();
})(window, document);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末撇他,一起剝皮案震驚了整個(gè)濱河市格嘁,隨后出現(xiàn)的幾起案子牌借,更是在濱河造成了極大的恐慌吼野,老刑警劉巖聘鳞,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件葛峻,死亡現(xiàn)場(chǎng)離奇詭異锹雏,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)术奖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門礁遵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人腰耙,你說(shuō)我怎么就攤上這事榛丢。” “怎么了挺庞?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵晰赞,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我选侨,道長(zhǎng)掖鱼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任援制,我火速辦了婚禮戏挡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘晨仑。我一直安慰自己褐墅,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布洪己。 她就那樣靜靜地躺著妥凳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪答捕。 梳的紋絲不亂的頭發(fā)上逝钥,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音拱镐,去河邊找鬼艘款。 笑死持际,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的哗咆。 我是一名探鬼主播蜘欲,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼晌柬!你這毒婦竟也來(lái)了芒填?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤空繁,失蹤者是張志新(化名)和其女友劉穎殿衰,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盛泡,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡闷祥,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了傲诵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凯砍。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖拴竹,靈堂內(nèi)的尸體忽然破棺而出悟衩,到底是詐尸還是另有隱情,我是刑警寧澤栓拜,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布座泳,位于F島的核電站,受9級(jí)特大地震影響幕与,放射性物質(zhì)發(fā)生泄漏挑势。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一啦鸣、第九天 我趴在偏房一處隱蔽的房頂上張望潮饱。 院中可真熱鬧,春花似錦诫给、人聲如沸香拉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)凫碌。三九已至,卻和暖如春吃型,著一層夾襖步出監(jiān)牢的瞬間证鸥,已是汗流浹背僚楞。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工勤晚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留枉层,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓赐写,卻偏偏與公主長(zhǎng)得像鸟蜡,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子挺邀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容