20210314 26일차 로딩 효과 구현

2021. 3. 15. 02:51·BootCamp_Codestates/Final Project

구현 사항

  • 로딩 구현(완료)

  • CSS 리팩토링(완료)

 

네비게이션 바를 통해 페이지 이동과 일기 작성 및 수정 시에 아래와 같이 로딩 이미지가 뜨도록 구현했다.

로딩 중에는 마우스 클릭이나 키보드 입력이 불가한데 이는 pointer-events: stroke; 를 이용했다. SVG 형식만 클릭이 가능.

해당 로딩 엘리먼트는 최상위 App 컴포넌트 에 위치시켰는데, useEffect 가 실행될때마다 세션스토리지에 loadingImg 키 값을 확인하고(페이지 이동 버튼을 클릭할 시점에 세션스토리지에 해당 키값을 저장해준다. )visible 일 경우에만 해당 엘리먼트를 찾아 CSS display 값을 flex 로 바꿔준다. 그리고 setTimeOut 을 이용하여 일정 시간이 지난 후 none 으로 바꾸어 주었다. 물론 세션스토리지에서 loadingImg 키값은 바로 삭제해준다.

 

function App(): ReactElement {
	const [isSignin, setSignin] = useState(false);
	const [weatherData, setWeatherData] = useState("");
	const [contentInfo, setContentInfo] = useState(0);
	const [imageUrl, setImgUrl] = useState("");
	const [imageData, setImgData] = useState("");
	const [pContent, setPcontent] = useState(0);
	const [diaryInfo, setDiaryInfo] = useState([]);
	const [content, setContent] = useState([]);
	// const [loadImg, setLoadingImg] = useState(false);

	const setContentId = (e: any) => {
		setContent(e);
	};
	const diaryCollect = (e: any) => {
		setDiaryInfo(e);
	};
	const contentPicker = (e: number) => {
		setPcontent(e);
	};
	const changeSignin = (e: boolean) => {
		setSignin(e);
	};
	const changeWeather = (e: string) => {
		setWeatherData(e);
	};
	const changeImgUrl = (e: string) => {
		setImgUrl(e);
	};
	const changeImgData = (e: string) => {
		setImgData(e);
	};
	const conveyContent = (e: any) => {
		setContentInfo(e);
	};

	const isLogin = JSON.parse(sessionStorage.getItem("isLogin") || "{}");
	useEffect(() => {
		if (isLogin === true) {
			changeSignin(true);
		} else {
			changeSignin(false);
		}
		const loadImg = document.getElementById("loading");
		const loadVisible = sessionStorage.getItem("loadingImg");
		if (loadImg !== null && loadVisible === "visible") {
			loadImg.style.display = "flex";
			setTimeout(() => {
				loadImg.style.display = "none";
			}, 2900);
			sessionStorage.removeItem("loadingImg");
		}
	}, [isLogin]);
	return (
		<Router>
			<LoadingBox id="loading">
				<LoadingImg src={bookImg} alt="Loading Img" />
			</LoadingBox>
			<Main>
				<Switch>
					<Route exact path="/">
						<Manual />
						<SignIn changeSignin={changeSignin} isSignin={isSignin} />
					</Route>

2) 페이지 이동 시키기

특정 버튼을 클릭했을때 페이지 이동과 새로고침을 한꺼번에 해야되기 때문에 아래와 같은 코드를 사용했다.

window.location.href = "해당 endpoint"

세션스토리지에 임시로 loadingImg 라는 키값을 만들어주는데, App 컴포넌트에서 필요하기 때문이다. (useEffect 가 실행될때마다 로딩이미지가 나타나면 안되므로, 판단기준 필요)

const movePage = (e: any) => {
		if (e.target.id === "createDiary") {
			sessionStorage.setItem("loadingImg", "visible");
			window.location.href = "/createDiary";
		} else if (e.target.id === "myDiary") {
			sessionStorage.setItem("loadingImg", "visible");
			window.location.href = "/diaryview";
		} else if (e.target.id === "publicDiary") {
			sessionStorage.setItem("loadingImg", "visible");
			window.location.href = "/diarypublic";
		} else if (e.target.id === "myInfo") {
			sessionStorage.setItem("loadingImg", "visible");
			window.location.href = "/userinfo/calendar";
		} else if (e.target.id === "developer") {
			sessionStorage.setItem("loadingImg", "visible");
			window.location.href = "/developer";
		}
	};
중략...
	return (
		<Main>
			<Navsole>
				<Navin color={colorType.color1} />
				<Navout id="createDiary" color={colorType.color6} onClick={movePage}>
					일기쓰기
				</Navout>
			</Navsole>
			{userNav ? (
				<Navsole className="userMenu">
					<Navin color={colorType.color2} />
					<Navout id="myDiary" color={colorType.color7} onClick={movePage}>
						나의일기
					</Navout>
				</Navsole>
			) : null}
			<Navsole
 후략...

3) 이미지를 제외한 부분의 opacity 만 변경하는 방법

LoadingImg 가 LoadingBox에 포함되어 있는 상황인데, background-color 를 아래와 같이 rgba 를 사용하여 표현해주면 된다. 이때 4번째 인자인 0.5 가 포함된 이미지를 제외한 opacity 이다.

const LoadingBox = styled.div`
	/* border: 5px solid purple; */
	position: absolute;
	background-color: rgba(240, 240, 240, 0.5);
	top: 0rem;
	width: 100%;
	height: 100%;
	display: none;
	justify-content: center;
	align-items: center;
	z-index: 99;
	pointer-events: stroke;
	@media only screen and (max-width: 1200px) {
		height: 110rem;
	}
	@media only screen and (max-width: 480px) {
		height: 77.5rem;
	}
`;
const LoadingImg = styled.img`
	width: 25rem;
	height: 20rem;
	margin-bottom: 5rem;
`;

 

 

해야할것

클라이언트 배포: js로 컴파일하여 배포?

발표준비: 위키, ppt, 기술발표

메뉴얼 페이지에 GIF 이미지 넣어서 구현

 

도움받은 사이트

새로고침과 페이지이동을 한꺼번에 하는법: m.blog.naver.com/PostView.nhn?blogId=diceworld&logNo=220180929456&proxyReferer=https:%2F%2Fwww.google.com%2F

opacity, 배경만 투명하게 하는법: sawol-today.tistory.com/338

gif 파일의 배경 삭제: www.unscreen.com/upload

pointer-events: developer.mozilla.org/ko/docs/Web/CSS/pointer-events

 

'BootCamp_Codestates > Final Project' 카테고리의 다른 글

20210316 27일차 발표녹화완료(재녹화필요), PPT 수정  (0) 2021.03.17
20210315 27일차 배포후 에러 핸들링/메뉴얼 페이지 구현  (0) 2021.03.16
20210313 25일차 제작자 페이지 구현 및 CSS  (0) 2021.03.14
20210312 24일차 제작자 페이지 구현중(80%)  (0) 2021.03.13
20210311 23일차 카카오, 구글 소셜 로그인 구현 완료(OAuth)  (0) 2021.03.12
'BootCamp_Codestates/Final Project' 카테고리의 다른 글
  • 20210316 27일차 발표녹화완료(재녹화필요), PPT 수정
  • 20210315 27일차 배포후 에러 핸들링/메뉴얼 페이지 구현
  • 20210313 25일차 제작자 페이지 구현 및 CSS
  • 20210312 24일차 제작자 페이지 구현중(80%)
JTB
JTB
웹/앱 개발 정보를 공유하고 있습니다.
  • JTB
    JTechBlog
    JTB
  • 전체
    오늘
    어제
    • All About Programming;) N
      • Computer Science
        • Terminology and Concepts
        • Network
        • Operating System
        • Database
        • Data Structure
      • Frontend
        • Javascript Essentials
        • Perfomance Optimization
        • JS Patterns
        • Next.js
        • Flutter
      • Backend
        • Node.js
      • DevOps
        • Docker & Kubernetes
      • Coding Test N
        • LeetCode N
        • Programmers
      • Tech Books & Lectures
        • Javascript_Modern JS Deep d..
        • Network_IT 엔지니어를 위한 네트워크 입문
      • Projects
        • PolyLingo_2025
        • Build Your Body_2024
        • JStargram_2021
        • Covid19 Tracker_2021
        • JPortfolio_2021
      • BootCamp_Codestates
        • TIL
        • TILookCloser
        • Pre Tech Blog
        • IM Tech Blog
        • Daily Issues and DeBugging
        • First Project
        • Final Project
        • Sprint Review
        • Good to Know
        • Socrative Review
        • HTML &amp; CSS
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 글쓰기
    • 관리
  • 공지사항

  • 인기 글

  • 태그

    커리어
    Time complexity and Space complexity
    Threads and Multithreading
    Data Structure
    자바스크립트
    How memory manage data
    모던 자바스크립트 Deep Dive
    indie hacker
    structure of os
    testing
    Shared resources
    Binary Tree BFS
    leetcode
    Operating System
    이벤트
    Network
    VoiceJournal
    프론트엔드 성능 최적화 가이드
    js pattern
    mobile app
    need a database
    CPU scheduling algorithm
    딥다이브
    JavaScript
    DOM
    TCP/IP
    스코프
    자바스크립트 딥다이브
    polylingo
    database
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
JTB
20210314 26일차 로딩 효과 구현
상단으로

티스토리툴바