整理一下关于”移动端line-height不能垂直居中的问题“的部分解决方案

问题背景

先说下问题背景吧,相信很多做移动端的朋友都遇到过这个问题,就是我们在设置某一个按钮的行高等于按钮本身高度的时候,在不容的手机下显示的效果会有不同,很多设备不能居中,这种现象在安卓机下面尤为严重

此问题不包括以下情况

  • 设置border并同时设置box-sizing:border-box的情况
  • 文字设置成12px以下的情况
  • line-height 减去 font-size 是奇数的情况
  • 使用rem作为line-height或者font-size的单位(会导致出现小数的px单位)的情况

问题原因

对于出现此问题的原因,互联网上有以下几种解释:

  • viewport设置成initial-scale=1的时候,物理像素和逻辑像素转换时候出现的误差
  • 英文字体和中文字体同行出现的时候,不同的渲染规则导致的行高不一致

解决方案

解决方法也查到很多,这里整理一下

  • 去掉viewport的设置(问题会更多,这根本不算是解决办法)。
  • 设置元素的line-height:normal;用padding撑开容器高度。
  • 字号内外边距等设置为需求大小的2倍,使用transform进行缩放。
  • 针对Android 7.0+设备:上设置 lang 属性:,同时font-family不指定英文,如 font-family: sans-serif。

    这个方法是利用了浏览器的字体fallback机制,让英文也使用中文字体来展示,blink早期的内核在fallback机制上存在问题,Android 7.0+才能ok,早期的内核下会导致英文fallback到Noto Sans Myanmar,这个字体非常丑。

  • 利用安卓不能识别小数px单位的特点。比如设置line-height:18.5px;安卓下会渲染成line-height:18px。
  • 设置display:table-cell。
    1
    2
    3
    display: table-cell;
    text-align: center;
    vertical-align: middle;

本文只是粗略的整理,并不全面,也不一定准确,另外,其中的解决方案并没有进行完全测试,如需要在生产环境中使用,请自行测试并选择

本文永久链接: https://www.mulianju.com/mobile-line-height/