크롬에서 CSS 변형, 들쭉날쭉 한 가장자리


193

CSS3 변환을 사용하여 웹 사이트에서 테두리가있는 이미지와 텍스트 상자를 회전했습니다.

문제는 안티 ​​앨리어싱이없는 (낮은 해상도) 게임처럼 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는 Mac 용 5.1에서 똑같은 문제를 소개했습니다. 현재는 아직 수정되지 않았습니다.
dtech

그리고 그들은 그것을 아주 잘 고쳐서 돌아가는 것이 불가능합니다. 앤티 앨리어싱이 마지막으로 필요한 경우가 있지만 이제 Chrome / Chromium / Safari는 1 비트 이미지 (예 : b / w gif)이지만 변환 된 이미지에서 앤티 앨리어싱을 해제 할 수있는 방법이 없습니다. 블러는 너무 시원하고 너무 시원하고 더 많은 흐림은 더 시원합니다. 선명한 모서리를 보장하는 유일한 방법은 모두 svg 경로 또는 객체로 변환하고 속성 shape-rendering = "crispEdges"를 추가하는 것입니다.
Timo Kähkönen

나에게 문제는 투명한 테두리를 사용하여 화살표를 만드는 것입니다. 이것은 승리와 Mac의 Chrome 40에 있습니다. 여기의 옵션 중 어느 것도 문제를 해결하지 못합니다.
Gurnard

답변:


389

누구나 나중에 이것을 검색하는 경우 Chrome의 CSS 변환에서 들쭉날쭉 한 가장자리를 제거하는 좋은 방법은 CSS 속성 -webkit-backface-visibility을 값으로 추가하는 것 입니다 hidden. 내 자신의 테스트에서 이것은 완전히 매끄럽게했습니다. 희망이 도움이됩니다.

-webkit-backface-visibility: hidden;

7
Lifesaver-이 트릭을 통해 이전에 앤티 앨리어싱 문제로 인해 변환을 해제해야하는 여러 사이트에서 웹킷 변환을 다시 활성화 할 수있었습니다. 감사!
대런

이것에 대한 도움 : stackoverflow.com/questions/9235342/… ?
abernier

5
이것은 Chrome에서 작동하지만 iOS 6에서 다시 들쭉날쭉합니다!
lazd

11
@lazd iOS 추가로 고치기padding: 1px; -webkit-background-clip: content-box;
Rob Fletcher

2
@RobFletcher는이 스레드마다 크로스 브라우저 및 크로스 OS 솔루션에 필수적인 것으로 보이는 패딩 및 배경 클립을 추가했습니다. 이렇게하면 OSX / Chrome 문제도 해결됩니다. 완전한 솔루션은 다음과 같습니다.padding: 1px;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-background-clip:content-box;background-clip:content-box;
Benjamin Luoma

121

transition대신에 를 사용하는 transform경우-webkit-backface-visibility: hidden; 작동하지 않습니다. 투명한 PNG 파일을 위해 애니메이션 도중 들쭉날쭉 한 가장자리가 나타납니다.

그것을 해결하기 위해 나는 다음을 사용했다. outline: 1px solid transparent;


4
이것은 web-kit-backface-visibility 속성이 누락 된 상황에서 도움이되는 것으로 보입니다.
dgibbs

2
다른 사람이 없었을 때 나를 위해 일합니다. 이 속성을 추가하기 전에 Chrome Android에 문제가있었습니다. 이제 모든 브라우저가 제대로 작동하는 것 같습니다.
Bernie Sumption

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) 더 나은 아마

4
귀하의 답변에 CSS의 상단 섹션을 추가하면 outline: 1px solid transparent;효과가 있습니다. 위의 다른 솔루션은 충분히 작동하지 않았습니다.
Timothy Zorn

outline: 1px solid transparent;트리거 (크롬 같은 문제가 있습니다) 파이어 폭스 (52)도 앤티 앨리어싱
루카 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) 작동합니다.
Dave

슈퍼 해 키지 만 나를 위해 일했습니다. 눈에 띄는 미스 얼라 인을 피하기 위해 0.05와 같은 작은 정도를 시도하십시오.
cpursley

preserve-3d는 내 생명을 구했습니다.
Hannes Schneidermayer

8

선택한 답변 (다른 답변 중 어느 것도)이 효과가 없었지만 이것은 효과가 없었습니다.

img {outline:1px solid transparent;}


2

-45deg의 CSS3 그라디언트에 문제가 있습니다. background기울어 심하게 유사 들쭉날쭉하지만 원래의 게시물보다 더했다. 그래서 나는 둘 다 가지고 놀기 시작했다 background-size. 이것은 들쭉날쭉 함을 펼치지 만 여전히 거기에있었습니다. 그리고 추가로 내가 조정할 수 있도록 다른 사람들이 45deg 증가에 너무 문제가있는 읽기 -45deg-45.0001deg 내 문제가 해결되었습니다.

아래에있는 내 CSS에서 background-size처음이었다 30px그리고 deg배경 그라데이션 정확히이었다 -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와 모바일 웹킷 브라우저를 확인하고 싶을 수도 있습니다.

결과는 다소 나아지지만 다른 브라우저보다 훨씬 좋지 않습니다.

상자 그림자 포함 (아래)


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)

나열된 모든 답변은 이미지에 관한 것입니다. 그러나 내 문제는 변형 회전이있는 크롬 (v.52)의 캔버스에 관한 것입니다. 그들은 들쭉날쭉 해졌고이 모든 방법이 도움이되지 못했습니다.

나를 위해 작동하는 솔루션 :

  1. 각면에 대해 1px에서 캔버스를 더 크게 만듭니다.
  2. 오프셋 + 1px (0.1 대신 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 용으로 재현 되었습니다. 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.