모바일 키보드를 고려한 버튼 위치 맞추기


1. 시작
회원가입 페이지를 구현하면서

- 이메일 입력
- 인증코드 입력
- 이름 입력
- 패스워드 입력
이렇게 4개의 페이지로 나누어 개발했다. 한 페이지에 몰아서 할 수도 있는데 최근에 이런 UX를 많이 보기도 했고 사용하기에도 편했다.
그런데 문제는 input focus시 키보드가 올라와 버튼을 가린다.
그래서 현재 visualViewport의 높이를 계산해 버튼 위치를 동적으로 맞췄다.
2. 코드
tsximport { Button, ButtonProps } from '@nextui-org/react';import React from 'react'; const KeyboardAdjustButton: React.FC<ButtonProps> = ({ style, onPress, children, ...other}) => { const [keyboardHeight, setKeyboardHeight] = React.useState(0); React.useEffect(() => { const adjustButton = () => { if (window.visualViewport) { const newKeyboardHeight = window.visualViewport.height < window.innerHeight ? window.innerHeight - window.visualViewport.height : 0; setKeyboardHeight(newKeyboardHeight); } else { setKeyboardHeight(0); } }; if (window.visualViewport) { window.visualViewport.addEventListener('resize', adjustButton); } else { window.addEventListener('resize', adjustButton); } return () => { if (window.visualViewport) { window.visualViewport.removeEventListener('resize', adjustButton); } else { window.removeEventListener('resize', adjustButton); } }; }, []); const onPressEnd = (e: any) => { onPress?.(e); }; return ( <Button style={{ marginBottom: `${keyboardHeight}px`, ...style }} onPressEnd={onPressEnd} {...other} > {children} </Button> );}; export default KeyboardAdjustButton;
3. 결과

Related Articles
- 대용량 엑셀 데이터 가상화 적용하기가상화 라이브러리를 사용할지 직접 구현할지 고민 끝에 직접 구현했다.2025.02.11ryxxn
- React 모달 라이브러리를 만들기까지의 변천사저는 간단한 모달 컴포넌트조차 매번 넣어야 하는 게 불편했어요. 그래서 모달 컴포넌트를 함수로 간단히 실행하는 발상에서 시작해, react-handle-alert라는 라이브러리를 탄생시키기까지의 여정을 담았습니다.2024.05.04ryxxn
- React Quill에서 이미지를 업로드하기 위한 올바른 방법검색 결과에 나온 코드를 참고했다가 버그가 생겨 한참을 헤맸던 경험이에요. React에서 DOM API를 사용했을 때 발생한 버그를 겨우 찾은 이야기2024.04.30ryxxn
- Firebase와 Algolia 동기화 지연 문제 해결하기firebase database와 algolia 간의 동기화 사이에 data fetching했을 때 싱크가 맞지 않는 문제를 찾고 해결한 경험이에요2024.03.24ryxxn