CSS変換を使用した後のぼやけたテキスト:scale(); Chromeで


126

最近のGoogle Chromeの更新により、を実行した後にテキストが不鮮明になるようtransform: scale()です。具体的には私はこれをやっています:

@-webkit-keyframes bounceIn {
  0% {
    opacity: 0;
    -webkit-transform: scale(.3);
  }

  50% {
    opacity: 1;
    -webkit-transform: scale(1.05);
  }

  70% {
    -webkit-transform: scale(.9);
  }

  100% {
    -webkit-transform: scale(1);
  }
}

Chromeでhttp://rourkery.comにアクセスすると、メインテキスト領域に問題が表示されます。これは以前は行われていなかったため、他のWebkitブラウザー(Safariなど)に影響を与えていないようです。3D変換で同様の問題が発生している人々に関する他の投稿がいくつかありましたが、このような2D変換については何も見つかりません。

どんなアイデアでも感謝します、ありがとう!


FirefoxとIE 10を使用してサイトにアクセスしただけで、問題は表示されません。Chromeに限定されている場合は、Googleが自分で修正するまで待つ必要があります。
Nolonar 2013

ぼやけが見られません... Chrome v25 / PCを使用しています
vsync

NolonarがGoogleがそれを修正するのを待たなければならないと述べたように、私もこの問題に以前に遭遇しました。
raj_n 2013年

解決策ではありませんが、CSS optimizeLegibilityを使用したときにのみ問題が発生することに気づきました。
バンコクの

リンクが壊れています。
Timothy003

回答:


78

私は何度もこの問題を抱えており、それを修正する方法は2つあるようです(以下を参照)。これらのプロパティのいずれかを使用して、レンダリングを修正することも、両方を同時に修正することもできます。

背面の可視性を非表示にすると、オブジェクトの前面だけにアニメーションが簡略化されるため、問題が解決します。デフォルトの状態は前面と背面です。

backface-visibility: hidden;

TranslateZは、アニメーションにハードウェアアクセラレーションを追加するハックでもあるので機能します。

transform: translateZ(0);

これらのプロパティは両方ともあなたが抱えている問題を修正しますが、一部の人々は追加したい

-webkit-font-smoothing: subpixel-antialiased;

アニメーション化されたオブジェクトに。Webフォントのレンダリングを変更できることがわかりましたが、その方法も自由に試してみてください。


12
これらのテクニックはすべて改善のように見えますが、それでもChromeをFirefoxで見られるのと同じレベルの明快さにすることはできません。
Michael Martin-Smucker 14

13
backface-visibility: hidden;確かに私の場合、不透明度の遷移によって引き起こされる奇妙なぼやけた動きを解決するのに役立ちました。奇妙な動きはなくなりましたが、代わりにdiv内のテキストが永久にぼやけています。
ITWitch 2017年

13
@ykadaruが提案したように、コードに追加perspective(1px)してみてくださいtransform:。これはChromeで私にとってはうまくいきましたが、他に何も問題を解決しませんでした
Serge Eremeev

4
Ubuntu 17.10でGnome X11セッションを実行しているChromeバージョン65.0.3325.162(公式ビルド)(64ビット)では機能しません(ウェイランドオフ)
Marecky

3
Chrome 72では、最初の2つのオプションにより、変換中および変換の終了時にテキストがぼやけます
Brandito

24

ぼやけを改善するために、特に。Chromeでは、次のようにしてください。

transform: perspective(1px) translateZ(0);
backface-visibility: hidden;

更新: パースペクティブは、ユーザーとz平面の間の距離を追加します。これにより、技術的にオブジェクトがスケーリングされ、ぼやけが「永続的」に見えます。perspective(1px)上記のようなものですアヒルテープ我々は、我々が解決しようとしているぼかしをマッチングしているので。あなたは以下のCSSでもっとうまくいくかもしれません:

transform: translateZ(0);
backface-visibility: hidden;

4
私にとって、これは実際にそれを悪化させます。
バル2018年

1
私にとってこれはグリッチを修正します(これがなければ、要素はアニメーションの完了後に1px移動します、変換:パースペクティブ(1px)だけでこれを修正します!)
Sergiu

@balu更新された回答を確認してください!取り除くperspective(1px)性質と、それは良い作品かどうかを確認します。
ykadaru

16

縮尺比を調整すると、わずかに役立つことがわかりました。

scale(1.048)over を使用する(1.05)と、ピクセル全体のフォントサイズにより近い近似が生成され、サブピクセルのぼやけが軽減されたようです。

またtranslateZ(0)、変換アニメーションでChromeの最終的な丸めステップを調整するように見えるものを使用しました。これは、速度を上げて視覚的なノイズを減らすので、私のホバー使用にはプラスです。ただし、onclick関数の場合、変換されたフォントがサクサクしていないように見えるため、私はそれを使用しません。


1
それが私にとって有効な唯一のアプローチです。他のアプローチ(裏面の可視性、フィルターの追加、パースペクティブ、古き良き変換Z)はさらに悪化させました。ピクセル全体にスケーリングしてみてください。たとえば、1,1429(16/14)の倍率を使用して14pxから16pxに移動します。
hugo der hungrige

1
なしで私のために働いたtranslateZ(0)だけの変更、1.051.048
A. VOLG

15

運の悪い状態で他のすべてを試した後、この問題を最終的に解決したのは、プロパティを削除するwill-change: transform;ことでした。何らかの理由で、Chromeではひどくぼやけた外観のスケーリングが発生しましたが、Firefoxでは発生しませんでした。


なぜ誰もがこれに反対票を投じるのでしょうか?わかりません... :(これは、Chromeの
Dan

同じ問題があった。投稿いただきありがとうございます。
レイン

Chrome 75でのmaterial-design-componentsレンダリングにも同じ問題がありました。「変更される」cssスタイルを削除すると修正されました。
Rob

Chrome 79で確認済み
Fareesh Vijayarangam

1
私は反対です、will-change: transform;問題を少し修正して追加します
JakubZawiślak

14

の代わりに

transform: scale(1.5);

を使用して

zoom : 150%;

Chromeのテキストのぼやけの問題を修正しました。


役立つことがありますが、白い境界線が時々導入されるなど、他の問題も導入されます
Kevin

1
なぜ反対票かわからない。私は、チェックボックスにこれを適用すると、これははるかに優れた変換よりも働いた:スケール()
ブライアン・マッコール

2
Firefoxの場合は、transformを使用します。scale()は、ぼやけのないチャームのように機能します。ブラウザの検出に取り組み、それに応じてchrome / safariとfirefoxに対応する必要があります。
Naisheel Verdhan、2015

15
もう1つの問題は、ズームが遷移プロパティで動作しないようで、CSSアニメーションには使用できないことです
ericgrosse

3
それは機能し、ぼかしをフォックスしますが、要素の位置も変更します。
user1156544

8

これはChrome(バージョン56.0.2924.87)のバグであるに違いありませんが、コンソール( '.0')でcssプロパティを変更したときのぼやけが修正されています。報告します。

filter: blur(.0px)

1
バグレポートはどこにありましたか?
ジアゾール2018年

バグをどこに送信したか思い出せません。そうか。
andyw

Bootstrap(4.4.1)、Chrome(80.0.3987.132)、Windows 10(125%拡大表示)を使用していて、ドロップダウンメニューにぼやけたテキストがあります。メニューはを使用transform: translate3d();して配置されており、これが問題を引き起こしているようです。提案された解決策はどれも私にとってうまくいきませんでした。これを除いて/ちょっと。これは、最初に正の値(たとえばblur(0.1px))に設定し、次にに変更した場合にのみ機能しblur(0px)ます。要素は動的であり、動的(JS)ソリューションも必要とするので、これは
最悪

7

サンデルスは私を答えに導きます。例外filter: scaleは存在しませんが、存在filter: blurします。

ぼやけて見える要素に次の宣言を適用します(私の場合、変換された要素内にあります):

backface-visibility: hidden;    
-webkit-filter: blur(0);

それは、ほぼ完全に働きました。「ほぼ」私はトランジションを使用しているため、トランジション中は要素が完全に表示されませんが、トランジションが完了すると、要素は完全に表示されます。


-webkit-filter: blur(0);一人で働く。backface-visibility: hidden;後でスケーリングをリセットすると、要素がぼやけます。
Kai Hartmann、

これはChromeにとってちょっとおもしろい...設定しblur(0px);ても直らない。しかし、私がそうしてblur(1px);から下矢印キーを押すと、blur(0px);それは正しく見えます。ページの更新が完了しました/ CSSで何を書いても
Tom Roggero

1
@TomRoggeroこれは、ぼかしプロパティ値に固有ではなく、レイアウトの再描画がいつ行われるかについて聞こえます。少し遅れて、JavaScriptを使用して要素の強制的な再描画を試すことができます。
Gajus 2017

5

私は、問題が相対変換で何らかの方法で発生することを発見しました。translateX(50%)、scale(1.1)など。絶対値を指定すると常に機能します(ぼやけたテキスト(ures)は生成されません)。

ここで言及されている解決策はどれも機能しませんでした。解決策はまだないようです(これを書いているときにChrome 62.0.3202.94を使用しています)。

私の場合transform: translateY(-50%) translateX(-50%)、ぼかしが発生します(ダイアログを中央に配置したい)。

もう少し「絶対的な」値に到達するには、10進数の値をに設定する必要がありましたtransform: translateY(-50.09%) translateX(-50.09%)

注意

この値は画面サイズによって異なることは間違いありません。誰かを助けるために私の経験を共有したかっただけです。


私はまったく同じことをしているこのまったく同じ問題に出くわしていました。私はtranslate3d(-50%、-50%、0)でモーダルを中央に配置していました。私の場合、値を-50.048%に上げましたが、完璧に見えます。
クリスグティエレス


4

追加perspective(1px)は私のために働いた。

transform: scale(1.005);

transform: scale(1.005) perspective(1px);


3

私の場合、次のコードはぼやけたフォントを引き起こしました:

-webkit-transform: translate(-50%,-50%);
transform: translate(-50%,-50%);

ズームプロパティを追加するだけで修正されました。ズームで遊んでください、私のために働いた後:

zoom: 97%;   

4
Firefoxのサポートなしzoom
ダスティンポワサント2017年

3

Chromeでぼやけた変換(translate3d、scaleX)で見つけたばかりの別の修正は、要素を「display:inline-table ;」として設定することです。場合によっては(X軸上で)ピクセルの丸めを強制するようです。

Chromeでのサブピクセルの配置は意図したものであり、開発者は修正しません。


3

2019 Update
Chromeディスプレイのバグはまだ修正されておらず、常連客の責任ではありませんが、このWebサイト全体で提供されている提案のいずれも問題の解決に役立ちません。私はそれらすべてを無駄に試したことに同意することができます:1つだけが近くに来て、それはcssルールです:filter:blur(0); これにより、コンテナが1ピクセル移動することはなくなりますが、コンテナ自体およびコンテナに含まれるコンテンツのぼやけた表示バグは解決されません。

これが現実です。文字通りこの問題は修正されていないため、流動的なWebサイトの回避策を次に示します

ケース
私は現在、流動的なWebサイトを開発しており、3つのdivを持っています。すべての中央にホバー効果があり、幅と位置の両方でパーセント値を共有しています。Chromeのバグは、left:50%に設定されている中央のコンテナで発生します。変換:translateX(-50%); 一般的な設定。

例:最初にHTML ...

<div id="box1" class="box">
    Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry"s standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book.
</div>

<div id="box2" class="box">
    Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry"s standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book.
</div>

<div id="box3" class="box">
    Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry"s standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book.
</div>

Chromeのバグが発生するCSSは次のとおりです...

*{margin:0; padding:0; border:0; outline:0; box-sizing:border-box;  background:#505050;}
.box {position:absolute; border:1px solid #fff; border-radius:10px; width:26%; background:#8e1515; padding:25px; top:20px; font-size:12pt; color:#fff; overflow:hidden; text-align:center; transition:0.5s ease-in-out;}
.box:hover {background:#191616;}
.box:active {background:#191616;}
.box:focus {background:#191616;}
#box1 {left:5%;}
#box2 {left:50%; transform:translateX(-50%);} /* Bugged */
#box3 {right:5%;}

これが固定CSSです...

*{margin:0; padding:0; border:0; outline:0; box-sizing:border-box;  background:#505050;}
.box {position:absolute; border:1px solid #fff; border-radius:10px; width:26%; background:#8e1515; padding:25px; top:20px; font-size:12pt; color:#fff; overflow:hidden; text-align:center; transition:0.5s ease-in-out;}
.box:hover {background:#191616;}
.box:active {background:#191616;}
.box:focus {background:#191616;}
#box1 {left:5%;}
#box2 {left:37%;} /* Fixed */
#box3 {right:5%;}

盗聴フィドル: https://jsfiddle.net/m9bgrunx/2/
固定フィドル: https://jsfiddle.net/uoc6e2dm/2/

ご覧のとおり、CSSを少し調整するだけで、配置にトランスフォームを使用する必要性が減少またはなくなります。これは、固定幅のWebサイトや流体にも適用できます。


要素が最終的に半ピクセルになる可能性があるため、変換を使用するとぼやけが予想されます。物事を中央に配置するためのより良い代替手段があります:flexboxサンプルグリッドサンプル
Timothy003

トランスフォームセンターに問題があると思われる、私がテストした唯一のブラウザーはChromeで、それ以外はすべて明確に表示されます。振り返ってみると、この問題は7年間続いています!それでも、猫の皮をむく方法はたくさんあります。あなたが言うように、猫はもう必要とされていません。
SJacks

これは信じられないことですが、フィルター:ぼかし(-0.1px); 助けて頂きました !!。どのようにこれは機能しますか?
jt3k

3

私にも同じ問題があります。私はこれを使ってこれを修正しました:

.element {
  display: table
}

2
非常識ですが、うまくいきます。Chromeは新しいIEのようです
アーサー

おおおお主よ!ir works!PXのテーブル 'fix' de widthは、ハーフピクセルでは可能な幅ではなかったと思います...
LuanLuanLuan

2

上記のどれも私のために働いていません。私はポップアップのためにこのアニメーションを持っていました:

@keyframes pulse {
  from {
    transform: scale3d(1, 1, 1);
  }
  50% {
    transform: scale3d(1.05, 1.05, 1.05);
  }
  to {
    transform: scale3d(1, 1, 1);
  }
}

私の場合、このルールを適用した後、ぼやけた効果はなくなり -webkit-perspective: 1000;ました。Chromeインスペクターで未使用としてマークされているにもかかわらずです。


それは私のために動作し、それも未使用としてマークされています。will-change: transform;要素の境界線のぼやけを修正することも追加しました。他の答えは私にとってはうまくいきませんでした。
JakubZawiślak

2

私の解決策は:

表示:初期;

それからサクサクした鋭い


1

上記のどれも私にとってはうまくいきませんでした。

遠近法を追加するとうまくいきました

すなわちから

transform : translate3d(-10px,-20px,0) scale3d(0.7,0.7, 1)

に変わった

transform : perspective(1px) translate3d(-10px,-20px,0) scale3d(0.7,0.7, 1)


追加すると、perspective(1px)実際に私にとってはさらに悪化しました:(
balu


1

CHORMEの場合:

ここですべての提案を試しました。しかし、うまくいきませんでした。私の大学は優れた解決策を見つけました。

1.0を超えてスケ​​ーリングしないでください

またtranslateZ(0)、ホバーに含めますが、ホバーなし/初期位置には含めません。

例:

a {
    transition: all 500ms cubic-bezier(0.165, 0.840, 0.440, 1.000);
    transform: scale(0.8, 0.8);
}

a:hover {
    transform: translateZ(0)scale(1.0, 1.0);
}

1

私はすべての答えを組み合わせて使用​​しましたが、これが結局私にとってうまくいきました:

.modal .modal--transition {
  display: inline-table;
  transform: perspective(1px) scale(1) translateZ(0);
  backface-visibility: hidden;
  -webkit-font-smoothing: subpixel-antialiased;
}

1

Chromeでぼやけたテキストの問題に直面していましたが、Firefoxでは使用していませんでした transform: translate(-50%,-50%)

まあ、私は本当に次のような多くの回避策を試しました:

transform: perspective(1px);
filter: blur(0);
transform: translateZ(0);
backface-visibility: hidden;

これらのどれも私には役に立たなかった。

最後に、要素の高さと幅を均一にしました。それは私のために問題を解決しました!!!

注:ユースケースによって異なります。しかし、確かに試してみる価値があります!


1

私はこれらの答えから多くの例を試しましたが、残念ながら、Version 81.0.4044.138 代わりに要素の変換に追加したChrome には何の助けにもなりません

 transform-origin: 50% 50%;

これです

 transform-origin: 51% 51%;

それは私に役立ちます


0

私にとって問題は、私の要素がを使用していたことでしたtransformStyle: preserve-3d。これは実際にはアプリに必要ではないことに気付き、それを削除するとぼけが修正されました。


0

これをコードから削除し、これ transform-style: preserve-3d; を追加しましたtransform: perspective(1px) translateZ(0);

ぼやけが消えました!


0

Chrome 74.0.3729.169(5-25-19現在)では、変換によって引き起こされる特定のブラウザーズームレベルで発生するぼかしの修正はないようです。単純なものでもTransformY(50px)要素をぼかします。これは、Firefox、Edge、またはSafariの現在のバージョンでは発生せず、すべてのズームレベルで発生するとは限りません。


これは私に起こったことです。このぼかし効果を取り除くことはできません。うまくいった解決策の1つは、これらのプロパティを設定することです。top: 0, bottom: 0, left: 0; right: 0; margin: autoただし、コンテナは可能な全スペース(幅でなければなりません)を取るので、コンテンツがコンテナの大きさを決定する必要がある場合、これは機能しません。
kwiat1990

0

CSSだけで解決することは困難です。

だから私はjqueryでそれを解決しました。

これは私のCSSです。

.trY {
   top: 50%;
   transform: translateY(-50%);
}

.trX {
   left: 50%;
   transform: translateX(-50%);
}

.trXY {
   top: 50%;
   left: 50%;
   transform: translate(-50%, -50%);
}

これは私のjqueryです。

function tr_init() {
$(".trY, .trX, .trXY").each(function () {
    if ($(this).outerWidth() % 2 != 0) {
        var fixed_width = Math.ceil($(this).outerWidth() / 2) * 2;
        $(this).css("width", fixed_width);
    }
    if ($(this).outerHeight() % 2 != 0) {
        var fixed_height = Math.ceil($(this).outerHeight() / 2) * 2;
        $(this).css("height", fixed_height);
    }
})}

0

修正の流行に追加するために、見栄えの悪いオブジェクトの周りに{border:1px solid#???}を配置すると、問題が解決します。安定した背景色がある場合は、これも考慮してください。これは、私が推測することについて言及することについて誰も考えたことがないので、馬鹿です。


-1

あなたはCSSを使うことができます filterをしてこれを修正。

.element {
    filter: blur(0);
}

ベンダープレフィックスについてはご自身で行ってください。-webkit-filter-ms-filter。詳細はこちら http://browser.colla.me/show/css_transformation_scale_cause_blurring


developer.mozilla.org/en/docs/Web/CSS/filterにfilter: scaleよるとありません
David Blurton

回答で参照されているURLによると、ぼやけているはずです。
Sardtok

-1

そうしない場合は、テキストがぼやけることはありません。transitiontransform

これを行うだけです:

&:hover {
    transform: scale(1.1);
}

ような移行 なしtransition: all .2s;

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.