text-size-adjust bug 分析

lnyx發表於2019-03-04

本文首發於 dawei.lv

某日,同事 J 說發現一個奇怪的現象:一個列表頁,在 iPhone7 豎屏上字型大小正常,橫屏的時候有些字型就變的特別大。本文便是筆者對這一 “bug” 的分析過程。

拿到那個頁面,在 MacOS Chrome 下模擬了 iPhone7 的裝置,發現橫豎屏都是正常的。又在自己的手機上測了一下,果然重現了。如下圖:

example.png

因為這個頁面是響應式頁面,對手機橫版做了適配,筆者猜測可能是對應的樣式沒應用上。但轉念一想,不對啊,就算是樣式沒應用上,也應該是整個列表都有問題,不可能就那一個 item 字型有問題。

在除錯了幾次樣式無果後,筆者猜測是 webkit 對字型在某種情況下的“人性化智慧”縮放導致,類似桌面端的 Chrome 對 12px 以下字型的限制,具體是什麼原因導致的不知道。Google 一番發現有個屬性很可能是導致這個 bug 原因:text-size-adjust

引用 MDN 上對 text-size-adjust 的解釋:

text-size-adjust 屬性 允許我們控制將文字溢位演算法應用到一些手機裝置上。這個屬性還沒有寫進標準,使用時必須加上字首:-moz-text-size-adjust,-webkit-text-size-adjust,,和 -ms-text-size-adjust。

因為縮放適配小螢幕而導致文字會變得很小,許多手機瀏覽器會使用文字溢位演算法讓文字變大而更易讀。當一個包含文字的元素寬度用了 100%,他的文字大小會增加直到達到一個易讀的大小,但是不會修改佈局。

So? Feature not bug?????

筆者嘗試在 item 容器樣式上加了一個 -webkit-text-size-adjust:none,發現樣式正常了。

到底是什麼情況下 text-size-adjust 會自動調整呢?筆者寫了幾個例子,來還原這 bug,注意使用 iPhone 開啟,並觀察橫豎屏:

分析了一下 text-size-adjust 出現的可能情況:

  1. 容器寬度為百分比,不光 100% 的時候;
  2. 列表項中至少有 2 個元素應用了相同的字型,單個元素沒有出現放大的效果;
  3. 容器寬度比 viewport 的寬度大,不論是百分比 120% 還是固定值 px;

修復的方法:

  1. 設定一個比 viewport 窄的固定值;
  2. 在外層樣式上應用 text-size-adjust:nonetext-size-adjust:100%兩種設定等效,沒有用 autoprefix 的同學記得加上廠商字首,經測試,不帶 -webkit 字首的 text-size-adjust:none 是無效的。
    html {
      -ms-text-size-adjust: 100%;
      -webkit-text-size-adjust: 100%;
      text-size-adjust: 100%;
    }
    複製程式碼

另外,text-size-adjust 在 iPhone 上預設值為 auto,iPad 上的預設值為 none,所以 iPad 並不會出現該 bug。

參考:

相關文章