移動端開發,常常會遇到的問題,就是文字居中。通常都只能往css方向去fix這個問題。
本身之前也用過position:relative;top:-*px
的方式去解決。🌚
後來才發現,原來不是css的問題,是瀏覽器在渲染象形文字時,就已經錯誤了。
本文參考自知乎回答,用來總結如何填上這個坑~css
先總結下,前端開發中,經常使用的文字居中技巧。html
height:20px; line-height:20px;
<p class="text-wrap"> <span class="text">文字居中</span> </p>
.text-wrap{ display:table; } .text{ display:table-cell; vertical-align:middle; }
<p class="text-wrap"> <span class="text">文字居中</span> </p>
.text-wrap{ position:relative; height:20px; /* 必須設置一個高度,通常取文字高度 。由於內容abs定位後,高度爲0*/ } .text{ position:absolute; top:50%; left:50%; transform:translate(-50%, -50%); }
<p class="text-wrap"> <span class="text">文字居中</span> </p>
.text-wrap{ display:flex; justify-content:center; /* 左右居中 */ align-items:center; /* 上下居中 */ }
由於文字在content-area內部渲染的時候就已經偏移。css的居中方案都是用來控制整個content-area的居中而已,對content-area內部不會產生實質性的影響。
致使這個問題的本質緣由多是Android在排版計算的時候參考了primyfont字體的相關屬性(即HHead Ascent、HHead Descent等)。 primyfont字體的肯定,是依據font-family
裏哪一個字體在fonts.xml裏第一個匹配上。 原生Android下中文字體是沒有family name的,致使匹配上的字體始終不是中文字體。因此渲染的時候出現誤差。 那麼,解決這個問題就要在font-family
裏顯式申明中文,或者經過什麼方法保證全部字符都fallback到中文字體。前端
1.針對Android 7.0+設備:<html>上設置 lang 屬性:<html lang="zh-cmn-Hans">,同時font-family不指定英文。web
比較經常使用的是設置font-family: sans-serif
。瀏覽器
這個方法是利用了瀏覽器的字體fallback機制,讓英文也使用中文字體來展現。blink早期的內核在fallback機制上存在問題,Android 7.0+才能ok,早期的內核下會致使英文fallback到Noto Sans Myanmar,這個字體很是醜。字體
2.針對MIUI 8.0+設備:設置font-family: miui
。flex
這個方案就是顯式申明中文的方案,MIUI在8.0+上內置了小米蘭亭,同時在fonts.xml裏給這個字體指定了family name:miui,因此咱們能夠直接設置。ui
另外,騰訊的IMWeb團隊也給出瞭解決方案,但親測,治標不治本。仍是上述方案較爲完美地解決。spa
[1] Android瀏覽器下line-height垂直居中爲何會偏離 -- 周祺回答 [2] Android 瀏覽器文本垂直居中問題 -- IMWeb解決方案code