83

CSS トランジションを使用して、CSS 変換状態間を遷移させています (基本的に要素のスケールを遷移させます)。要素が遷移しているとき、(Webkit 内の) ページ上の残りのテキストは、遷移が完了するまでそのレンダリングをわずかに変更する傾向があることに気付きました。

フィドル: http://jsfiddle.net/russelluresti/UeNFK/

-webkit-font-smoothing: antialiasedまた、プロパティ/値のペアを持つヘッダーではこれが発生しないことにも気付きました。したがって、テキストのデフォルトの外観(フォントスムージングの「自動」値)を維持し、遷移中にレンダリングを変更しない方法はあるのでしょうか。

「auto」値を使用するようにテキストを明示的に設定しようとしましたが、何もしません。font-smoothing を「none」に設定すると、遷移中のレンダリングの点滅も防止されることにも注意してください。

どんな助けでも大歓迎です。

編集 1

私は OS X を使用していることに注意してください。Parallels 上の Chrome でのテストを見ている間、2 つの異なる段落の動作が異なることはわかりませんでした。したがって、これは Mac 固有の問題である可能性があります。

4

9 に答える 9

84

私は解決策を見つけたと思います:

-webkit-transform: translateZ(0px);

親要素にハードウェアアクセラレーションを強制すると、問題が解決するようです...

EDIT コメントしたように、このハックはフォント スムージングを無効にし、フォント、ブラウザー、OS によってはテキストのレンダリングを低下させる可能性があります。

于 2012-10-10T13:19:20.240 に答える
45

2020年8月更新

サブピクセル フォント スムージングを有効にするために、メディア クエリで Safari をターゲットにする必要がなくなりました。デフォルトで問題ありません。

ただし、デフォルトでサブピクセル フォント スムージングを使用していますが、テキストの一貫したレンダリングを探している人にとっては、Chrome のフォント スムージングの軟膏には大きな違いがあります。

  1. これは、暗い背景に明るいテキストを表示した Chrome のレンダリングです。ライトオンダーク
  2. これは、明るい背景に暗いテキストを表示した Chrome のレンダリングです。ダークオンライト

上の文字 e の全体の大きさを見てください。暗い背景の明るいテキストは、明るい背景の暗いテキストよりもかなり重いウェイトでレンダリングされます (同じ CSS フォント スタイルを使用)。

ユーザーのダーク/ライト テーマ設定を尊重するサイトの 1 つの解決策は、ダーク モードに限定されたメディア クエリを使用して Chrome をターゲットにし、次のように非サブピクセル スムージングに切り替えることです。

@media screen
and (-webkit-min-device-pixel-ratio: 0)
and (min-resolution: 0.001dpcm)
and (prefers-color-scheme: dark) {
  body {
    -webkit-font-smoothing: antialiased;
  }
}

結果 :

ダークオンライトライト オン ダーク アンチエイリアス

明暗をレンダリングするか、明暗をレンダリングするかに関係なく、はるかに一貫したテキストの重み。

前と後の横並びの比較をチェックしてください: ライトオンダークライト オン ダーク アンチエイリアス

--

2018 年 5 月の更新

-webkit-font-smoothing: subpixel-antialiasedChromeでは効果がありませんが、Safariではまだ大幅に改善されていますが、RETINAでのみ. Retina スクリーンの Safari でこれがないと、テキストは薄くて味気ないものになりますが、これがあると、テキストは適切な重みを持ちます。ただし、これを Safari の Retina 以外のディスプレイで使用すると (特に軽量値で)、テキストは大惨事になります。media-query を使用することを強くお勧めします:

@media screen and (-webkit-min-device-pixel-ratio: 2) {
  body {
    -webkit-font-smoothing: subpixel-antialiased;
  }
}

-webkit-font-smoothing: subpixel-antialiasedアンチエイリアス処理された薄いテキストを少なくとも部分的に回避したい場合は、明示的に設定することが現在の最善の解決策です。

--tl;dr--

デフォルトのフォント レンダリングでサブピクセル アンチエイリアシングを使用する Safari と Chrome の両方で、GPU ベースのレンダリングを強制する CSS は、translateZ を使用したトランスフォームを使用したり、単にスケール遷移を使用したりする上記の提案のように、Safari と Chrome が自動的に「あきらめる」原因になります。サブピクセルでアンチエイリアス処理されたフォント スムージングの代わりに、アンチエイリアス処理されたテキストのみに切り替えます。これは、特に Safari では、より明るく、より薄く見えます。

他の回答は、単純にアンチエイリアス処理された薄いテキストにフォント スムージングを設定または強制することで、一定のレンダリングを維持することに重点を置いています。私の目には、translateZ または backface hidden を使用すると、テキスト レンダリングの品質が大幅に低下します。テキストの一貫性を維持したい場合の最良の解決策は、より薄いテキストを使用することだけ-webkit-font-smoothing: antialiasedです。ただし、明示的に設定すると、-webkit-font-smoothing: subpixel-antialiased実際にはある程度の効果があります。テキストはまだわずかに変化し、GPU でレンダリングされたトランジション中に目に見えて薄くなりますが、この設定がない場合ほど薄くはなりません。したがって、これにより、アンチエイリアス処理されたストレート テキストへの切り替えが少なくとも部分的に妨げられているように見えます。

于 2014-01-15T11:23:55.333 に答える
8

ハードウェア アクセラレーションによるテキスト レンダリングの変更を防ぐには、次のいずれかを実行できます。

  1. すべてのテキストを -webkit-font-smoothing: antialiased に設定します。これは、テキストが細く、サブピクセル アンチエイリアス処理されていないことを意味します。

  2. ハードウェア アクセラレーションの影響を受けるテキストをサブピクセル アンチエイリアス (デフォルトの種類のフォント スムージング) にしたい場合、そのテキストを境界線なしで入力内に配置し、無効にすると、そのサブピクセル アンチエイリアスが維持されます (少なくともMac OS X の Chrome で)。他のプラットフォームでこれをテストしていませんが、サブピクセル アンチエイリアシングが重要な場合は、少なくともこのトリックを使用できます。

于 2013-03-06T06:59:29.460 に答える
1

上記の解決策 (-webkit-transform: translateZ(0px)要素上および-webkit-font-smoothing: antialiasedページ上) に加えて、一部の要素はまだ動作が悪い場合があります。私にとっては、入力要素のプレースホルダー テキストでした。position:relative

于 2014-05-15T16:57:09.503 に答える
1

font-smoothing: antialiasedレンダリングの変更を防ぐには、 (または)を設定する必要がありますnone

ブラウザーがサブピクセル フォントのレンダリングを無効にしているのは、ハードウェア アクセラレーションの副作用である可能性があります。レンダリング対象の背景が常に変化している場合、各フレームをすべての背景レイヤーに対してチェックする必要があるため、テキストを別のレイヤーにレンダリングすることはできません。これにより、パフォーマンスが大幅に低下する可能性があります。

Apple は自社のサイトでサブピクセル フォント スムージングを無効にすることがよくあり ます

于 2012-09-22T12:11:21.830 に答える