>  기사  >  웹 프론트엔드  >  CSS 전환이 콜백 함수를 시작하거나 트리거하지 않는 이유는 무엇이며, setTimeout을 사용하여 문제를 해결하려면 어떻게 해야 합니까?

CSS 전환이 콜백 함수를 시작하거나 트리거하지 않는 이유는 무엇이며, setTimeout을 사용하여 문제를 해결하려면 어떻게 해야 합니까?

Susan Sarandon
Susan Sarandon원래의
2024-10-31 21:00:02715검색

Why does my CSS transition not start or trigger the callback function, and how can I fix it using a setTimeout?

CSS 전환이 시작되지 않거나 콜백이 호출되지 않음

문제 요약

CSS 전환을 사용하여 HTML 요소의 위치가 업데이트됩니다. 그러나 전환 전환 end 이벤트 리스너를 추가했음에도 불구하고 전환이 트리거되지 않거나 콜백 함수가 호출되지 않습니다. 이 문제는 변경 사항을 setTimeout(1ms)으로 래핑하여 해결할 수 있습니다.

해결 방법 설명

이 동작의 원인은 브라우저의 렌더링 프로세스에 있습니다. 브라우저가 CSS 전환을 적용하려면 먼저 요소에 인라인 스타일을 적용해야 합니다. 요소가 아직 DOM에 없으면 계산된 스타일 표시가 ""로 설정됩니다.

새 스타일이 설정되면 브라우저는 아직 인라인 스타일을 적용하지 않은 것입니다. 따라서 요소의 계산된 스타일은 ""로 유지되며 왼쪽 및 위쪽 값은 여전히 ​​0px입니다.

따라서 다음 프레임 그리기 전에 전환 속성이 ​​적용되면 왼쪽 및 위쪽 값은 이미 원하는 값입니다. 이로 인해 수행할 전환이 없고 Transitionend 이벤트가 트리거되지 않습니다.

이 문제를 해결하려면 Element.offsetHeight getter 또는 최신 스타일이 필요한 기타 DOM 메소드를 사용하여 리플로우를 강제할 수 있습니다. . 이렇게 하면 전환을 적용하기 전에 브라우저가 스타일을 업데이트하여 원활한 구현이 보장됩니다.

다음 코드는 문제와 해결 방법을 보여줍니다.

<code class="html"><div id="spanky"
  style="position: absolute;
    left: 10px;
    top: 10px;
    background-color: blue;
    width: 20px;
    height: 20px;
    transition: left 1000ms linear 0s, top 1000ms linear 0s;">
</div></code>
<code class="js">document.body.innerHTML += tablehtml;

var animdiv = document.getElementById('spanky');
animdiv.addEventListener("transitionend", function(event) {
  animdiv.style.backgroundColor = 'red';
}, false);

// force a reflow
animdiv.offsetTop;

animdiv.style.backgroundColor = 'green';
Object.assign(animdiv.style, {
  left: "100px",
  top: "100px"
});</code>

이 예에서는 animdiv 요소의 offsetTop getter를 사용하여 해당 위치가 업데이트되기 전에 강제로 리플로우를 수행합니다. 이렇게 하면 CSS 전환이 올바르게 트리거되고 콜백 함수가 호출됩니다.

위 내용은 CSS 전환이 콜백 함수를 시작하거나 트리거하지 않는 이유는 무엇이며, setTimeout을 사용하여 문제를 해결하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.