CSS 전환 중 Webkit 텍스트 렌더링 변경을 방지하는 방법


81

CSS 전환 상태를 전환하기 위해 CSS 전환을 사용하고 있습니다 (기본적으로 요소의 크기 전환). 요소가 전환 될 때 페이지의 나머지 텍스트 (Webkit에서)는 전환이 완료 될 때까지 렌더링을 약간 변경하는 경향이 있습니다.

바이올린 : http://jsfiddle.net/russelluresti/UeNFK/

나는 또한 이것이 -webkit-font-smoothing: antialiased속성 / 값 쌍이 있는 내 헤더에서 발생하지 않는다는 것을 알았 습니다. 그래서 나는 텍스트가 기본 모양 (글꼴 스무딩에 대한 "자동"값)을 유지하고 전환 중에 렌더링을 변경하지 않도록하는 방법이 있는지 궁금합니다.

"자동"값을 사용하도록 텍스트를 명시 적으로 설정하려고 시도했지만 아무 작업도 수행하지 않습니다. 또한 font-smoothing을 "none"으로 설정하면 전환 중에 렌더링 깜박임이 방지됩니다.

도움을 주시면 감사하겠습니다.

편집 1

제가 OS X를 사용하고 있다는 점에 유의해야합니다. Parallels의 Chrome에서 테스트를 보는 동안 두 개의 다른 단락이 다르게 작동하는 것을 보지 못했기 때문에 이것은 Mac 전용 문제 일 수 있습니다.


21. Safari 버전은 6입니다. 두 브라우저 모두에서 발생하므로 브라우저가 아닌 Webkit이라고 생각합니다.
RussellUresti

앤티 앨리어싱 된 단락과 앨리어싱 된 단락 모두 동일한 동작을 나타냅니다. 크롬 버전 23.0.1270.0 카나리아 | 21.0.1180.89m | 5.17 사파리

나는 당신이 Chrome의 개발 버전을 사용하고 있다고 생각합니다. 그러나 OS가 이것에 일부 역할을 할 수 있습니다. OSX를 사용하고 있음을 알리기 위해 질문을 편집하겠습니다.
RussellUresti

1
왜 이것이 작동하는지 전혀 모르겠지만 '-webkit-transform : translateZ (0);' '.antialiased {}로 수정하는 것 같습니다. 'p {}'에 추가해도 작동합니다. 왜 이것이 효과가 있는지 설명 할 수 없기 때문에 답변으로 제공하는 것이 옳지 않다고 생각했습니다. 도움이 되었기를 바랍니다.
Christofer Vilander 2012 년

@Christofer 그것은 그것들을 일관되게 만듭니다-그러나 그것들은 모두 앤티 앨리어싱 된 것처럼 보입니다 (모두 더 얇은 텍스트입니다). 앤티 앨리어싱되지 않은 텍스트 (첫 번째 단락)를 기본 스타일 (앤티 앨리어싱 된 텍스트보다 약간 더 굵게 표시됨)으로 유지하려고합니다.
RussellUresti

답변:


83

해결책을 찾은 것 같습니다.

-webkit-transform: translateZ(0px);

부모 요소에 하드웨어 가속강제 하면 문제가 해결되는 것 같습니다 ...

편집 주석에서 언급했듯이,이 해킹은 글꼴 부드럽게하기를 비활성화하고 글꼴, 브라우저 및 OS에 따라 텍스트 렌더링을 저하시킬 수 있습니다!


글꼴 다듬기를 시도했지만 작동하지 않았습니다. 이 시도, 그것은 완벽하게 작동
locrizak

이것은이 언급 된 문제에 대해 원하는 결과를 얻지 못했지만 다른 CSS 전환 문제를 해결하는 데 도움이됩니다 (전환 요소 내에서 콘텐츠를 숨기거나 표시 할 때 이상한 깜박임 텍스트 등).
RussellUresti

3
나를 위해 작동하지 않는 반면 -webkit-font-smoothing : antialiased; 및 -webkit-backface-visibility : hidden; 공장. 크레딧은 여기 stackoverflow.com/questions/11589985/...
F Lekschas

멋진 일이 내가 발견 상황에 대해 자신을 일을하는 유일한 방법입니다
래리

4
이것은 처음에 글꼴 다듬기를 비활성화합니다. 따라서 전환 시작시 글꼴 다듬기, 전환 중에는 글꼴 다듬기, 끝 부분에는 글꼴 다듬기가 없습니다. 따라서 글꼴 스무딩은 변경되지 않고 글꼴 스무딩도 전혀 없습니다.
yunzen

45

2020 년 8 월 업데이트

더 이상 하위 픽셀 글꼴 다듬기를 활성화하기 위해 미디어 쿼리로 Safari를 대상으로 지정할 필요가 없습니다. 기본값은 괜찮습니다.

그러나 기본적으로 하위 픽셀 글꼴 다듬기를 사용 하지만 , 일관된 텍스트 렌더링을 원하는 모든 사람을 위해 Chrome의 글꼴 다듬기 에서 연고 에 중요한 부분이 있습니다 .

  1. 어두운 배경에 밝은 텍스트를 Chrome에서 렌더링 한 것입니다. 어둠 속에 빛
  2. 밝은 배경에 어두운 텍스트를 Chrome에서 렌더링 한 것입니다. 빛에 어둡다

위의 문자 e에서 전체의 크기를보십시오. 어두운 배경의 밝은 텍스트는 밝은 배경의 어두운 텍스트 (동일한 CSS 글꼴 스타일)보다 눈에 띄게 더 무거운 가중치로 렌더링됩니다.

사용자의 어둡거나 밝은 테마 설정을 존중하는 사이트의 한 가지 해결책은 어두운 모드로 제한된 미디어 쿼리로 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-antialiased이제 Chrome에서는 효과가 없지만 Safari에서는 여전히 많은 것을 개선하지만 RETINA에서만 가능합니다. 망막 화면의 Safari에서 텍스트가 없으면 텍스트가 얇고 멍청한 반면 텍스트가 있으면 적절한 무게가 있습니다. 그러나 Safari의 비 레티 나 디스플레이에서 이것을 사용하면 (특히 가벼운 값에서) 텍스트는 재앙입니다. 미디어 쿼리를 사용하는 것이 좋습니다.

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

-webkit-font-smoothing: subpixel-antialiased더 얇은 앤티 앨리어싱 된 텍스트를 적어도 부분적으로 피하려는 경우 명시 적으로 설정 하는 것이 현재 최상의 솔루션입니다.

--tl; dr--

기본 글꼴 렌더링이 하위 픽셀 앤티 앨리어싱을 사용하는 Safari와 Chrome 모두에서, 위의 제안처럼 translateZ를 사용하여 변환을 사용하거나 심지어 크기 전환 만 사용하도록 GPU 기반 렌더링을 강제하는 CSS는 Safari와 Chrome이 자동으로 "포기"합니다. "하위 픽셀 앤티 앨리어싱 된 글꼴 다듬기 대신 앤티 앨리어싱 된 텍스트로 전환합니다.이 텍스트는 특히 Safari에서 훨씬 더 밝고 얇아 보입니다.

다른 응답은 단순히 더 얇은 안티에 일리 어스 텍스트에 글꼴을 부드럽게 설정하거나 강제하여 지속적인 렌더링을 유지하는 데 중점을 두었습니다. 내 눈에 translateZ 또는 backface hidden을 사용하면 텍스트 렌더링의 품질이 크게 저하되며 텍스트가 일관성을 유지하고 더 얇은 텍스트를 사용하는 것이 괜찮을 경우 최상의 솔루션 -webkit-font-smoothing: antialiased입니다. 그러나 명시 적으로 설정하면 -webkit-font-smoothing: subpixel-antialiased실제로 약간의 효과가 있습니다. 텍스트는 여전히 약간 변경되고 GPU에서 렌더링되는 전환 중에 눈에 띄게 얇아 지지만이 설정이 없을 때만 큼 얇지는 않습니다. 따라서 이것은 최소한 부분적으로 안티 에일 리 어스 텍스트로의 전환을 방해하는 것처럼 보입니다.


2
멋진 글을 써 주셔서 감사합니다!
Denis Gorbachev

2
이것이 최상의 솔루션입니다. 다른 모든 영업 이익은 구체적으로 무엇을 요구되는 텍스트 렌더링, 분해 하지 마십시오
fregante

나를위한 생명의 은인! 감사. CSS 전환 후 갑자기 하위 픽셀 렌더링으로 전환하는 것을 방지합니다. 적어도 불투명 전환을 사용하면 전환 중에도 글꼴이 (이론적으로 항상 기본값) 하위 픽셀 렌더링을 유지합니다. 큰!
Garavani 2014

우리를위한 최고의 솔루션! 감사합니다
커널

감사합니다. 1 년 전에이 문제를 접하고 모든 것을 잊었습니다. 이것은 설명 된 문제를 해결 한 유일한 솔루션입니다.
Iain Collins

20

나는 -webkit-backface-visibility : hidden;을 사용하여 전환으로 인해 그래픽 문제 (깜박임 / 말더듬 / 잘림 등)가 발생할 때마다 거의 매번 발견했습니다. 작용하는 요소에 대해 문제를 해결하는 경향이 있습니다.


3
이것은 (현재) 정답입니다. 내가 아는 한 webkit-font-smoothing은 얼마 전에 제거되었고 다시 추가 될 예정 이었지만 현재 Chrome의 최신 버전에서는 작동하지 않습니다. translateZ 트릭도 더 이상 작동하지 않는 것 같습니다. 언제든 다시 바뀔 수 있다고 생각합니다. : /
Mantriur 2013-08-23

3
이로 인해 일부 텍스트가 흐리게 처리되었습니다.
John

8

하드웨어 가속으로 인한 텍스트 렌더링 변경을 방지하려면 다음 중 하나를 수행 할 수 있습니다.

  1. 모든 텍스트를 -webkit-font-smoothing : antialiased로 설정합니다. 이는 텍스트가 더 얇고 하위 픽셀 앤티 앨리어싱이 아님을 의미합니다.

  2. 하드웨어 가속의 영향을받는 텍스트가 하위 픽셀 앤티 앨리어싱 (기본 글꼴 다듬기)되도록하려면 해당 텍스트를 테두리없이 입력 내부에 넣고 비활성화하면 해당 하위 픽셀이 앤티 앨리어싱됩니다 (최소한 Mac OS X의 Chrome). 다른 플랫폼에서는 테스트하지 않았지만 하위 픽셀 안티 앨리어싱이 중요한 경우이 트릭을 사용할 수 있습니다.


Win8.1 및 Chrome 47에서 옵션 2 (입력 요소가있는 트릭)를 테스트했지만 작동하지 않습니다.
Paya 2015


3

이것이 나를 위해 일한 것입니다. 도움이 되었기를 바랍니다. 다른 stackoverflow 게시물에서 발견되었습니다.

-webkit-font-smoothing:antialiased;
-webkit-backface-visibility:hidden;

1

렌더링 변경을 방지하려면 설정 font-smoothing: antialiased(또는 none) 해야합니다 .

하위 픽셀 글꼴 렌더링을 비활성화하는 브라우저는 하드웨어 가속의 부작용 일 수 있습니다. 렌더링 대상 배경이 지속적으로 이동하는 경우 각 프레임을 모든 배경 레이어에 대해 확인해야하므로 텍스트를 별도의 레이어에 렌더링 할 수 없습니다. 이것은 성능을 심각하게 저하시킬 수 있습니다.

애플에 자주 비활성화 서브 픽셀 글꼴 다듬기 들이 자신의 사이트.


글꼴 스무딩을 앤티 앨리어싱으로 설정하는 문제는 텍스트가 내가 원하는 것처럼 보이지 않는다는 것입니다. 글꼴 스무딩을 "자동"(더 굵은 모양)으로 설정하는 시각적 효과를 원하지만 이렇게하면 전환 중에 텍스트가 이동합니다. 그래서 제 목표는 항상 "자동"의 대담한 모습을 유지하는 것입니다.
RussellUresti

1
하드웨어 가속을 사용하지 않으면 문제를 해결할 수 있습니다. jQuery에서 타이머를 사용하고 수동으로 전환을 수행합니다 (CSS 전환없이). 성능과 부드러움이 더 나빠질 것이기 때문에 추천 할 수 있을지 모르겠습니다.
Henrik

사실, jQuery를 사용하여 애니메이션화 할 수 있습니다. 다른 솔루션이없는 경우 이것이 유일한 솔루션 일 수 있습니다.
RussellUresti

1

위의 솔루션 ( -webkit-transform: translateZ(0px)요소 및 -webkit-font-smoothing: antialiased페이지) 외에도 일부 요소가 여전히 제대로 작동하지 않을 수 있습니다. 나를 위해 그것은 입력 요소의 자리 표시 자 텍스트였습니다.position:relative


-1

나는 같은 문제가 있었다. 주의 깊게 읽으십시오.

요소가 전환 될 때 페이지나머지 텍스트 (Webkit에서)는 전환이 완료 될 때까지 렌더링을 약간 변경하는 경향이 있습니다.

위의 솔루션 중 어느 것도 작동하지 않는 것 같습니다. 그러나 설정 (같은 것)

#myanimation { -webkit-transform: translateZ(0px); }

애니메이션 이 있는 요소에서 작동했습니다.

애니메이션 요소를 GPU 레이어로 가져 가면 페이지 렌더링의 정상적인 흐름에서 벗어날 수 있습니다 (예를 들어 Z- 인덱스 같은 것도 더 이상 작동하지 않음). 부작용으로 애니메이션과 페이지의 나머지 부분이 더 이상 서로 영향을주지 않습니다.

글꼴 렌더링에 영향을 미치는 경우 애니메이션 요소에만 영향을 미칩니다. 내 Chrome에서 차이가 보이지 않습니다.


나는 바로 잡았다. 페이지의 나머지 부분과 translateZ (0)이 적용되지 않은 곳에서도 글꼴 렌더링이 변경된 것을 볼 수 있습니다.
commonpike 2014

이것이 흐릿 해지는 글꼴 아이콘이있을 때 나를 위해 일한 유일한 것입니다. 애니메이션되는 섹션에 변환을 적용하여 문제를 해결했습니다.
Bill은

야, 이것은 이미 2 년 전에 대답했다. 바로 위에 ... 정확히 동일한 답변 / 코드.
NiCk Newman

그래, 내 유일한 점은 당신은 넣어 가지고 있었다 -webkit-transform애니메이션을 가지고 요소 렌더링 변경 방지하기 위해, 페이지의 다른 요소를 . 그러나 언급했듯이 잠시 동안 작동했으며 나중에 페이지의 일부를 변경했을 때 작동이 중지되었습니다.
commonpike
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.