๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Front-end/CSS

styled-component, useState ์‚ฌ์šฉํ•ด์„œ Modal์ฐฝ ๋งŒ๋“ค๊ธฐ

by ciocio 2021. 9. 14.

๐Ÿ“Œ  Modal ์ฐฝ์ด๋ž€?

 

ํ‰์†Œ์— ์šฐ๋ฆฌ๋Š” "ํŒ์—…์ฐฝ์ด ์ฐจ๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค" ๋ž€ ๋ฉ”์„ธ์ง€๋ฅผ ์ข…์ข… ์ ‘ํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ํŒ์—…์ฐฝ์€ ํ˜„์žฌ ์œ„์น˜ํ•œ ๋ธŒ๋ผ์šฐ์ € ์ด์™ธ์— ๋˜ ๋‹ค๋ฅธ ๋ธŒ๋ผ์šฐ์ € ํŽ˜์ด์ง€๋ฅผ ๋„์šด ๊ฒƒ์„ ๋งํ•œ๋‹ค.

ํ™ˆํŽ˜์ด์ง€์— ์ ‘์†ํ–ˆ์„ ๋•Œ ๊ด‘๊ณ ๋‚˜ ๊ณต์ง€ ๋“ฑ์ด ํŒŒ๋ฐ”๋ฐ• ๋– ์˜ฌ๋ผ์„œ ํ•ด๋‹น ์ฐฝ์„ ์ผ์ผ์ด ๋‹ซ์•„์คฌ๋˜ ๊ฒฝํ—˜์ด ์žˆ์„ ๊ฒƒ์ด๋‹ค.

 

๊ทธ์— ๋ฐ˜ํ•ด ๊ธฐ์กด์˜ ๋ธŒ๋ผ์šฐ์ € ์œ„์— ํ•˜๋‚˜์˜ ๋ ˆ์ด์–ด๋ฅผ ๊นŒ๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. "์ƒˆ๋กœ์šด ์ฐฝ"์ด ์•„๋‹ˆ๋‹ค.

ํŒ์—…์ฐฝ๊ณผ ๋‹ฌ๋ฆฌ ๋ธŒ๋ผ์šฐ์ € ๋‹จ์—์„œ ์ฐจ๋‹จํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜๋“œ์‹œ ํ‘œ์‹œํ•ด์•ผํ•˜๋Š” ์ •๋ณด๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์ข‹๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ฐœ์ธ์ ์œผ๋กœ UI์ ์œผ๋กœ ์ •๋ฆฌ๊ฐ€ ์ž˜ ๋œ ๋Š๋‚Œ์„ ๋ฐ›์•„์„œ, ์•ž์œผ๋กœ๋„ ์• ์šฉํ•  ๊ฒƒ ๊ฐ™๋‹ค.

 

 

๐Ÿ“Œ  Modal ์ฐฝ์˜ ์žฅ๋‹จ์  (feat. Pop-up ์ฐฝ์˜ ์žฅ๋‹จ์ )

 

๊ทธ๋ ‡๋‹ค๋ฉด, Modal ์ฐฝ์€ ์žฅ์ ๋งŒ ์žˆ๋‚˜ ?  Nope.

Pop-up ์ฐฝ๊ณผ ๋น„๊ตํ•ด ์žฅ๋‹จ์ ์„ ์‚ดํŽด๋ณด์ž.

 

โ—พ  Pop-up ์ฐฝ

 

์žฅ์  

โœ”  ํ•œ ๋ฒˆ ๋งŒ๋“ค์–ด ๋‘๋ฉด ์žฌ์‚ฌ์šฉ/ ์žฌํ™œ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค

โœ”  ํŽ˜์ด์ง€๋ณ„ ์ด๋™์ด ์ž์œ ๋กญ๋‹ค. ( ์‚ฌ์šฉ์ž๋ฅผ ํŒ์—…์ฐฝ์— ๋ฌถ์–ด๋‘์ง€ ์•Š์Œ )

 

๋‹จ์ 

โœ”  ํŒ์—…์ฐฝ์„ ๋‹ซ๊ธฐ์œ„ํ•ด์„œ๋Š” ์ง์ ‘ x ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ์•ผ ํ•œ๋‹ค. ( ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ธก๋ฉด์—์„œ ์†Œ๋ชจ์ ์ธ ํ–‰์œ„์ž„ .. )

โœ”  ๋ธŒ๋ผ์šฐ์ € ๋‹จ์—์„œ ํŒ์—…์ฐฝ ์ž์ฒด๋ฅผ ์ฐจ๋‹จ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค. ( ์›ํ•˜๋Š” ์ด๋ฒคํŠธ๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š์Œ )

 

โ—พ  Modal ์ฐฝ

 

์žฅ์ 

โœ”  ๋ ˆ์ด์–ด ์ž์ฒด๋ฅผ ๋ธŒ๋ผ์šฐ์ € ์œ„์— ๊น”๊ธฐ ๋•Œ๋ฌธ์—, ํ•ด๋‹น ๋ ˆ์ด์–ด( ํ•ด๋‹น ํ™”๋ฉด )๋ฅผ ๋งˆ์Œ๊ป ๋””์ž์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

โœ”  ๋ชจ๋‹ฌ์ฐฝ ์ž์ฒด๊ฐ€ ์ฐจ๋‹จ๋‹นํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์—†๋‹ค. ( ์›ํ•˜๋Š” ํ๋ฆ„์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Œ )

 

๋‹จ์ 

โœ”  ๋ชจ๋‹ฌ์ฐฝ์„ ๋„์šฐ๊ณ  ์‹ถ์€ ๋‹จ๊ณ„๋งˆ๋‹ค ์ง์ ‘ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

โœ”  ๋ชจ๋‹ฌ์ฐฝ์„ ๋‹ซ๊ธฐ ์ „์—๋Š” ํŽ˜์ด์ง€๋ณ„ ์ด๋™์ด ์ž์œ ๋กญ์ง€ ์•Š๋‹ค. ( ์‚ฌ์šฉ์ž๋ฅผ ๋ชจ๋‹ฌ์ฐฝ์— ๋ฌถ์–ด ๋†“์Œ )

 

 

๐Ÿ“Œ  Modal ์ฐฝ์„ ๊ตฌํ˜„ํ•ด๋ณด์ž.

๐Ÿ“Œ  ( styled-component๋ฅผ ์‚ฌ์šฉํ•œ React ๊ตฌ์กฐ๋„ ํŒŒ์•…ํ•ด๋ณด์ž. )

์–ด๋–ค์‹์œผ๋กœ ๋ Œ๋”๊ฐ€ ๋˜๋Š”์ง€ ๊ถ๊ธˆํ•ด์„œ ํ•˜๋‚˜ํ•˜๋‚˜ ์ฐ์–ด๋ณด์•˜๋‹ค.

 

 

01 ModalContainer

 

import { useState } from 'react';
import styled from 'styled-components';

export const ModalContainer = styled.div`
  width: 100vw;
  height: 100vh;
  display: flex;
  flex-flow: row wrep;
  justify-content: center;
  align-items: center;
`;

export const Modal = () => {
  const [isOpen, setIsOpen] = useState(false);

  const openModalHandler = () => {
    setIsOpen(!isOpen);
  };

  return (
    <>
      <ModalContainer>
      </ModalContainer>
    </>
  );
};

 

 

 

02 ModalBtn

 

export const ModalBtn = styled.button`
  background-color: #4000c7;
  text-decoration: none;
  border: none;
  padding: 20px;
  color: white;
  border-radius: 30px;
  cursor: grab;
`;

export const Modal = () => {
  const [isOpen, setIsOpen] = useState(false);

  const openModalHandler = () => {
    setIsOpen(!isOpen);
  };

  return (
    <>
      <ModalContainer>
        <ModalBtn onClick={openModalHandler}>
          {isOpen ? "Opened !" : "Open Modal"}
        </ModalBtn>
      </ModalContainer>
    </>
  );
};

 

 

 

03 ModalBackdrop

 

export const ModalBackdrop = styled.div`
  width: 100%;
  height: 100%;
  position: fixed;
  display: flex;
  flex-flow: row wrep;
  justify-content: center;
  align-items: center;
  background: rgba(0, 0, 0, 0.5);
`;

export const Modal = () => {
  const [isOpen, setIsOpen] = useState(false);

  const openModalHandler = () => {
    setIsOpen(!isOpen);
  };

  return (
    <>
      <ModalContainer>
        <ModalBtn onClick={openModalHandler}>
          {isOpen ? "Opened !" : "Open Modal"}
        </ModalBtn>
        {isOpen ? 
        <ModalBackdrop onClick={openModalHandler}>
        </ModalBackdrop> 
        : null}
      </ModalContainer>
    </>
  );
};

 

 

 

04 ModalView

 

export const ModalView = styled.div.attrs(props => ({
  role: 'dialog'
}))`
  text-align: center;
  text-decoration: none;
  padding: 30px 90px;
  background-color: white;
  border-radius: 30px;
  color: #4000c7;
`;

export const Modal = () => {
  const [isOpen, setIsOpen] = useState(false);

  const openModalHandler = () => {
    setIsOpen(!isOpen);
  };

  return (
    <>
      <ModalContainer>
        <ModalBtn onClick={openModalHandler}>
          {isOpen ? "Opened !" : "Open Modal"}
        </ModalBtn>
        {isOpen ? 
        <ModalBackdrop onClick={openModalHandler}>
          <ModalView>
            <div onClick={openModalHandler}>&times;</div>
            <div>Hello World</div>
          </ModalView>
        </ModalBackdrop> 
        : null}
      </ModalContainer>
    </>
  );
};

 

 

 

 

https://styled-components.com/docs

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€