1. 문제의 발단
- chatGPT의 도입으로, 서비스에 대화형 인공지능 기능을 개발했다.
- 개발은 그리 어렵지 않았다.(사실 백엔드 처리가 주요 이슈였기 때문에 에러 응답 처리 및 로딩 애니메이션, 유저 인터렉션, 컴포넌트 구현중 레이아웃 흐트러짐등 정도만 하면 되는 일이었다.)
- 하지만 생각지도 못 한 복병이 있었다. 모바일 환경에서 대화를 위한 모바일 키패드가 화면을 절반 이상 가려버렸다.
2. 환경 세팅
- 먼저, 개발 환경의 PC 상황에서는 키패드를 열 수 조차 없었다.
- 하지만 검색결과 Nexus5, Nexus5X 기기에서는 완벽하진 않아도 적당히 열 수 있는 방법이 있다고 했다.
3. 어떻게 처리 할 것인가?
- 내용이 들어갈 공간을 window.innerHeight로 잡고 스크롤을 만들어 준다.
import React, { useState } from 'react';
const Container = () => {
// state로 innerHeight를 잡아 줬다.
const [innerHeight, setInnerHeight] = useState(0);
// innerHeight가 바뀔경우 다시 계산한다.
useEffect(() => {
setInnerHeight(window.innerHeight);
}, [window.innerHeight]);
// 위 헤더나, 푸터가 있을경우 innerHeight - 여분의 사이즈로 맞출 수 도 있다.
return (
<div className={tw`h-[${window.innerHeight}px]`}>
<div className={tw`h-[${innerHeight}px])`}>뭔가 굉장히 길어질 수 있는 컨텐츠</div>
</div>
)
}
4. 여담
- 위의 코드는 예시일 뿐이라 리소스 낭비가 심하다. useEffect에 timeout으로 유저의 동작이 멈췄을 경우만 innerHeight를 계산하는 방식이 옳을 것이다.
- useMemo를 이용하는 방법도 생각해 봤는데, 스크롤은 변화가 심해서 더 낭비일 것이다.
- 프로젝트 초기 세팅이 twind라서 그 기반으로 예시 코드를 작성했다. 해석에는 문제가 없을 것이다. (사실 질문 환영)
- 확실한 것은 다 구현이후, 올바르게 동작하는 것은 확인했지만, 처음부터 모바일 구성이 기획에 없었어서 급하게 사이즈만 줄여 넣자 라고 아쉽게 구현되었다. 처음에는 상단 헤더 또한 큰 사이즈를 차지해 곤란한 상황. 부랴부랴 맞춰 넣은 감이 없지 않다.
'Coding > Today I Learned' 카테고리의 다른 글
2023.06.26(Mon.) <UX/UI 아티클 정리> (0) | 2023.06.26 |
---|---|
2023.06.23(Fri.) <노션 주간 업무 보고 템플릿 공유> (0) | 2023.06.23 |
2023.06.12(Mon.) <프로그레머스 - 푸드 파이트 대회> (0) | 2023.06.12 |
2023.06.10 (Mon.) lodash - isNull (0) | 2023.06.12 |
2023.06.10 (Sat.) lodash - chunk (0) | 2023.06.10 |