CSS transform 사용 후 흐릿한 텍스트 : scale (); Chrome에서


126

을 수행 한 후 흐릿한 텍스트를 유발하는 최근 Google 크롬 업데이트가있는 것 같습니다 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 을 방문 하면 기본 텍스트 영역에 문제가 표시됩니다. 이 작업을 수행하는 데 사용되지 않았으며 Safari와 같은 다른 웹킷 브라우저에 영향을 미치지 않는 것 같습니다. 3D 변환과 유사한 문제를 겪고있는 사람들에 대한 다른 게시물이 있지만 이와 같은 2D 변환에 대해서는 아무것도 찾을 수 없습니다.

모든 아이디어를 주시면 감사하겠습니다!


Firefox 및 IE 10을 사용하여 사이트를 방문했지만 문제가 보이지 않습니다. Chrome에만 국한된 경우 Google에서 직접 문제를 해결할 때까지 기다려야 할 수 있습니다.
Nolonar 2013

흐릿함이 보이지 않습니다 ... Chrome v25 / PC를 사용 중입니다
vsync

Nolonar가 언급했듯이 Google이 문제를 해결할 때까지 기다려야한다고 언급했듯이 저는이 문제를 더 일찍 발견했습니다.
raj_n

해결책은 아니지만 CSS optimizeLegibility를 사용할 때만 문제가 발생한다는 것을 알았습니다.
Bangkokian

링크가 끊어졌습니다.
Timothy003

답변:


78

나는이 문제를 여러 번 겪었고 그것을 고치는 2 가지 방법이있는 것 같다 (아래 참조). 이러한 속성 중 하나를 사용하여 렌더링을 수정하거나 동시에 둘 다 사용할 수 있습니다.

뒷면 가시성 숨김은 애니메이션을 오브젝트의 앞쪽으로 단순화하는 반면 기본 상태는 앞면과 뒷면이므로 문제를 해결합니다.

backface-visibility: hidden;

TranslateZ는 애니메이션에 하드웨어 가속을 추가하는 해킹으로도 작동합니다.

transform: translateZ(0);

이 두 가지 속성 모두 현재 겪고있는 문제를 해결하지만 일부 사람들은

-webkit-font-smoothing: subpixel-antialiased;

애니메이션 된 개체에. 웹 글꼴의 렌더링을 변경할 수 있지만 그 방법도 자유롭게 실험 해 볼 수 있습니다.


12
이러한 기술은 모두 개선되는 것처럼 보이지만 여전히 Firefox에서 볼 수있는 것과 동일한 수준의 명확성을 크롬으로 만들 수는 없습니다.
Michael Martin-Smucker 2014

13
backface-visibility: hidden;내 경우에는 불투명도 전환으로 인한 이상한 흐릿한 움직임을 해결하는 데 확실히 효과가있었습니다. 이상한 움직임은 이제 사라졌지 만 내 div의 텍스트가 영구적으로 흐려졌습니다.
ITWitch

14
@ykadaru 제안으로 추가하려고 perspective(1px)당신에게 transform:아무것도 다른 문제가 해결되지 동안이 크롬에 나를 위해 일한 코드
서지 Eremeev을

4
Gnome X11 세션 (Wayland 꺼짐)과 함께 Ubuntu 17.10에서 실행되는 Chrome 버전 65.0.3325.162 (공식 빌드) (64 비트)에서 작동하지 않습니다.
Marecky

3
크롬 72에서 처음 두 옵션은 텍스트가 중 및 변환의 끝에서 흐릿하게하는 원인
Brandito

24

흐릿함을 개선하려면 esp. Chrome에서 다음을 시도하십시오.

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

업데이트 : Perspective 는 사용자와 z- 평면 사이의 거리를 추가하여 기술적으로 개체의 크기를 조정하여 흐릿함이 '영구적'인 것처럼 보입니다. perspective(1px)위 의 내용은 우리가 해결하려는 흐릿함과 일치하기 때문에 오리 테이프 와 같습니다 . 아래 CSS를 사용하면 더 나은 행운을 누릴 수 있습니다.

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

4
저에게 이것은 실제로 상황을 더 악화시킵니다.
balu

1
이 수정 글리치 나에게 (이없이, 요소의 이동 애니메이션이 완료된 후, 변환 x 1 픽셀 : 관점 (1 x 1 픽셀)이 단독으로 수정!)
세르주

@balu 내 업데이트 된 답변을 확인하십시오! perspective(1px)재산을 제거 하고 더 잘 작동하는지 확인하십시오.
ykadaru

16

스케일 비율을 조정하는 것이 약간 도움이된다는 것을 알았습니다.

scale(1.048)over를 사용하면 (1.05)전체 픽셀 글꼴 크기에 더 가까운 근사치를 생성하여 하위 픽셀 흐림을 줄였습니다.

또한 translateZ(0)변환 애니메이션에서 Chrome의 마지막 반올림 단계를 조정하는 것처럼 보이는 것을 사용했습니다 . 이것은 속도를 높이고 시각적 소음을 줄이기 때문에 내 onhover 사용에 대한 장점입니다. 그러나 onclick 기능의 경우 변형 된 글꼴이 바삭하지 않기 때문에 사용하지 않습니다.


1
그것이 나를 위해 일한 유일한 접근 방식입니다. 다른 접근법 (뒷면 가시성, 필터 추가, 원근감 및 좋은 오래된 translateZ)은 상황을 더욱 악화 시켰습니다. 전체 픽셀로 크기를 조정하십시오. 예를 들어 1,1429 (16/14)의 축척 비율을 사용하여 14px에서 16px로 이동합니다.
hugo der hungrige

1
없이 나를 위해 일한 translateZ(0)단지 변경 1.051.048
A. VOLG

15

운없이 다른 모든 것을 시도한 후 마침내이 문제를 해결 한 것은 재산 을 제거 하는 것이 었습니다 will-change: transform;. 어떤 이유로 크롬에서는 끔찍하게 흐릿하게 보이는 스케일링이 발생했지만 Firefox에서는 그렇지 않았습니다.


왜 누군가가 이것을 반대할까요? 이해가 안 돼요 ... :( 이것은 크롬의 일부 버전에서 완전히 유효한 문제이며 일반적으로 "변경 될 것"이 여전히 새롭고 사용해서는 안되는 것 같습니다. 자세한 내용은 greensock을
Dan

같은 문제가있었습니다. 게시 해 주셔서 감사합니다.
raine

Chrome 75에서 material-design-components 렌더링에 대해 동일한 문제가있었습니다. "will-changed"CSS 스타일을 제거하면 문제가 해결되었습니다.
Rob

Chrome 79에서 확인
Fareesh Vijayarangam

1
나는 그 반대입니다 will-change: transform;. 문제를 약간 수정했습니다
Jakub Zawiślak

14

대신에

transform: scale(1.5);

사용

zoom : 150%;

Chrome의 텍스트 흐림 문제를 수정합니다.


도움이 될 수 있지만 때때로 도입되는 흰색 경계선과 같은 다른 문제도 소개합니다
Kevin

1
왜 반대표를 던 졌는지 모르겠습니다. 내가 확인란이 적용되면이 훨씬 더 변환보다 더 가공 : 규모 ()
브라이언 맥콜

2
파이어 폭스의 경우 transform : scale ()을 사용하면 흐릿함없이 매력적으로 작동합니다. 브라우저 감지 작업을 수행하고 크롬 / 사파리 및 파이어 폭스에 맞게 조치를 취해야합니다.
Naisheel Verdhan 2015

15
또 다른 문제는 CSS 애니메이션을 사용할 수 없습니다 그래서 줌, 전환 속성과 작동하지 않는 것입니다
ericgrosse

3
그것은 작동하고 흐릿한 것을 폭로하지만 요소의 위치도 변경합니다.
user1156544

8

이것은 Chrome (버전 56.0.2924.87)의 버그 일 것입니다. 그러나 아래는 콘솔 ( '.0')에서 CSS 속성을 변경할 때 저에게 흐릿함을 수정합니다. 보고하겠습니다.

filter: blur(.0px)

1
버그 보고서를 어디서 얻었습니까?
Diazole

버그를 제출 한 위치조차 기억 나지 않습니다. 그래도 그렇게 했어.
andyw

저는 Bootstrap (4.4.1), Chrome (80.0.3987.132), Windows 10 (125 % 확대 된보기)을 사용하고 있으며 드롭 다운 메뉴에 흐린 텍스트가 있습니다. 메뉴가를 사용하여 배치 transform: translate3d();되었으며 이로 인해 문제가 발생한 것 같습니다. 제안 된 솔루션 중 어느 것도 나를 위해 일하지 않았습니다. 이것 만 빼고요. 이것은 먼저 양수 값 (예 :)으로 설정 blur(0.1px)한 다음으로 변경하는 경우에만 작동 합니다 blur(0px). 요소가 동적이고 동적 (JS) 솔루션이 필요하기 때문에 ... 이것은 짜증납니다 : \
akinuri

7

Sunderls는 나를 대답으로 안내합니다. 제외하고 filter: scale는 존재하지 않지만 존재합니다 filter: blur.

흐리게 보이는 요소에 다음 선언을 적용합니다 (제 경우에는 변환 된 요소 내부에 있음).

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

그것은 거의 완벽했다. " 거의 "전환을 사용하고 있고 전환 중에는 요소가 완벽 해 보이지 않지만 전환이 완료되면 제대로 표시됩니다.


-webkit-filter: blur(0);혼자서 나를 위해 일합니다. backface-visibility: hidden;나중에 스케일링을 재설정하면 내 요소가 흐려집니다.
Kai Hartmann

이것은 크롬에 약간 재미 있습니다 ... 내가 설정 blur(0px);하면 그것을 고치지 않습니다. 하지만 내가 그런 blur(1px);다음 화살표 아래쪽 키를 누르면 blur(0px);올바르게 보입니다. 페이지 새로 고침 사라지다 / 더 나는 CSS에서 쓰기 무슨 상관 없습니다
톰 Roggero

1
@TomRoggero 이것은 blur 속성 값에 대해 덜 구체적이고 레이아웃의 다시 그리기가 완료 될 때 더 많이 들립니다. 약간의 지연 후 자바 스크립트를 사용하여 요소를 강제로 다시 그리기를 실험 할 수 있습니다.
Gajus

5

나는 문제가 어떤 식 으로든 상대 변환에서 발생한다는 것을 알았습니다. translateX (50 %), scale (1.1) 또는 무엇이든. 절대 값 제공은 항상 작동합니다 (흐릿한 텍스트 (ures)를 생성하지 않음).

여기에 언급 된 솔루션 중 어느 것도 작동하지 않았으며 아직 솔루션이 없다고 생각합니다 (이를 작성하는 동안 Chrome 62.0.3202.94 사용).

나의 경우에는 transform: translateY(-50%) translateX(-50%) 에는 흐림이 발생합니다 (대화 상자를 중앙에 배치하고 싶습니다).

좀 더 "절대적인"값에 도달하려면 십진수 값을 transform: translateY(-50.09%) translateX(-50.09%) .

노트

이 값은 화면 크기에 따라 다를 수 있습니다. 누군가에게 도움이 될 수 있도록 내 경험을 공유하고 싶었습니다.


나는 똑같은 일을하는이 똑같은 문제에 뛰어 들었습니다. 나는 translate3d (-50 %, -50 %, 0)로 모달을 중심에 두었습니다. 제 경우에는 값을 -50.048 %로 올렸는데 완벽 해 보입니다.
Chris Gutierrez


4

추가 perspective(1px)는 나를 위해 일했습니다.

transform: scale(1.005);

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

3

zoom: 101%;확대 / 축소 + 배율 조합을 사용할 수없는 경우 복잡한 디자인에 사용해보십시오 .


참고 zoom모든 웹 표준에 의해 정의되지 않고 파이어 폭스에서 지원하지 않는 caniuse.com/#feat=css-zoom
Boltgolt

3

제 경우에는 다음 코드가 흐릿한 글꼴을 발생했습니다.

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

확대 / 축소 속성을 추가하는 것만으로도 문제가 해결되었습니다. 나를 위해 일한 다음 확대 / 축소로 놀아보십시오.

zoom: 97%;   

4
아니 파이어 폭스 지원zoom
더스틴 Poissant

3

Chrome에서 흐릿한 변환 (translate3d, scaleX)에 대해 방금 찾은 또 다른 수정 사항은 요소를 " display : inline-table ;"로 설정하는 것입니다. 어떤 경우 (X 축에서) 픽셀 반올림을 강제하는 것 같습니다.

Chrome에서 하위 픽셀 위치 지정이 의도 된 것으로 읽었으며 개발자는이를 수정하지 않습니다.


3

2019 업데이트
Chrome 디스플레이 버그는 여전히 수정되지 않았으며 고객의 잘못은 아니지만이 웹 사이트 전체에서 제공되는 제안 중 어느 것도 문제 해결에 도움이되지 않습니다. 나는 그들 중 하나를 모두 헛되이 시도했다는 것에 동의 할 수있다. 단지 1 개만 가까워지고 그것이 CSS 규칙이다 : filter : blur (0); 이는 컨테이너의 1px 이동을 제거하지만 컨테이너 자체 및 포함 할 수있는 콘텐츠의 흐릿한 표시 버그를 해결하지 않습니다.

현실은 다음과 같습니다. 문자 그대로이 문제에 대한 해결책이 없으므로 유동 웹 사이트에 대한 해결 방법이 있습니다.

CASE
저는 현재 유동적 인 웹 사이트를 개발 중이며 3 개 div가 있으며 모두 호버 효과를 중심으로하고 너비와 위치 모두에서 백분율 값을 공유합니다. Chrome 버그는 left : 50 %로 설정된 중앙 컨테이너에서 발생합니다. 그리고 transform : 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를 약간 조정하면 위치 지정을 위해 변환을 사용해야하는 요구 사항이 줄어들거나 없어집니다. 이는 고정 너비 웹 사이트 및 유동적에도 적용될 수 있습니다.


요소가 반 픽셀로 끝날 수 있기 때문에 변환을 사용할 때 흐릿함이 예상됩니다 . : 더 나은 중심 것들에 대한 대안 이제이있다 인 flexbox 샘플 , 그리드 샘플
Timothy003

변환 센터에 문제가있는 것으로 보이는 유일한 브라우저는 Chrome이며 다른 모든 브라우저는 명확하게 보입니다. 나는 돌아 보았고이 문제는 7 년 동안 발생했습니다! 여전히 고양이를 피부로 가꾸는 방법은 많으며 더 이상 필요하지 않다고 말합니다.
SJacks

이것은 믿을 수 없지만 filter : blur (-0.1px); 나를 도와 주었다 !!. 도대체 어떻게 작동합니까 ??
jt3k

3

나는 이와 같은 문제가 있습니다. 나는 이것을 사용하여 고쳤다.

.element {
  display: table
}

2
미쳤지 만 작동합니다. Chrome은 분명히 새로운 IE입니다
Arthur

우와! ir 작동합니다! 나는 PX의 테이블 '
fix'de

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;흐릿한 요소 테두리를 수정하는 기능 도 추가 했습니다. 다른 답변은 저에게 효과가 없었습니다.
Jakub Zawiś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

다음을 추가하여 케이스를 수정했습니다.

transform: perspective(-1px)

이것은 나를 위해 방금 scale()변환 결과를 제거했습니다
jpenna

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에서 흐릿한 텍스트 문제가 발생했지만 transform: translate(-50%,-50%).

글쎄, 나는 정말 다음과 같은 많은 해결 방법을 시도했습니다.

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

이것들 중 어느 것도 나에게 효과가 없었습니다.

마지막으로 요소의 높이와 너비를 균일하게 만들었습니다. 그것은 나를 위해 문제를 해결했습니다 !!!

참고 : 사용 사례에 따라 다를 수 있습니다. 그러나 시도할만한 가치가 있습니다!


1

나는이 답변에서 많은 예제를 시도했지만 불행히도 Chrome에 도움이되지 Version 81.0.4044.138 않고 대신 요소 변형에 추가했습니다.

 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에서는 발생하지 않으며 모든 확대 / 축소 수준에서 발생하지 않는 것 같습니다.


이것이 내 일이다. 이 흐림 효과를 제거 할 수 없습니다. 효과가 있었던 한 가지 해결책은 이러한 속성을 설정하는 것입니다. 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


더 있습니다 filter: scale에 따라하지 developer.mozilla.org/en/docs/Web/CSS/filter
데이비드 Blurton

답변에서 참조 된 URL에 따라 흐릿해야합니다.
Sardtok

-1

그렇지 않으면 텍스트가 흐릿하지 않습니다 transition.transform .

다음과 같이하십시오.

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

같은 전환 없이transition: all .2s;

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.