[css] CSS 전환 효과로 인해 이미지가 흐려 지거나 이미지가 1px 이동합니까?

가리키면 CSS 전환 효과가 div를 이동시키는 CSS가 있습니다.

예제에서 볼 수 있듯이 문제는 translate전환이 div의 이미지를 1px 아래 / 오른쪽으로 움직이고 (아마도 약간 크기가 조정될 수 있습니까?) 부작용이 발생하여 제자리에 나타나지 않고 초점없는…

글리치는 호버 효과가 적용되는 전체 시간 동안 적용되는 것으로 보이며 시행 착오 과정에서 변환 전환이 div를 이동할 때만 발생한다고 생각할 수 있습니다 (상자 그림자 및 불투명도 적용되지만 차이는 없습니다) 제거시 오류).

페이지에 스크롤 막대가있는 경우에만 문제가 발생하는 것 같습니다. 따라서 하나의 div 인스턴스가있는 예제는 훌륭하지만 한 번 더 동일한 div가 추가되고 페이지에 문제가 다시 발생하는 스크롤 막대가 필요합니다 …



답변

2020 업데이트

  • 흐릿한 이미지에 문제가있는 경우 아래 image-renderingCSS 속성 , 특히 CSS 속성 을 확인하십시오 .
  • 모범 사례 접근성과 SEO를 현명하게 <img>사용하려면 객체 맞춤 CSS 속성을 사용하여 배경 이미지를 태그로 바꿀 수 있습니다.

원래 답변

CSS 에서 이것을 시도하십시오 :

.your-class-name {
    /* ... */
    -webkit-backface-visibility: hidden;
    -webkit-transform: translateZ(0) scale(1.0, 1.0);
}

이것이하는 일은 부서가 “더 많은 2D”로 동작하게 만드는 것입니다.

  • 뒷면이 기본으로 그려져 회전 등으로 물건을 뒤집을 수 있습니다. 시계 방향으로 왼쪽, 오른쪽, 위, 아래로, 크기 조절 또는 회전 (반대) 만 움직일 필요는 없습니다.
  • 항상 0 값을 갖도록 Z 축을 변환합니다.
  • 이제 핸들 크롬 backface-visibilitytransform포함하지 않는 -webkit-접두사. 현재 이것이 다른 브라우저 렌더링 (FF, IE)에 어떤 영향을 미치는지 알 수 없으므로 접두사가 아닌 버전을주의해서 사용하십시오.

답변

요소에 3D 변형을 적용해야하므로 자체 합성 레이어를 얻게됩니다. 예를 들어 :

.element{
    -webkit-transform: translateZ(0);
    transform: translateZ(0);
}

또는

.element{
    -webkit-transform: translate3d(0,0,0);
    transform: translate3d(0,0,0);
}

레이어 생성 기준에 대한 자세한 내용은 여기 ( Chrome의 가속 렌더링)를 참조 하십시오.


설명:

예 (녹색 상자 위로 이동) :

요소에서 전이를 사용하면 브라우저에서 스타일을 다시 계산 한 다음 전이 속성이 시각적 (내 예에서는 불투명) 인 경우에도 내용을 다시 레이아웃하고 요소를 마지막으로 페인트합니다.

스크린 샷

여기서 문제는 전환이 발생하는 동안 페이지에서 “춤”또는 “깜박임”요소를 적용 할 수있는 내용을 다시 레이아웃하는 것입니다. 설정으로 이동하여 “복합 레이어 표시”확인란을 선택한 다음 요소에 3D 변형을 적용하면 주황색 테두리가있는 자체 레이어가 표시됩니다.

스크린 샷

요소가 자체 레이어를 얻은 후 브라우저는 재 레이아웃이나 페인트 작업없이 전환시 레이어를 합성하면되므로 문제를 해결해야합니다.

스크린 샷


답변

내장 된 YouTube iframe과 동일한 문제가있었습니다 (번역은 iframe 요소의 중심을 맞추기 위해 사용되었습니다). CSS 필터 재설정을 시도 하고 마술이 발생할 때까지 위의 솔루션 중 어느 것도 작동하지 않았습니다 .

구조:

<div class="translate">
     <iframe/>
</div>

스타일 [전]

.translate {
  transform: translateX(-50%);
  -webkit-transform: translateX(-50%);
}

스타일 [후]

.translate {
  transform: translateX(-50%);
  -webkit-transform: translateX(-50%);
  filter: blur(0);
  -webkit-filter: blur(0);
}


답변

최신 브라우저에서 테스트 한 실험적인 새로운 속성 CSS를 권장했으며 좋습니다.

image-rendering: optimizeSpeed;             /*                     */
image-rendering: -moz-crisp-edges;          /* Firefox             */
image-rendering: -o-crisp-edges;            /* Opera               */
image-rendering: -webkit-optimize-contrast; /* Chrome (and Safari) */
image-rendering: optimize-contrast;         /* CSS3 Proposed       */
-ms-interpolation-mode: nearest-neighbor;   /* IE8+                */

이를 통해 브라우저는 렌더링 알고리즘을 알게됩니다


답변

변형 될 때 요소가 흐려지는 또 다른 이유를 발견했습니다. transform: translate3d(-5.5px, -18px, 0);요소를로드 한 후 위치를 바꾸는 데 사용 했지만 해당 요소가 흐릿 해졌습니다.

위의 모든 제안을 시도했지만 번역 값 중 하나에 10 진수 값을 사용했기 때문인 것으로 나타났습니다. 정수는 흐려짐을 유발하지 않으며, 정수에서 멀어 질수록 흐려짐이 심해집니다.

5.5px, 요소를 가장 흐리게합니다 5.1px.

누군가를 도울 수 있도록 여기에 척 할 것이라고 생각했습니다.


답변

부드럽게 전환하지 않고 단계별로 전환을 사용하여 문제를 속였습니다.

transition-timing-function: steps(10, end);

그것은 해결이 아니며, 부정 행위이며 어디에서나 적용 할 수 없습니다.

나는 그것을 설명 할 수 없지만 그것은 나를 위해 작동합니다. 다른 답변이 도움이되지 않습니다 (OSX, Chrome 63, 비 레티 나 디스플레이).

https://jsfiddle.net/tuzae6a9/6/


답변

두 배로 확장하고 절반으로 zoom줄이면 나를 위해 일했습니다.

transform: scale(2);
zoom: 0.5;