웹챗을 데스크탑 브라우저로만 보다가 모바일 웹으로 보니까 모바일 가상 키보드가 메세지 리스트를 가리면서 나타나는 현상이 있었다. (매우 부자연스럽...)
입력창에 포커스될 때 메세지 리스트 div를 스크롤 다운 해줘야 할 필요가 생겼다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
import classNames from "classnames/bind";
import React, { useRef, useLayoutEffect } from "react";
import { MessageList } from "../../organisms";
import { MessageInput } from "../../molecules";
const cx = classNames.bind(styles);
const ChattingLayout = _ => {
const listRef = useRef();
useLayoutEffect(_ => {
const detectMobileKeyboard = _ => {
if(document.activeElement.tagName=="INPUT"){
listRef.current.scrollIntoView({ block: 'end' });
}
}
window.addEventListener("resize", detectMobileKeyboard);
return _ => window.removeEventListener("resize", detectMobileKeyboard);
}, []);
return (
<div className={cx("wrapper")}>
<div className={cx("messages-section")}>
<MessageList
innerRef={listRef}
{ ...rest }
/>
</div>
<div className={cx("input-section")}>
<MessageInput />
</div>
</div>
);
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
가상 키보드가 보이면 화면 상 크기가 resize되는 이벤트가 걸릴 수 있다는 걸 알게 되었다!_!
따라서 window 객체에 resize 이벤트를 등록하고 activeElement가 INPUT이면 해당 element를 스크롤 시켰다.
(언마운트될 때 이벤트 제거하는거 잊지 말기)
- 참고한 URL
(참고) 크롬으로 모바일 가상 키보드 테스트할 때
개발툴에 > toggle device toolbar 클릭 후 디바이스종류를 Nexus5, Nexux 5X로 설정하면 가상 키보드 버전을 테스트할 수 있다.
헤더 우측에 Screen Options을 누르면 다음처럼 Portrait - keyboard가 가상 키보드를 오픈한 상태를 말한다.
'Today I Learn > 프론트엔드' 카테고리의 다른 글
[리액트]크로스 브라우징 이슈 해결 경험기 (0) | 2020.04.03 |
---|---|
[리액트] Toast 알람 구현 (1) (0) | 2020.03.31 |
비동기와 Promise (0) | 2020.03.29 |
[리액트] 리액트 훅 기반 프론트엔드 개발 시 주의할 점 (0) | 2020.03.21 |
[리액트] requestAnimationFrame으로 custom hook 만들기 (0) | 2020.03.03 |