React/기초

[React] MUI의 useTheme와 useMediaQuery로 구현하는 반응형 웹 (feat. 그 외 방법)

뿌비 2024. 10. 12. 19:25
728x90
업무 할 때  Material-UI(MUI)의 useTheme와 useMediaQuery를 사용하여 반응형 웹을 구현했었는데 그 부분을 조금 정리해보려 한다.

useTheme 이란? 

  • MUI(Material-UI)에서 제공하는 훅으로, 현재 테마에 접근할 수 있게 해준다.
  • 테마는 색상, 간격 등 UI 요소의 스타일을 정의하며, MUI는 기본적으로 테마를 사용하여 UI 구성 요소의 스타일을 일관되게 관리할 수 있도록 돕는다.
  • 이 훅을 사용하면 현재 테마에 정의된 색상, 타이포그래피, 간격 등의 스타일 속성에 쉽게 접근할 수 있어, 사용자 인터페이스를 더 쉽게 커스터마이즈 할 수 있다.
import { useTheme } from '@mui/material/styles';
import React from 'react';

const MyComponent = () => {
  const theme = useTheme();

  // 주요 색상
  console.log(theme.palette.primary.main); // 현재 테마의 주요 색상 출력
  console.log(theme.palette.secondary.main); // 현재 테마의 보조 색상 출력
  console.log(theme.palette.error.main); // 에러 색상 출력

  // 간격 값
  console.log(theme.spacing(2)); // 2단위 간격 출력 (기본적으로 8px * 2 = 16px)

  // 타이포그래피
  console.log(theme.typography.h1); // h1의 스타일 출력
  console.log(theme.typography.body1); // body1의 스타일 출력

  // 브레이크포인트
  console.log(theme.breakpoints.up('sm')); // sm 크기 이상에서의 스타일
  console.log(theme.breakpoints.down('md')); // md 크기 이하에서의 스타일

  return (
    <div>
      <h1 style={{ color: theme.palette.primary.main }}>Hello, World!</h1>
      <p style={{ margin: theme.spacing(2) }}>예시입니다.</p>
    </div>
  );
};

export default MyComponent;

useMediaQuery 이란?

  • 특정 CSS 미디어 쿼리에 대한 결과를 반환하는 훅이다.
  • 이 훅을 사용하여 화면 크기나 특정 조건에 따라 컴포넌트의 렌더링을 제어할 수 있다.
  • 예를 들어, 화면의 너비가 특정 크기 이하인 경우 모바일 레이아웃을 표시하는 방식으로 활용된다.
// 데스크탑: 1280px 이상
const isDesktop = useMediaQuery(theme.breakpoints.up('lg')); 
// 태블릿: 960px 이상, 1280px 미만
const isTablet = useMediaQuery(theme.breakpoints.between('md', 'lg')); 
// 모바일: 600px 이하
const isMobile = useMediaQuery(theme.breakpoints.down('sm'));

useTheme와 useMediaQuery를 사용한 반응형 웹  예시코드 

import { useTheme } from '@mui/material/styles';
import useMediaQuery from '@mui/material/useMediaQuery';
import React from 'react';

const MyComponent = () => {
  const theme = useTheme();
  
  const isDesktop = useMediaQuery(theme.breakpoints.up('lg'));
  const isTablet = useMediaQuery(theme.breakpoints.between('md', 'lg'));
  const isMobile = useMediaQuery(theme.breakpoints.down('sm'));

  // 간단한 스타일 정의
  const containerStyle = {
    padding: isDesktop ? '20px' : isTablet ? '15px' : '10px',
    backgroundColor: isDesktop ? '#f0f0f0' : isTablet ? '#ffffff' : '#fafafa',
  };

  return (
    <div style={containerStyle}>
      <h1>{isDesktop ? '데스크탑 화면' : isTablet ? '태블릿 화면' : '모바일 화면'}</h1>
      <p>{isDesktop ? '여기는 데스크탑 전용 내용입니다.' : '모바일에 적합한 정보입니다.'}</p>
      <table style={{ width: '100%' }}>
        <thead>
          <tr>
            <th>NO</th>
            <th>{isDesktop ? '구매일' : '정보'}</th>
            <th>{isDesktop ? '결제' : '결제 방법'}</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td>1</td>
            <td>2024-01-01</td>
            <td>신용카드</td>
          </tr>
          {/* 추가 데이터 행 */}
        </tbody>
      </table>
    </div>
  );
};

export default MyComponent;

반응형 웹을 구현하는 그 외 방법 

개인 프로젝트를 진행하면서 MUI의 useTheme와 useMediaQuery를 사용하는 방법 외에도, 반응형 웹을 구현할 수 있는 다양한 방법들이 있다는 것을 알게 되어 간단하게 정리해 보았다.

1. CSS 미디어 쿼리와 styled-components 사용

CSS 미디어 쿼리는 특정 화면 크기나 특성에 따라 스타일을 적용하는 데 사용된다.

styled-components와 결합하여 JavaScript에서 CSS를 작성하면 컴포넌트의 스타일을 보다 직관적으로 관리할 수 있다.

import styled from 'styled-components';

// 화면 크기에 따라 글꼴 크기를 설정하는 ResponsiveDiv 컴포넌트
const ResponsiveDiv = styled.div`
  font-size: 14px; // 기본 모바일 글꼴 크기

  @media (min-width: 768px) { // 태블릿
    font-size: 16px;
  }

  @media (min-width: 1224px) { // 데스크탑
    font-size: 20px;
  }
`;

// 실제 컴포넌트
const Component = () => {
  return <ResponsiveDiv>반응형 웹 콘텐츠</ResponsiveDiv>;
};

export default Component;

2. react-responsive 라이브러리 사용

react-responsive 라이브러리는 화면 크기에 따라 조건을 설정하여 컴포넌트의 스타일이나 크기를 동적으로 조정할 수 있도록 도와주는 유틸리티이다. 이를 통해 반응형 웹 디자인을 간편하게 구현할 수 있다.

import { useMediaQuery } from 'react-responsive';

// 화면 크기 확인
const isDesktop = useMediaQuery({ minWidth: 1224 }); // 데스크탑: 1224px 이상
const isTablet = useMediaQuery({ minWidth: 768, maxWidth: 1223 }); // 태블릿: 768px 이상, 1223px 이하
const isMobile = useMediaQuery({ maxWidth: 767 }); // 모바일: 767px 이하

const MyComponent = () => {
  return (
    <div>
      {isDesktop && <p>데스크탑 화면</p>}
      {isTablet && <p>태블릿 화면</p>}
      {isMobile && <p>모바일 화면</p>}
    </div>
  );
};

export default MyComponent;

3. useResponsive 훅 사용

 useResponsive 훅은 화면 크기에 따라 다양한 조건을 설정할 수 있도록 도와주는 유틸리티이다.

이를 통해 컴포넌트의 스타일이나 크기를 동적으로 조정할 수 있다.

const { xxl, lg, md, sm } = useResponsive(); // 다양한 크기 확인

const MyComponent = () => {
  return (
    <div style={{ fontSize: xxl || lg ? '20px' : '16px' }}>
      반응형 웹 콘텐츠
    </div>
  );
};

export default MyComponent;
728x90