display flex
display grid
마우스 이벤트 종류
다음 접속 시에도 활용할 수 있도록 localstorage에 닉네임을 저장하였다.
닉네임 입력 시 랜딩화면이 2초 간 fadeout되어 홈화면이 보이도록 하였다.
fadeout 효과를 주는 클래스 fadeout를 부여한 뒤 2초 뒤 display:none 스타일을 적용하는 disappearWelcome 클래스를 추가한다.
useEffect(() => {
if (nickname === null) return;
setFadeOutEffect((prev) => {
if (prev === null) return "fadeout";
else return prev;
});
const timer = setTimeout(() => {
const welcomeSection = document.getElementById("welcome");
if (welcomeSection) {
setFadeOutEffect((prev) => prev + " disappearWelcome");
}
}, 2000);
return () => clearTimeout(timer);
}, [nickname]);
...
<section className={`welcome ${fadeOutEffect}`}
style={{ backgroundColor: `${color}` }} id="welcome">
...
모달창의 modal-top부분과 랜딩화면의 배경색을 사용자 설정에 따라 변경해주었다. 테마 색상을 redux에서 전역적으로 관리한다.
localstorage에 직접 저장하던 방식을 redux를 통해 전역적으로 관리하는 방식으로 변경하였다. 닉네임 입력과 저장 로직을 재활용할 수 있게 되었다.
square에 모달의 아이콘을 나열하는 을 settings에서 재활용하고자 하였다. 다음과 같은 차이가 설정 되어야 한다.
props를 이용해 컴포넌트 간 설정사항을 전달해주었다.
type IconPropsType = {
imgSize: string;
clickedTime: number;
belongToSettings: boolean;
fontColor: string;
};
...
<div
//클릭 수
onClick={clickedTime === 1 ? onModalOpen : onFocusIcon}
onDoubleClick={clickedTime === 2 ? onModalOpen : undefined}
//hover 효과
className={[
belongToSettings && "icon-hover",
clickedImg === modal.type && "colorChange",
].join(" ")}
...>
</div>
<Icon
imgSize="100px"
clickedTime={2}
belongToSettings={false}
fontColor="black"
/>
<Icon
imgSize="50px"
clickedTime={1}
belongToSettings={true}
fontColor="white"
/>