【问题标题】:Two div.textContent with same font, size and color are rendered differently in Chrome两个具有相同字体、大小和颜色的 div.textContent 在 Chrome 中的呈现方式不同
【发布时间】:2017-11-28 21:48:27
【问题描述】:

我有 2 个具有相同文本的 div,它们在 Chrome 中的呈现方式不同。

附图是正常大小的两个文本元素的屏幕截图并放大,其中差异更加明显。

这两个元素之间的唯一区别是顶部元素在 HTML 文件中硬编码为 span,而底部元素以编程方式生成为 inline-block div,并在运行时附加。在运行时以编程方式生成它们也不会使它们呈现相同的效果。

为什么会发生这种情况?是否可以让它们呈现相同的效果?

这两个元素的样式都使用字体Muli-Semibold,大​​小12,颜色#45B4E4

@font-face {

    font-family: "Muli-Semibold";
    font-weight: 600;
    font-style: normal;
    src: url("../../fonts/Muli-Semibold.woff2") format("woff2");
}

【问题讨论】:

    标签: javascript html css google-chrome fonts


    【解决方案1】:

    这实际上与您的字体无关,而是因为您的元素的位置不同。

    您所看到的称为抗锯齿(或此处字体平滑),它的完成方式是屏幕上的红、绿和蓝点将呈现尽可能小的线条(所以看起来更平滑)。

    该算法显然会为您在像素坐标中的位置输出不同的平滑值。例如,如果一切都完全适合精确的像素,则不会有任何平滑。

    但是对于文本,您几乎永远不会使用真正的像素。例如,根据您的规则,我的 chrome 上的第一个跨度为 42.65625px。这意味着下一个内联元素不会从有限像素开始。

    这是一个示例,显示从相同 x 值开始的块元素将具有与原始跨度相同的校正,而内联元素将具有不同的校正。

    var d = document.createElement('div');
    d.textContent = 'testing';
    document.body.appendChild(d);
    document.body.appendChild(d.cloneNode(1));
    d.classList.add('inline')
    body{
        color: #45B4E4;
    }
    div.inline{
      display: inline-block;
    }
    <span>testing</span>

    对于一种解决方法...这很难,因为这可能是由浏览器或操作系统直接引起的。不过,将所有元素放在圆角像素坐标上可能会限制差异。

    【讨论】:

    • 我注意到这在 Firefox 中没有发生,只有在 Chrome 中。我似乎无法通过移植我的代码来重现问题 - this 是我可以共享的最接近的,但问题不再可见,即使调整窗口大小(我正在使用 vhvw)字体别名不会改变。
    • @TheDarkIn1978 我不确定我是否理解您的评论。我可以重现您所描述的内容(在 FF 和 chrome 上)。无论窗口大小如何,字体平滑都会发生。您唯一可以尝试做的就是使两者具有相同的校正,因为它们都将占据相同的 x 和 y 浮动精度。但无论如何,大多数字体都不是像素对齐的,所以你总是会有抗锯齿。
    • 我相信这里有一些误解。在我的原始屏幕截图中,抗锯齿之间存在差异。顶部包含其他颜色以及文本的蓝色,而底部仅包含文本的蓝色,即使它也已抗锯齿。它们都是抗锯齿的,但它们的渲染方式不同。这会影响文本的清晰度,因为底部的文本似乎具有较重的重量和颜色,但与顶部的相同。
    • @TheDarkIn1978 在我的屏幕截图中,您可以看到这发生在内联元素(右边的那个)上(因为它的 x 精度与跨度的不同),而块元素几乎产生相同的抗锯齿(因为它的 x 和 y 精度相同)。
    • 是的,我看到它们在您的示例中略有不同,但它们仍然具有彩色抗锯齿功能,因此即使它们不同,它们仍然看起来非常相似。但是,我的两个文本的亚像素渲染是不同的,因为一个包含额外的颜色,而另一个没有。几乎就像在应用蓝色之前将抗锯齿渲染为灰度一样。 Example here.
    猜你喜欢
    • 2021-01-02
    • 1970-01-01
    • 1970-01-01
    • 2012-12-19
    • 2016-04-21
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多