시간 초과 함수를 삭제하고 버그를 제거합니다. 다음은 정말로 필요한 이벤트입니다. scrollend
scrollend
이벤트 이전에는 스크롤을 감지할 수 있는 안정적인 방법이 없었습니다.
완료되었습니다. 즉, 이벤트가 늦게 실행되거나 사용자의 손가락이 아직 화면에 있는 동안 실행되었습니다. 스크롤이 실제로 종료된 시점을 알 수 없으므로 버그가 발생하고 사용자 환경이 저하되었습니다.
document.onscroll = event => { clearTimeout(window.scrollEndTimer) window.scrollEndTimer = setTimeout(callback, 100) }
이 setTimeout()
전략은 100ms
의 스크롤이 중지되었는지 여부를 알 수 있는 정도입니다. 이렇게 하면 스크롤에 의한 것이 아니라 스크롤이 이벤트를 일시중지한 것처럼 됩니다.
종료된 이벤트입니다.
scrollend
이벤트가 발생하면 브라우저가 이 모든 어려운 평가를 대신 실행합니다.
document.onscrollend = event => {…}
좋습니다. 의미 있는 조건들로 가득한 완벽한 타이밍 가 필요합니다.
사용해 보기
이벤트 세부정보
scrollend
이벤트는 다음과 같은 경우에 실행됩니다.
- 브라우저에서 더 이상 스크롤 애니메이션을 적용하거나 변환하지 않습니다.
- 사용자의 터치가 해제되었습니다.
- 사용자의 포인터가 스크롤 엄지손가락을 놓았습니다.
- 사용자의 키 누름을 눌렀습니다.
- 프래그먼트로 스크롤이 완료되었습니다.
- 스크롤 스냅이 완료되었습니다.
- scrollTo()
가 완료되었습니다.
- 사용자가 시각적 표시 영역을 스크롤했습니다.
다음과 같은 경우에는 scrollend
이벤트가 실행되지 않습니다.
- 사용자의 동작으로 인해 스크롤 위치가 변경되지 않았습니다(변환이 발생하지 않음).
- scrollTo()
는 번역되지 않았습니다.
이 이벤트가 웹 플랫폼에 적용되는 데 시간이 오래 걸린 이유는 사양 세부정보가 필요한 여러 가지 사소한 세부정보 때문입니다. 가장 복잡한 영역 중 하나는
시각적 표시 영역의 scrollend
세부정보를 설명하고 있었습니다.
어떻게 해야 할까요? 웹페이지를 확대한다고 가정해 보겠습니다. 스크롤하면
볼 수 있고, 스크롤해야 볼 수 있는 부분이
문서를 참조하세요. 이 시각적 뷰포인트 사용자 주도 스크롤 상호작용도 완료되면 scrollend
이벤트를 내보냅니다.
이벤트 사용
다른 스크롤 이벤트와 마찬가지로 몇 가지 방법으로 리스너를 등록할 수 있습니다.
addEventListener("scrollend", (event) => {
// scroll ended
});
aScrollingElement.addEventListener("scrollend", (event) => {
// scroll ended
});
또는 이벤트 속성을 사용합니다.
document.onscrollend = (event) => {
// scroll ended
};
aScrollingElement.onscrollend = (event) => {
// scroll ended
};
폴리필 및 점진적 개선
지금 이 새로운 이벤트를 사용하려면 다음 조언을 참고하세요. 현재 스크롤 종료 전략이 있는 경우 계속 사용하고 시작 시 다음을 사용하여 지원을 확인할 수 있습니다.
'onscrollend' in window
// true, if available
브라우저에서 이벤트를 제공하는지에 따라 true 또는 false가 보고됩니다. 이 검사를 통해 코드를 브랜치할 수 있습니다.
if ('onscrollend' in window) {
document.onscrollend = callback
}
else {
document.onscroll = event => {
clearTimeout(window.scrollEndTimer)
window.scrollEndTimer = setTimeout(callback, 100)
}
}
이는 scrollend
이벤트를 점진적으로 개선하기 위한 건전한 시작입니다.
을(를) 사용할 수 있습니다. 브라우저에서 최선을 다하는 제가 만든 폴리필(NPM)을 사용해 볼 수도 있습니다.
import {scrollend} from "scrollyfills"
// then use scrollend as if it's existed this whole time
document.onscrollend = callback
가능한 경우 브라우저 내장 scrollend
이벤트를 사용하도록 폴리필이 점진적으로 개선됩니다. 사용할 수 없는 경우 스크립트는 포인터 이벤트를 감시하고
스크롤하여 이벤트가 종료되는 이벤트를 가장 정확하게 예측합니다.
사용 사례
스크롤하는 동안 계산이 많은 작업을 피하는 것이 좋습니다.
확인할 수 있습니다 이렇게 하면 스크롤이 최대한 많은 메모리를 자유롭게 사용할 수 있고
원활한 진행을 위해 최선을 다해야 합니다. scrollend
이벤트를 사용하면 스크롤이 더 이상 발생하지 않으므로 호출하고 힘든 작업을 실행하기에 적합한 시점이 됩니다.
scrollend
이벤트는 다양한 작업을 트리거하는 데 사용할 수 있습니다. 일반적인 사용 사례는 관련 UI 요소를 스크롤이 중지된 위치와 동기화하는 것입니다. 예를 들면 다음과 같습니다.
- 캐러셀 스크롤 위치를 점 표시기와 동기화합니다.
- 갤러리 항목을 메타데이터와 동기화.
- 사용자가 새 탭으로 스크롤한 후 데이터를 가져옵니다.
사용자가 이메일을 스와이프하는 등의 시나리오를 생각해 보세요. 스와이프가 완료되면 스크롤한 위치를 기반으로 작업을 실행할 수 있습니다.
프로그래매틱 방식 또는 사용자 추가 후 동기화에도 이 이벤트를 사용할 수 있습니다. 또는 로깅 분석과 같은 작업을 추적할 수 있습니다
이것은 화살표, 점, 포커스와 같은 여러 요소가 스크롤 위치에 따라 업데이트해야 합니다. YouTube에서 이 캐러셀을 만든 방법을 확인해 보세요. 실시간 데모를 사용해 보세요.
이 문제를 엔지니어링해 준 메디 카제미와 API 및 구현 가이드를 제공해 준 로버트 플랙에게 감사의 인사를 전합니다.