타겟 엘리먼트가 보이는 정도에 대한 무한 변경을 모두 리포팅하는 것 대신에, IO API는 threshold 를 사용한다. observer를 생성할 떄, 보이는 타겟 엘리먼트늬 노출 퍼센트를 1개 이상의 숫자 값으로 제공한다. API는 threshold 를 넘는 visibility에 대한 변경만 리포트 한다.
예를 들어, target의 visibility가 각 25% 배수들의 이상 혹은 이하가 될 때마다 알림 받고 싶으면, [0, 0.25, 0.5, 0.75, 1] 배열을 통해 threshold list를 명시할 수 있다. isIntersecting 프로퍼티를 통해 more visible과 less visible을 구분할 수 있다.
브라우저는 다음과 같이 마지막 intersection rectangle을 계산한다. 정확히 intersection이 언제 일어나는지 알기 위해 아래 스텝을 이해하는게 도움 될거다.
타겟 엘리먼트의 바운딩 사각형 (이것은, 엘리먼트를 구성하는 모든 컴포넌트의 바운딩 박스를 완전히 감싸는 가장 작은 사각형이다.)은 타겟에서 getBoundingClientRect()를 호출하여 얻는다. 이것은 가장큰 intersection 사각형일 거다. 남은 스텝은 intersect되지 않는 부분을 제거할 것이다.
타겟의 바로 위 부모 블록에서 시작하여 바깥쪽으로 이동하면 각 블락의 clipping(이 있는 경우) intersection 사각형에 적용된다.
Intersection change callbacks
루트 엘리먼트 내에서 보이는 target element들이 visibility thresholds 중 1개를 초과할 떄, IO 객체의 콜백이 수행된다. intersection된 threshold 값마다, 콜백은 IOEntry objects 배열과 IO 객체 자체에 대한 참조를 input으로 받는다
헷갈리는 것들
entry.intersecting이 false가 되기 위해서는 entry.intersecting이 한번이라도 true여야 한다.