본문 바로가기

Development

[UI 만들기] 4. Popper

 

 

  이번에 만들어보고자 하는 UI는 Popper이다. 일명 토스트라고도 부르는 UI이다. 이번에는 특정시간에 일정한 시간만큼 띄워졌다가 없어지는 기능을 넣고자 한다. 거기에 애니메이션을 추가해서 오른쪽에서 날아오는 형식을 추가하겠다.

  먼저, CSS부터 구성한다.

.nightly-toast {
  position:fixed;
  right: -300px; // 화면 밖에서 시작함.
  top: 50px;
  z-index: 9999;
  width: 300px;
  background-color: #fff;
  border: 1px solid #ddd;
  box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
  transition: all 2s ease-out;
}

.nightly-toast.show {
  right: 50px;
}

.nightly-toast.hide {
  right: -300px;
}

 

여기서 먼저 .nightly-toast라는 CSS 클래스를 만든다. 그리고 posiont: fixed를 사용하여 사용자가 페이지를 스크롤할 때에도 토스트가 제자리에 있도록 한다.

  다음으로 .show와 .hide라는 두 개의 추가 클래스를 만들고, 이 클래스를 토스트가 표시되거나 숨겨질 때 애니메이션을 트리거하는 데 사용된다. 'right' 속성을 사용하여 토스트를 화면 안팎으로 이동하고 transition 속성을 사용하여 움직임에 애니메이션을 적용한다.

import React, { useState, useEffect } from 'react';

function NightlyToast() {
  const [showToast, setShowToast] = useState(false);
  
  useEffect(() => {
    const checkTime = () => {
      const currentHour = new Date().getHours();
      const currentMinute = new Date().getMinutes();
      const isReservationTime = currentHour === 22 && currentMinute === 0;
      
      if (isReservationTime) {
        setShowToast(true);
        const timer = setTimeout(() => setShowToast(false), 30000);
        return () => clearTimeout(timer);
      }
    }
    const interval = setInterval(checkTime, 60000);
      
    return () => clearInterval(interval)
  }, []);
  
  return (
    <div className={`nightly-toast ${showToast ? 'show' : 'hide'}`}>
      <div>
        <strong>Nightly Reminder</strong>
      </div>
      <div>
        Don't forget to brush your teeth before bed!
      </div>
    </div>
  )
}

export default NightlyToast;

이 예에서는 useState와 useEffect hook을 사용하여 토스트 상태와 알림 시간을 관리한다. showToast의 초기값을 false로 설정하고 있고, setInterval을 사용하여 매일 밤 적절한 시간에 함수를 실행하고 있다. 함수가 실행되면 showToast를 true로 설정하여 애니메이션을 트리거하고 setTimeout을 사용하여 30초 후에 토스트를 숨긴다.

'Development' 카테고리의 다른 글

[UI 만들기] 3. Top Navbar  (0) 2023.04.04
[UI 만들기] 2. Modal  (0) 2023.03.27
[UI 만들기] 1. Accordion  (0) 2023.03.24
chat GPT가 말하는 프론트엔드 개발자의 전망  (0) 2023.03.13