CSS変換、クロムのギザギザのエッジ


193

CSS3トランスフォームを使用して、Webサイトで境界線のある画像やテキストボックスを回転させています。

問題は、アンチエイリアスのない(低解像度)ゲームのように、境界線がChromeでギザギザに見えることです。IE、Opera、FFでは、AAが使用されているため、はるかに良く見えます(これはまだはっきりと見えますが、それほど悪くはありません)。Macを所有していないため、Safariをテストできません。

回転した写真とテキスト自体はきれいに見えますが、ギザギザに見えるのは境界線だけです。

私が使用するCSSは次のとおりです。

.rotate2deg {
    transform: rotate(2deg);
    -ms-transform: rotate(2deg); /* IE 9 */
    -webkit-transform: rotate(2deg); /* Safari and Chrome */
    -o-transform: rotate(2deg); /* Opera */
    -moz-transform: rotate(2deg); /* Firefox */
}

ChromeにAAを使用するように強制するなど、これを修正する方法はありますか?

以下の例:

ギザギザのエッジの例


後で読む場合:バージョン15(2011年11月)の時点でChromeで修正される予定ですが、Safariは5.1 for Macでまったく同じ問題を
引き起こし

そして彼らはそれを非常によく修正しました。アンチエイリアスが最後に必要なケースがありますが、Chrome / Chromium / Safariは、1ビットの画像(例:b / w gif)ですが、変換された画像のアンチエイリアスをオフにする方法がありません。ぼかしはとてもかっこいい、とてもかっこいい、ぼかしが多いほどかっこいいと彼らは言う!鮮明なエッジを確保する唯一の方法は、すべてをsvgパスまたはオブジェクトに変換し、属性shape-rendering = "crispEdges"を追加することです。
TimoKähkönen、2012年

私にとっての問題は、矢印を作成するために使用される透明な境界線にあります。これは、WinおよびMacのChrome 40にあります。ここでのオプションはどれも問題を解決しません。
ガーナード2015年

回答:


389

後で誰かがこれを検索する場合に備えて、ChromeでCSS変換のギザギザのエッジを取り除くための素晴らしいトリックは、CSSプロパティを追加することです -webkit-backface-visibilityにの値することですhidden。私自身のテストでは、これで完全にスムーズになりました。お役に立てば幸いです。

-webkit-backface-visibility: hidden;

7
Lifesaver-このトリックにより、以前はアンチエイリアシングの問題のために変換をオフにすることを余儀なくされていた多くのサイトで-webkit-transformを再度有効にすることができました。ありがとう!
Darren

これに関するヘルプ:stackoverflow.com/questions/9235342/…
abernier

5
これはChromeでは機能しますが、iOS 6では再びギザギザになります。
lazd 2013年

11
@lazdがiOSで修正するためにpadding: 1px; -webkit-background-clip: content-box;
Rob Fletcherが

2
@RobFletcherはパディングとバックグラウンドクリップを追加しました。これは、このスレッドごとに、クロスブラウザとクロスOSソリューションに不可欠であると思われます。:あまりにもこの修正私のOSX /クローム問題は、そう...私は完全なソリューションのようなものだと思うpadding: 1px;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-background-clip:content-box;background-clip:content-box;
ベンジャミンLuoma

119

transition代わりにを使用している場合transform-webkit-backface-visibility: hidden;機能しません。透明なpngファイルのアニメーション中にギザギザのエッジが表示されます。

それを解決するために私は使用しました: outline: 1px solid transparent;


4
これは、web-kit-backface-visibilityプロパティが失われた場合に役立ちます。
dgibbs 2015年

2
他の誰もしなかったときに私のために働きます。このプロパティを追加する前に、Chrome Androidに問題がありました。現在、すべてのブラウザが正常に動作しているようです。
バーニーサンプション

iOS 8のSafariで私のために動作します
Moritz Friedrich

完璧なソリューション。他の人は働かなかった。私はほとんどあきらめ、これがうまくいくか疑問に思っていました。しかし、そうです!
Garconis

1
私のニーズにぴったりです。私は実際にトランジションを使用していますが、他の回答が原因で、PNGがデフォルトの状態でピクセル化されていました。あなたの答えは、デフォルト状態と移行中の両方で、ピクセル化を取り除くのに役立ちました。パーフェクト!
Garconis

24

1pxの透明な境界線を追加すると、アンチエイリアスがトリガーされます

outline: 1px solid transparent;

または、1pxの透明なボックスシャドウを追加します。

box-shadow: 0 0 1px rgba(255,255,255,0);

rgba(255、255、255、0)はおそらくより良い
mmm

4
CSSの上部セクションを回答に追加すると、outline: 1px solid transparent;うまくいきました。上記の他のソリューションは十分に機能しませんでした。
Timothy Zorn、2016年

outline: 1px solid transparent;Firefox 52(Chromeと同じ問題があります)でもアンチエイリアスをトリガーします
Luca Detomi

18

3D変換を試してください。これは魅力のように機能します!

/* Due to a bug in the anti-liasing*/
-webkit-transform-style: preserve-3d; 
-webkit-transform: rotateZ(2deg);

1
これをクロームで試してみると(Macで2013年8月)、承認されたソリューションは機能しませんが、これを使用すると(具体的にはpreserve-3d、にrotate変更せずに引き続き使用できますrotateZ)機能します。
デイブ

超ハッキーですが、私のために働いた。目に見えるミスアライメントを回避するために、0.05などのより小さな次数を試してください。
cpursley 14

preserve-3dは私の命を救った。
Hannes Schneidermayer

8

選択した回答(または他の回答)はうまくいきませんでしたが、これはうまくいきました:

img {outline:1px solid transparent;}


2

-45degのCSS3グラデーションで問題が発生しています。background傾斜、ひどくに似ぎざぎざが、元のポストよりも悪化していました。だから私は両方で遊んだbackground-size。これはギザギザを伸ばしますが、それはまだそこにありました。さらに、他の人も45度単位で問題が発生していると読み-45degました。-45.0001degと私の問題を解決しました。

以下の私のCSSでは、background-size最初30pxdegで、背景のグラデーションは-45degであり、すべてのキーフレームはでした30px 0

    @-webkit-keyframes progressStripeLTR {
        to {
            background-position: 60px 0;
        };
    }

    @-moz-keyframes progressStripeLTR {
        to {
            background-position: 60px 0;
        };
    }

    @-ms-keyframes progressStripeLTR {
        to {
            background-position: 60px 0;
        };
    }

    @-o-keyframes progressStripeLTR {
        to {
            background-position: 60px 0;
        };
    }

    @keyframes progressStripeLTR {
        to {
            background-position: 60px 0;
        };
    }

    @-webkit-keyframes progressStripeRTL {
        to {
            background-position: -60px 0;
        };
    }

    @-moz-keyframes progressStripeRTL {
        to {
            background-position: -60px 0;
        };
    }

    @-ms-keyframes progressStripeRTL {
        to {
            background-position: -60px 0;
        };
    }

    @-o-keyframes progressStripeRTL {
        to {
            background-position: -60px 0;
        };
    }

    @keyframes progressStripeRTL {
        to {
            background-position: -60px 0;
        };
    }

    .pro-bar-candy {
        width: 100%;
        height: 15px;

        -webkit-border-radius:  3px;
        -moz-border-radius:     3px;
        border-radius:          3px;

        background: rgb(187, 187, 187);
        background: -moz-linear-gradient(
                        -45.0001deg,
                        rgba(187, 187, 187, 1.00) 25%,
                        transparent 25%,
                        transparent 50%,
                        rgba(187, 187, 187, 1.00) 50%,
                        rgba(187, 187, 187, 1.00) 75%,
                        transparent 75%,
                        transparent
                    );
        background: -webkit-linear-gradient(
                        -45.0001deg,
                        rgba(187, 187, 187, 1.00) 25%,
                        transparent 25%,
                        transparent 50%,
                        rgba(187, 187, 187, 1.00) 50%,
                        rgba(187, 187, 187, 1.00) 75%,
                        transparent 75%,
                        transparent
                    );
        background: -o-linear-gradient(
                        -45.0001deg,
                        rgba(187, 187, 187, 1.00) 25%,
                        transparent 25%,
                        transparent 50%,
                        rgba(187, 187, 187, 1.00) 50%,
                        rgba(187, 187, 187, 1.00) 75%,
                        transparent 75%,
                        transparent
                    );
        background: -ms-linear-gradient(
                        -45.0001deg,
                        rgba(187, 187, 187, 1.00) 25%,
                        transparent 25%,
                        transparent 50%,
                        rgba(187, 187, 187, 1.00) 50%,
                        rgba(187, 187, 187, 1.00) 75%,
                        transparent 75%,
                        transparent
                    );
        background: linear-gradient(
                        -45.0001deg,
                        rgba(187, 187, 187, 1.00) 25%,
                        transparent 25%,
                        transparent 50%,
                        rgba(187, 187, 187, 1.00) 50%,
                        rgba(187, 187, 187, 1.00) 75%,
                        transparent 75%,
                        transparent
                    );
        background: -webkit-gradient(
                        linear,
                        right bottom,
                        right top,
                        color-stop(
                            25%,
                            rgba(187, 187, 187, 1.00)
                        ),
                        color-stop(
                            25%,
                            rgba(0, 0, 0, 0.00)
                        ),
                        color-stop(
                            50%,
                            rgba(0, 0, 0, 0.00)
                        ),
                        color-stop(
                            50%,
                            rgba(187, 187, 187, 1.00)
                        ),
                        color-stop(
                            75%,
                            rgba(187, 187, 187, 1.00)
                        ),
                        color-stop(
                            75%,
                            rgba(0, 0, 0, 0.00)
                        ),
                        color-stop(
                            rgba(0, 0, 0, 0.00)
                        )
                    );

        background-repeat: repeat-x;
        -webkit-background-size:    60px 60px;
        -moz-background-size:       60px 60px;
        -o-background-size:         60px 60px;
        background-size:            60px 60px;
        }

    .pro-bar-candy.candy-ltr {
        -webkit-animation:  progressStripeLTR .6s linear infinite;
        -moz-animation:     progressStripeLTR .6s linear infinite;
        -ms-animation:      progressStripeLTR .6s linear infinite;
        -o-animation:       progressStripeLTR .6s linear infinite;
        animation:          progressStripeLTR .6s linear infinite;
        }

    .pro-bar-candy.candy-rtl {
        -webkit-animation:  progressStripeRTL .6s linear infinite;
        -moz-animation:     progressStripeRTL .6s linear infinite;
        -ms-animation:      progressStripeRTL .6s linear infinite;
        -o-animation:       progressStripeRTL .6s linear infinite;
        animation:          progressStripeRTL .6s linear infinite;
        }

1

ぼやけたボックスシャドウを使用して、ぎざぎざをマスクできる場合があります。box-shadowの代わりに-webkit-box-shadowを使用すると、webkit以外のブラウザーに影響を与えません。ただし、SafariおよびモバイルWebkitブラウザーを確認することをお勧めします。

結果はいくぶん良くなりますが、それでも他のブラウザよりはずっと良くありません:

ボックスシャドウ付き(下側)


1

Chrome / Windowsでもまったく同じ問題が発生したため、ソリューションも投入すると考えました。

上記の@stevenWatkinsによる解決策を試しましたが、それでも「ステップ」がありました。

の代わりに

-webkit-backface-visibility: hidden;

私たちは使用しました:

-webkit-backface-visibility: initial;

私たちにとってこれはトリックでした🎉


1

問題の要素を囲むdivに以下を追加すると、これが修正されました。

-webkit-transform-style: preserve-3d;

私の場合、ビデオウィンドウの周囲にギザギザのエッジが表示されていました。


0

私にとって、トリックを実行したのはパースペクティブCSSプロパティでした。

-webkit-perspective: 1000;

私の場合、3Dトランジションを使用していないので完全に非論理的ですが、それでも機能します。


0

Chromeのキャンバス(バージョン52)

記載されているすべての回答は画像に関するものです。しかし、私の問題は、Transform Rotateを使用したChrome(v.52)のキャンバスに関するものです。彼らはギザギザになり、このすべての方法は助けにはなりません。

私のために働く解決策:

  1. キャンバスを両側に1ピクセル大きくします=>幅と高さを+2ピクセルにします。
  2. オフセット+ 1px(0,0ではなく1,1の位置)と固定サイズ(画像のサイズはキャンバスのサイズより2px小さい)で画像を描画します
  3. 必要な回転を適用する

とても重要なコードブロック:

// Unfixed version
ctx.drawImage(img, 0, 0, 335, 218);
// Fixed version
ctx.drawImage(img, 1, 1, 335, 218);
/* This style should be applied for fixed version */
canvas {
  margin-left: -1px;
  margin-top:-1px;
}        
<!--Unfixed version-->
<canvas width="335" height="218"></canvas>
<!--Fixed version-->
<canvas width="337" height="220"></canvas>

サンプル: https : //jsfiddle.net/tLbxgusx/1/

注:プロジェクトの簡略化されたバージョンであるため、多くのネストされたdivがあります。


この問題はFirefoxでも再現されますれています。Retinaを使用するSafariとFFでは、このような問題はありません。

そして他の創設された解決策は、キャンバスを同じサイズのdivに配置し、このdivに次のcssを適用することです:

overflow: hidden;
box-shadow: 0 0 1px rgba(255,255,255,0);
// Or
//outline:1px solid transparent;

そして、このラッピングdivに回転を適用する必要があります。したがって、リストされたソリューションは機能しますが、わずかな変更が加えられています。

そして、そのようなソリューションの変更された例は次のとおりです:https : //jsfiddle.net/tLbxgusx/2/

注:クラス 'third'のdivのスタイルを参照してください。

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