问题
设置了text-align 和 line-height属性 实现水平和垂直方向居中,在iOS端显示正常居中。但在Android机型特别是小米手机上仅水平居中,垂直方向上会向上偏移。
解决方案
网上大佬表示:
- 单纯使用CSS是无法解决的:
即使解决了也是一种通过微调来实现的hack方法,因为文字在content-area内部渲染的时候已经偏移了,而css的居中方案都是控制的整个content-area的居中
简单说就是:文字在渲染时本身就是偏移的。
的确,自己尝试了
① view中文字包裹text标签并设置为block属性,用于设置居中布局 —— 不行
② 对view使用flex布局,设置内部元素水平垂直方向都居中 —— 但无效果
(补充: flex 可用于内部多块元素之间的布局设置,属于外部设置。对于块内文字的布局设置这类内部布局,使用flex并无效果,即使设置文字的为block属性)
- 大佬认为导致这个问题的本质原因可能是Android在排版计算的时候参考了primyfont字体的相关属性(即HHead Ascent、HHead Descent等),而primyfont的查找是看
font-family
里哪个字体在fonts.xml里第一个匹配上,而原生Android下中文字体是没有family name的,导致匹配上的始终不是中文字体,所以解决这个问题就要在font-family
里显式申明中文,或者通过什么方法保证所有字符都fallback到中文字体。
简单说就是:Android下 对文字的排版方面没有中文字体,导致渲染出来的不是中文字体。 - 根据这2个思路,给出2个解决方案:
① 针对Android 7.0+设备:<html>上设置 lang 属性:<html lang="zh-cmn-Hans">,同时font-family不指定英文,如 font-family: sans-serif 。这个方法是利用了浏览器的字体fallback机制,让英文也使用中文字体来展示,blink早期的内核在fallback机制上存在问题,Android 7.0+才能ok,早期的内核下会导致英文fallback到Noto Sans Myanmar,这个字体非常丑。
② 针对MIUI 8.0+设备:设置 font-family: miui 。这个方案就是显式申明中文的方案,MIUI在8.0+上内置了小米兰亭,同时在fonts.xml里给这个字体指定了family name:miui,所以我们可以直接设置。
通过上述,自己尝试了下
- HTML部分自己设置是 <html lang="zh-CN”>,说明HTML 的lang只要是 zh的大类就行
- font-family 我原本设置的PingFang-SC-Regular, PingFang-SC,发现在IOS和三星手机上显示还OK,不过在小米手机上 字体偏上比较明显
( 个人觉得,line-height属性在Android 显示会偏上问题,原因是
① 字体类型不是中文
② 小米手机中文类型需要特别处理,font-family: miui
PS:后来又尝试使用flex布局 控制居中,发现在iOS和Android上显示正常居中了,不清楚是否是小程序后来实现了兼容。