개발을 할 때 스크롤과 탭을 구현해야하는데 문제가 있었다.
이전 포스트에서도 sdk를 불러오는 로딩 시간과 영역을 확보하는 과정에 관련된 글을 올렸는데 오늘은 스크롤과 탭을 구현할 때 선택한 방식과 용기를 내어 뒤엎고 다시 개발하게 된 과정에 대해 글을 써보려 한다.
- 스크롤 할 때 해당 영역의 정보를 가진 탭이 상단에 노출되어 스크롤이 동작해야하며 스크롤된 영역에 해당하는 탭이 선택 되어야한다.
- 탭을 클릭하면 해당 영역으로 이동해야한다.
지난번 포스트의 예시를 네이버탭에 비유하여 글을 썼으니 오늘도 이어 네이버탭에 비유하여 코드의 예시를 들어 보겠다.
스크롤과 탭을 개발할 때 이것 저것 찾고 그 안에서 고민을 했던 것은
- 탭 : scrollIntoView()
- 스크롤 : Observer (web api)
먼저 탭의 기능을 개발했는데 id값을 찾아 쉽게 영역을 찾는 scrollIntoViwe()를 찾아 적용하게 되었다.
스크롤은 observer를 사용하였는데, 특정 영역에 닿았을 때를 인지하기 좋은 방법이라 생각해 선택하게 되었다.
Observer를 사용한 동작 방식은 스크롤을 내릴 땐 viewport의 하단으로 읽히고 스크롤을 올릴땐 viewport의 상단 부분으로 영역을 읽어 탭이 완벽하게 동작하니 스크롤에 문제 없이 동작할 수 있을거라 생각하여 개발을 하기 시작했다.
탭을 먼저 개발 → 스크롤을 개발할 때 개발 완료된 탭이랑 엮기
실수의 결과는 이러했다.
- 탭을 눌렀을 때 탭에 해당하는 영역으로 이동하지만 그 영역이 충분치 않고 상단 혹은 하단의 영역이 viewport에 들어와 노출될 때 observer의 교차점에 걸린 영역이 읽혀 스크롤 이동이 되는 문제 발생.
- 스크롤 이동 시 상단 방향으로 스크롤하다 하단 방향으로 스크롤 할 때 observer의 특성에 따라 intersection의 위치에(상단으로 스크롤할 땐 상단의 교차지점에 닿아야하고 하단으로 스크롤할 땐 하단의 교차점에 닿아야 영역을 인지함) 닿지 않으면 탭의 ui가 선택된 형태로 변하지 않아 영역을 인지하지 않는 것 처럼 보임.
이러한 크리티컬한 문제를 흐린눈 할 수 없었다. 당장에야 큰 문제가 없어 보이고 테스트에도 해당 문제가 제기되진 않았지만 사용자가 실제로 서비스를 사용할 때 분명히 어색하다고 느낄 수 있는 부분이라고 생각했다.
그래서 주말에 따로 갈아엎는 작업을 하기로 마음 먹게 되었다.
네이버 쇼핑은 어떤식으로 동작을 할까?
관찰하기
1. 네이버에서는 어떠한 방식으로 탭과 스크롤을 작동시키고 어느 intersection에 닿을 때 탭이 움직이는지
2. 개발자 도구를 열어 어떤 식으로 이동하는지 힌트 찾기
네이버에서는 a 링크를 사용하였는데 찾아보니 장점으로는 간단한 구현과 뒤로가기 클릭시 이전 위치로 이동 등이 있었다. 내가 구성해야하는 기능의 기획에는 필요하지 않은 기능이었기에 ref를 사용해 해당 돔에 접근하는 방식을 선택하게 되었다.
sdk를 사용하여 불러오는 영역의 관리를 보다 쉽게 하기 위해서도 더 적합하다는 판단이 들었기 때문이다.
- 탭 : scrollIntoView()
- 스크롤 : ref로 해당 영역을 잡아 scrollTop와 offsetTop등의 값으로 영역의 위치를 잡아 비교하여 처리
상단의 intersection에서 감지되어 탭과 스크롤이 자연스럽게 잘 동작하는 것을 확인할 수 있다!