Android、IOS文字居中偏离的解决方案

前言

移动端开发,经常会遇到的问题,就是文字居中。一般都只能往css方向去fix这个问题。

自己以前也用过position:relative;top:-*px的方式去解决。??

后来才发现,原来不是css的问题,是浏览器在渲染象形文字时,就已经错误了。

本文参考自知乎回答,用来总结如何填上这个坑~

一、css文字居中

先总结下,前端开发中,常用的文字居中技巧。

  • 常规方法
height:20px;
line-height:20px;

  • table-cell方式
<p class="text-wrap">
    <span class="text">文字居中</span>
</p>
.text-wrap{
    display:table;
}
.text{
    display:table-cell;
    vertical-align:middle;
}

  • position方式
<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%);
}

  • flex方式
<p class="text-wrap">
    <span class="text">文字居中</span>
</p>
.text-wrap{
    display:flex;
    justify-content:center; /* 左右居中 */
    align-items:center; /* 上下居中 */
}

二、为什么Android、IOS应用css居中不起效

因为文字在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+设备:上设置 lang 属性:,同时font-family不指定英文。

比较常用的是设置font-family: sans-serif

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

2.针对MIUI 8.0+设备:设置font-family: miui

这个方案就是显式申明中文的方案,MIUI在8.0+上内置了小米兰亭,同时在fonts.xml里给这个字体指定了family name:miui,所以我们可以直接设置。

另外,腾讯的IMWeb团队也给出了解决方案,但亲测,治标不治本。还是上述方案较为完美地解决。

参考

[1] [Android浏览器下line-height垂直居中为什么会偏离](https://www.zhihu.com/question/39516424) -- 周祺回答

[2] [Android 浏览器文本垂直居中问题](http://imweb.io/topic/5848d0fc9be501ba17b10a94) -- IMWeb解决方案

原文地址:https://www.cnblogs.com/walls/p/9050359.html

时间: 2024-12-10 11:16:09

Android、IOS文字居中偏离的解决方案的相关文章

Android TextView 文字居中

有2种方法可以设置TextView文字居中: 一:在xml文件设置:android:gravity="center" 二:在程序中设置:m_TxtTitle.setGravity(Gravity.CENTER); 备注:android:gravity和android:layout_gravity的区别在于前者对控件内部操作,后者是对整个控件操作. 例如:android:gravity="center"是对textView中文字居中 android:layout_gr

Android ToolBar标题文字居中的方法

在项目的开发中,使用苹果手机的产品,出的界面效果图极有可能(我这里是一定)完全是按照苹果的界面风格来出的,例如界面顶部的title文字位置是水平居中 如图: 那么问题来了,当我们使用ToolBar控件进行开发时,ToolBar的文字位置默认是靠左对齐的,不过这不能难道聪明的安卓开发者,解决方法如下: 1.只需要在ToolBar中添加TextView控件,设置位置为水平居中即可,代码奉上 <?xml version="1.0" encoding="utf-8"?

android canvas drawText()文字居中

近期也是在学习自己定义控件,曾经仅仅自己随便玩了下,一直认为比較难,正好如今工作轻松,每天闲着就看看书看看帖子学习自己定义控件,你还别说自己定义控件学起来还是蛮有趣的!! 这里也跟大家分享下我关于drawText()文字居中的方法. 先附上drawText()的方法说明 说实话当时看了这个,我也没明确这个x,y坐标究竟表达的啥意思,还一直以为是绘制文字中心的坐标,后来发现这个理解是错误的 要想理解这个首先看张图 像图上这样安卓的文字绘制是相对于基线绘制的,也就是图中的红线,而top+bottom

完美解决移动Web小于12px文字居中的问题

前几天的一篇博文:移动Web单行文字垂直居中的问题,提到了移动web里小于12px的文字居中异常的问题,最后还是改为12px才近乎解决了问题.但是有时候或许并不是那么乐观,你并不能将原本定为10px的字体改为12px.那该怎么办呢. 我们都知道,移动端为了高清屏显示1px的border,会有那么几种方法,通常最好的方法是transform scale,并且支持圆角.既然一个border能缩放,那么整个文字区域自然也能缩放. 比如上篇博文里的示例,CSS是这样的: .label { height:

转:?Android IOS WebRTC 音视频开发总结 (系列文章集合)

随笔分类 - webrtc Android IOS WebRTC 音视频开发总结(七八)-- 为什么WebRTC端到端监控很关键? 摘要: 本文主要介绍WebRTC端到端监控(我们翻译和整理的,译者:weizhenwei,校验:blacker),最早发表在[编风网] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:blackerteam 或 webrtcorgcn). callstats是一家做实时通讯性能测阅读全文 posted @ 2016-07-22 08:24

Delphi APP 開發入門(二)Android/iOS設定,Hello World

Delphi APP 開發入門(二)Android/iOS設定,Hello World 分享: Share on facebookShare on twitterShare on google_plusone_share 閲讀次數:9047 發表時間:2014/05/12 tags: 行動開發 教學 App Delphi XE6 Android iOS 上一期 讓大家認識Delphi以及安裝後,今天要教大家設定Delphi在Android與iOS的開發環境,並且教大家透過寫出第一個Hello W

Android中ActionBar居中

经常会用到将ActionBar文字居中的问题,这里写个代码如下: //把actionBar的文字标题居中 public static void centerActionBarTitle(Activity activity) { int titleId = activity.getResources().getIdentifier("action_bar_title", "id", "android"); if (titleId<=0)ret

css实现一行文字居中,多行文字左对齐

问题及场景: 当内容能一行显示在盒子内时,文字居中对齐. 当内容过多换行后显示在盒子内时,文字左对齐. 其实这种视觉上的需求还是蛮常见的.比如用于弹出提示框,当提示内容比较少时,内容居中显示在弹出框,提示内容比较多时,内容居左对齐.但是其纯CSS实现有点麻烦,一般就放掉这个需求,或者,使用JS实现. 解决方案: 效果如下 CSS实现代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta chars

让Spinner中的文字居中

如果套用simple_spinner_item或是simple_spinner_dropdown_item,然后直接在Spinner中用 android:gravity="center" 是无法让Spinner中的文字居中的. 这是因为Spinner中的文字其实是套在TextView中的(参考:http://www.douban.com/note/483280526/?type=like#sep). 一开始我想到的一种办法: 在spinner外面嵌套一个LinearLayout,设置a