天天看點

前端設定頁面字型尺寸跟随螢幕大小而進行變化

越來越多的前端項目現在需要這個操作,其操作的原因很簡單,你的項目可能跑在小尺寸分辨率的電腦上,也有可能在大尺寸的會議平闆上,更有甚者是在LED上。那麼如何讓你的項目根據螢幕分辨率的大小而自動變化,修改頁面展示字型以及調整尺寸呢?

按照我們所需功能,我們還是先來對一下流程及需求。

第一:我們要求頁面一打開就擷取螢幕大小,通過計算設定尺寸及字型大小。

第二:我們當頁面分辨率修改後(拖動、或者分辨率轉換)我們也需要設定其尺寸和大小。

鑒于以上兩種需求。我們可以提煉出。

1. 我們需要一個監測螢幕分辨率的方法。

2. 我們的頁面尺寸需要使用rem來進行編寫。

3. 我們需要根據螢幕情況來動态設定font-size

下來我們來編寫代碼:

我們建立一個檔案index.js  并将這個檔案引入到 index.html 中

在這個index.js中我們先放置一個空的自執行函數

// 項目根目錄建立檔案 util.js

放置一個自執行函數

(() => {

    // 内容

})()      

然後在這個自執行函數裡我們再寫一個函數方法,這個方法來動态設定字型大小

(() => {
  // 設定字型大小
  function calcFontSize() {
    const zoom = window.screen.width / 1920;
    const size = zoom * 16;
    document.documentElement.style.fontSize = size + 'px';
    console.log('設定字型大小', size);
  }

  

})()      

上述代碼中,我們首先擷取螢幕的大小,以1920 為主。1920分辨率下預設font-size設定為16px。至于為什麼要設定 font-size。那是因為rem的緣故,此處不了解的可以自行百度。

設定完設定字型代碼後,我們完成了上述需求的第三個,則還需要第一個跟第二個。

那下來我們再寫一個方法用來監測電腦分辨率。window.onload

(() => {
  // 設定字型大小
  function calcFontSize() {
    const zoom = window.screen.width / 1920;
    const size = zoom * 16;
    document.documentElement.style.fontSize = size + 'px';
    console.log('設定字型大小', size);
  }

  window.onload = () => {
    
    
  }

})()      

上述中window.onload 方法的意思是用于在網頁加載完畢後立刻執行的操作,即當 HTML 文檔加載完畢後,立刻執行某個方法。也就是頁面初始化的時候去加載。在這裡面我們需要昨個操作,也就是頁面一加載完的時候,我們需要去給window的 onresize 綁定一個方法。

window.onload = () => {
    console.log("頁面加載完成")
    let resize_timer = null;
    const resize = () => {
      
    }
    window.onresize = resize;
  }      

window.onresize的意思是,當監測到螢幕分辨率變的時候,是以我們需要一個操作就是,頁面一加載完成,我們給window.onresize 綁定一個方法。這個方法隻綁定一次,而不需要每次都去綁定。這樣的話,當每次螢幕分辨率改變的時候,都會去執行 resize 這個方法。

那麼這個方法裡我們應該些什麼呢?那就是調用我們第一步做的 calcFontSize 這個方法,修改整個document的font-size 屬性。

window.onload = () => {
    console.log("頁面加載完成")
    let resize_timer = null;
    const resize = () => {
       calcFontSize();
    }
    window.onresize = resize;
  }      

目前的完整代碼如下:

(() => {
  // 設定字型大小
  function calcFontSize() {
    const zoom = window.screen.width / 1920;
    const size = zoom * 16;
    document.documentElement.style.fontSize = size + 'px';
    console.log('設定字型大小', size);
  }
    calcFontSize();

  window.onload = () => {
    console.log("頁面加載完成")

    const resize = () => {
    
        calcFontSize();

    }
    window.onresize = resize;
  }

})()      

我們去頁面上檢視,會發現當我們拖動文檔流的時候,字型并不會重新設定。如下我拖了兩次都沒有觸發修改。同樣是12.8.

前端設定頁面字型尺寸跟随螢幕大小而進行變化

隻有當我們改完電腦螢幕分辨率後,它才會重新設定。就比如,我從筆記本的螢幕拖動項目到外接顯示器上。它就會響應重新設定 font-size。如下:

前端設定頁面字型尺寸跟随螢幕大小而進行變化

 當我拖到外接顯示器後,它自動的出發了 calcFontSize 方法重新配置了字型大小。

 到這裡我們的主功能就設定結束了。

但是我們發現每次觸發resize後。

前端設定頁面字型尺寸跟随螢幕大小而進行變化

我們的resize被執行了兩次?這是怎麼回事呢?

這是因為,每次window.onresize  都會去執行 resize,而在螢幕分辨率發生變化的時候,window.onresize 和浏覽器的自身實作有關系.不同的浏覽器和作業系統實作可能不一樣,目前谷歌是執行了兩次,有是時候是一次。是以導緻頁面變化有點閃動。那怎麼辦呢?

那就是去增加settimeout 來達到短時間隻觸發一次的效果。

(() => {
  // 設定字型大小
  function calcFontSize() {
    const zoom = window.screen.width / 1920;
    const size = zoom * 16;
    document.documentElement.style.fontSize = size + 'px';
    console.log('設定字型大小', size);
  }

  window.onload = () => {
    console.log("頁面加載完成")
    let resize_timer = null;
    const resize = () => {
      if (resize_timer) {
        clearTimeout(resize_timer);
      }
      resize_timer = setTimeout(() => {
        resize_timer = null;
        calcFontSize();
      }, 500);
    }
    window.onresize = resize;
  }

})()