在Mac/PC上(元素外部),字体渲染/行高问题

77

设计

信息挂件内容应该垂直居中,如下图所示:

原始 PSD 设计


编码设计

Windows:Chrome 20 / FF 14 / IE 9

Windows 编码设计

Mac(Lion / Mt. Lion):Chrome / FF

Mac 编码设计


代码

HTML

<div class="info">
    <div class="weather display clearfix">
        <div class="icon"><img src="imgs/icons/thunderstorms.png" align="Thunderstorms" /></div>

        <div class="fl">
            <p class="temperature">82&deg; / 89&deg;</p>
            <p class="conditions">Thunderstorms</p>
        </div>
    </div>
    <div class="time display">
        <p>11:59 <span>AM</span></p>
    </div>
    <div class="date display clearfix">
        <p class="number fl">23</p>
        <p class="month-day fl">Jun <br />Sat</p>
    </div>
</div><!-- //.info -->

CSS

.info {
    display:table;
    border-spacing:20px 0;
    margin-right:-20px;
    padding:6px 0 0;
}
    .display {
        background-color:rgba(255, 255, 255, .2);
        border-radius:10px;
        -ms-border-radius:10px;
        color:#fff;
        font-family:"Cutive", Arial, sans-serif;
        display:table-cell;
        height:70px;
        vertical-align:middle;
        padding:3px 15px 0;
    }
        .display p {padding:0;line-height:1em;}
        .time, .date {padding-top:5px;}
            .time p, .date .number {font-size:35px;}
            .time span, .display .month-day, .conditions {
                font-size:14px;
                text-transform:uppercase;
                font-family:"Maven Pro", Arial, sans-serif;
                line-height:1.15em;
                font-weight:500;
            }
            .display .month-day {padding-left:5px;}
            .icon {float:left;padding:0 12px 0 0}
            .display .temperature {font-size:24px;padding:4px 0 0;}
            .display .conditions {text-transform:none;padding:2px 0 0;}
    .lt-ie9 .display { /* IE rgba Fallback */
        background:transparent;
        filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#20ffffff,endColorstr=#20ffffff);
        zoom:1;
    } 

问题

从上面的编码设计图片中可以看出,文本似乎会扰乱对齐。经过进一步查看,在Mac上,文本被呈现在元素之外。

Windows

Windows 编码设计对齐

Mac

Mac 编码设计对齐


注意

我使用 Google Web Fonts 样式表嵌入字体。


已测试

我尝试了以下方法:

  • 在每个元素上设置行高。
  • 在每个元素上设置字重。
  • 在每个元素上设置高度。
  • 在每个元素上使用高度/顶部内边距的组合。
  • 使用百分比/em/px进行填充。

似乎无论我尝试什么,内容在Mac和PC上都不会完美地居中对齐。


我的问题

有可能以简单的方式实现我想要做的吗?

我应该放弃 display:table-cell; 方法,在每个元素和子元素上设置特定的高度/内边距?在两个操作系统之间仍然会遇到填充/间距问题。

我应该将这个问题归类为什么类型?行高?表格单元格?操作系统?等等......

提前致谢!


你在使用CSS重置吗?如果是的话,你用的是什么? - user570350
是的,我正在使用自定义的CSS重置,但它不像normalize css。 - rebz
18
很难相信这个问题在网上没有更多的讨论。 - BjarkeCK
1
我在某个地方读到过,使用FontForge可以修改垂直间距,如果有人知道如何使用FontForge修复这个问题,那将是一个非常好的答案。 - Dan
有关FontForge的答案,请参见我下面的回答。 - Luke
我认为 line-height: initial; 可以解决你的问题。 :) - w3debugger
11个回答

42
如果使用不同的字体(如Arial)解决了问题,则问题出在字体上,而不是CSS上。正如您所注意到的,不同浏览器中字体呈现有所不同。
可能的解决方案之一是下载Cutive字体(我看到它有SIL许可证),然后通过Font Squirrel字体转换器运行。在“专家”模式下,有一个“修复垂直度量”选项,这可能是您正在寻找的内容。

这似乎是唯一的建议来解决这个问题,我已经测试了4种字体,它们没有被修复。因此,我相信这可能会有几次起作用。 - Dan
8
谢谢您提供的“Font Squirrel字体生成器”的提示 - 这就解决了! - avs099
1
谢谢!修复垂直度量让我省了数小时的头痛。 - Carlos Rodriguez
根据我的经验(曾经担任过一段时间的印刷设计师),免费字体往往缺乏像这样的细节关注。 免费字体往往更接近于一组字母数字字符,而付费字体将具有许多其他功能,例如字距,连字等。 在假定免费字体将在生产中无懈可击之前,检查任何免费字体是很重要的。 - jaasum
9
不幸的是,Font Squirrel称我的字体被列入黑名单(尽管我合法购买了它),因此我改用了transfonter.org上的“修正垂直度量”选项。效果非常好!谢谢。 - Mike
3
我很感激这个回答(特别是因为已经有很多人点赞,这让我很受鼓舞),但我发现更容易免费下载FontForge并调整我的woff字体,直到它正常工作:https://dev59.com/qWgt5IYBdhLWcg3w5xg_#39425906 - Ryan

12

我认为使用这个网站https://transfonter.org/会节省你的时间,而不必下载FontForg程序,上传字体并切换“修复垂直度量”,然后点击转换,它将为您提供可下载的zip文件夹,其中包含您选择的所有类型。enter image description here


太棒了,你救了我的一天。 - tarek noaman
那是一个非常棒的工具,我必须说。 - John Miller

10

我遇到了一个关于客户品牌字体的问题。我使用Font Forge打开了TTF字体。为了使渲染更加统一,我调整了Element->Font Info->OS/2->Metrics中的值。

Win Ascent/Descent的值似乎与其他值的工作方式不同。我有以下值:

Win Ascent: 1000

Win Descent: 0

Typo Ascent: 750

Typo Descent: -250

HHead Ascent: 750

HHead Descent: -250

我将Win Ascent和Descent的值更改为:

Win Ascent: 750

Win Descent: 250 (注意正值)

看起来你需要匹配这些值,除了在我的情况下,我需要将Win Descent的值反转为正数。

我对字体的知识非常有限,但这确实解决了我的问题。我生成了TTF字体,然后通过网页字体生成器运行它。现在这些字体在Mac/Windows 7/Android/iOS上呈现出相同的效果。

希望这能帮助到某个人。


谢谢!当我尝试在运行Windows的浏览器中使用Gill Sans字体系列时,这对我很有用。 - MaxAuray

7
对于无法使用Font Squirrel的人,我可以确认,对于我所处理的字体,这个问题可以在 Font Forge 中解决。基于 Luke 提供的答案,以下是我所遵循的步骤(这里没有新信息,只是提供易于操作的说明):
1)安装免费的 FontForge 从以下链接下载: https://fontforge.github.io/ 2)在 FontForge 中打开有问题的字体
3)选择 Element > Font Info enter image description here 4)在左边的面板中,单击 OS/2,然后单击 Metrics 标签
5)将 Win Ascent 更改为与 HHead Ascent 相同的数字,并将 Win Descent 更改为 HHead Descent 的正值(即去掉负号),然后单击 OK。 (如果这些数字不能解决问题,请尝试调整它们,直到找到适合您特定字体的数字解决问题。) enter image description here 6)单击 File > Generate Fonts。选择您的字体的字体类型。如果字体是 .otf 字体,则选择 OpenType(CFF)。取消选中“保存之前验证”。为您的新字体文件设置名称。单击 Generate。 enter image description here 感谢所有为这个问题做出回答的人!

这个对我非常有效,因为我在MacOS上遇到了字体渲染与基于Win的系统不同的问题,而行高设置只会改变字体字母的外部高度。非常感谢! - Александр Фишер
然而对我来说有一个不同之处,我正在解决一个中文字体的问题,需要进行两个不同的步骤:在(3)中,不要选择“元素”>“字体信息”,而是选择“CID”>“CID字体信息”;在(6)中选择OpenType CID格式。所有其他步骤都相同。 - Eric Wong

5

我对这个(非常恼人的问题)的解决方案是:

  • 将所有元素设置为float:left;

  • 设置明确的行高;

享受跨浏览器/平台css荒谬的胜利。


1
我不得不在我的全局CSS中为基本元素(例如button { line-height: 16px; })添加显式的行高,以便在MacOS / Windows上具有相同的行高,即使使用了相同的字体家族。为什么会这样呢?这个问题出现在Open Sans上。 - Robin Wieruch

2
我也遇到了这个问题。Luke的答案对我很有帮助。我需要使用FontForge进行字体调整,使用以下设置: FontForge Settings 取消所有“Is offset”复选框以及“Really use Typo metrics”复选框。我在Firefox和IE上遇到了最大的问题。调整“Win Descent”的值可以解决这两个浏览器的问题。

1

问题的一部分可能在于Windows/Mac OSX渲染字体的方式。特别是那些通过@font-face引入的字体。您尝试更换使用的字体格式了吗?


我正在使用Google Web Fonts。如果我使用Arial字体,字体垂直对齐得很好。所以,是一个字体渲染问题。但是,我不确定它是否是基于@font-face的问题。我还没有测试过,看看如果用户在他们的计算机上安装了字体,渲染输出会是什么样子。 - rebz

1

我遇到了同样的问题,使用FastFonts提供的自定义字体(Trade Gothic)。

Windows表现正常,但Linux系统、Mac、iOS和Android上的所有其他浏览器都出现了问题。

我的唯一解决办法是匹配用户代理,并将body标签命名空间化为.not-win。

然后我的样式可以覆盖非Windows设备特定的行高。


1

由于您在回复Jordan Brown的评论中说使用Arial字体可以使对齐完美,因此这是一个字体问题。很可能是创建您的字体的人没有正确设置上升值。

如果您有TTF,请将其上传到FontSquirrel,选择“专家”选项,然后保留所有默认选项。我认为修复它的一个选项是“修复垂直度量标准”。但是,当更改默认值时,我遇到了问题,因此建议将它们保持不变。

现在,字体行高在MAC和PC上呈相同渲染效果(对我有效)。


0

这是由于字体格式历史和 Windows/Mac 之间的竞争造成的,在计算行高度的方法上存在差异,如果字体中未同步,则在某些系统上可能会出现问题。

您需要修复您的字体(如果许可证允许)或切换到没有此问题的字体。

更好的方式是不要让您的设计依赖于一个精确值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接