프론트엔드/Component

[Component] 모달(팝업)창 컴포넌트

순코딩 2024. 12. 18. 12:52
이 글은 Next.js, MUI, styled-component 환경에서 작성된 코드를 공유합니다.

 

모달1 ( 주변 어둡게 )



"use client";

import styled from "styled-components";
import Backdrop from "@mui/material/Backdrop";
import Modal from "@mui/material/Modal";
import Fade from "@mui/material/Fade";
import Button from "@mui/material/Button";
import { useState } from "react";
import { Box } from "@mui/material";

const InfoModal = () => {
  // React 상태: 모달 열림 여부 관리
  const [open, setOpen] = useState(false);

  // 모달 열기 함수
  const handleOpen = () => setOpen(true);

  // 모달 닫기 함수
  const handleClose = () => setOpen(false);

  return (
    <>
      {/* 모달을 열기 위한 버튼 */}
      <Button onClick={handleOpen}>모달 버튼</Button>

      {/* Modal 컴포넌트 */}
      <Modal
        open={open} // 모달의 열림/닫힘 상태 제어
        onClose={handleClose} // 모달 닫기 이벤트 핸들러
        closeAfterTransition // 트랜지션 종료 후 모달 제거
        slots={{ backdrop: Backdrop }} // Material-UI의 Backdrop 컴포넌트 삽입
        slotProps={{
          backdrop: {
            timeout: 300, // Backdrop 애니메이션 지속 시간 (ms)
          },
        }}
      >
        {/* Fade 애니메이션으로 모달 표시 */}
        <Fade in={open} timeout={300}>
          {/* 모달 내부 내용 */}
          <StyledBox>
            <div>... 모달에 들어갈 내용</div>
            <div>... 모달에 들어갈 내용</div>
            <div>... 모달에 들어갈 내용</div>
          </StyledBox>
        </Fade>
      </Modal>
    </>
  );
};

export default InfoModal;

// Styled Component: 모달 박스 스타일 정의
const StyledBox = styled(Box)`
  position: absolute; // 박스를 화면 중앙에 위치시키기 위한 절대 위치 지정
  top: 50%; // 화면 세로 중앙
  left: 50%; // 화면 가로 중앙
  transform: translate(-50%, -50%); // 박스 크기 고려하여 정확히 중앙에 배치
  width: 200px; // 박스의 너비
  background-color: white;
  border: 2px solid #000; // 검은색 테두리
  box-shadow: 24px 24px 24px rgba(0, 0, 0, 0.2); // 그림자 효과
  padding: 16px; // 내부 여백
`;

 

 

모달2 ( 주변 그대로 )



"use client";

import styled from "styled-components";
import Modal from "@mui/material/Modal";
import Fade from "@mui/material/Fade";
import Button from "@mui/material/Button";
import { useState } from "react";
import { Box } from "@mui/material";

const InfoModal = () => {
  // React 상태: 모달 열림 여부 관리
  const [open, setOpen] = useState(false);

  // 모달 열기 함수
  const handleOpen = () => setOpen(true);

  // 모달 닫기 함수
  const handleClose = () => setOpen(false);

  return (
    <>
      {/* 모달을 열기 위한 버튼 */}
      <Button onClick={handleOpen}>모달 버튼</Button>

      {/* Modal 컴포넌트 */}
      <Modal
        open={open} // 모달의 열림/닫힘 상태 제어
        onClose={handleClose} // 모달 닫기 이벤트 핸들러
        closeAfterTransition // 트랜지션 종료 후 모달 제거
        slotProps={{
          backdrop: {
            invisible: true,
          },
        }}
      >
        {/* Fade 애니메이션으로 모달 표시 */}
        <Fade in={open} timeout={300}>
          {/* 모달 내부 내용 */}
          <StyledBox>
            <div>... 모달에 들어갈 내용</div>
            <div>... 모달에 들어갈 내용</div>
            <div>... 모달에 들어갈 내용</div>
          </StyledBox>
        </Fade>
      </Modal>
    </>
  );
};

export default InfoModal;

// Styled Component: 모달 박스 스타일 정의
const StyledBox = styled(Box)`
  position: absolute; // 박스를 화면 중앙에 위치시키기 위한 절대 위치 지정
  top: 50%; // 화면 세로 중앙
  left: 50%; // 화면 가로 중앙
  transform: translate(-50%, -50%); // 박스 크기 고려하여 정확히 중앙에 배치
  width: 200px; // 박스의 너비
  background-color: white;
  border: 2px solid #000; // 검은색 테두리
  box-shadow: 24px 24px 24px rgba(0, 0, 0, 0.2); // 그림자 효과
  padding: 16px; // 내부 여백
`;