Front-end/Styling

[CSS] Media Query: ๋ฐ˜์‘ํ˜• ์›น์˜ ๋งˆ๋ฒ•์‚ฌ! ๐Ÿ“ฑ

xeunnie 2024. 12. 24. 01:00
728x90
๋ฐ˜์‘ํ˜•

Media Query ํ†บ์•„๋ณด๊ธฐ! ๐Ÿš€

CSS Media Query๋Š” ๋ฐ˜์‘ํ˜• ์›น ๋””์ž์ธ(Responsive Web Design)์˜ ํ•ต์‹ฌ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ๋””๋ฐ”์ด์Šค์™€ ํ™”๋ฉด ํฌ๊ธฐ์—์„œ ์ตœ์ ์˜ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๋ ค๋ฉด Media Query๋ฅผ ๊ผญ ์•Œ์•„์•ผ ํ•ด์š”! ๐ŸŽฏ


Media Query๋ž€? ๐Ÿš

Media Query๋Š” CSS3์—์„œ ๋„์ž…๋œ ๊ธฐ๋Šฅ์œผ๋กœ,ํŠน์ • ์กฐ๊ฑด(ํ™”๋ฉด ํฌ๊ธฐ, ํ•ด์ƒ๋„, ์ƒ‰์ƒ ๊นŠ์ด, ๋””๋ฐ”์ด์Šค ํƒ€์ž…, ๋””๋ฐ”์ด์Šค ๋ฐฉํ–ฅ ๋“ฑ)์— ๋”ฐ๋ผ CSS ์Šคํƒ€์ผ์„ ์กฐ๊ฑด๋ถ€๋กœ ์ ์šฉํ•˜๋Š” ๊ทœ์น™์ด์—์š”. ํ™”๋ฉด์ด ์ข์•„์งˆ์ˆ˜๋ก ๋””์ž์ธ์ด ๊นจ์ง€์ง€ ์•Š๊ณ  ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ณ€๊ฒฝ๋˜๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค.

/* ๊ธฐ๋ณธ ์Šคํƒ€์ผ */
body {
  background-color: lightblue;
}

/* ํ™”๋ฉด ๋„ˆ๋น„๊ฐ€ 768px ์ดํ•˜์ผ ๋•Œ ์ ์šฉ */
@media (max-width: 768px) {
  body {
    background-color: lightcoral;
  }
}

 

๐Ÿ‘‰ ํ™”๋ฉด ํฌ๊ธฐ๊ฐ€ 768px ์ดํ•˜๋กœ ์ค„์–ด๋“ค๋ฉด ๋ฐฐ๊ฒฝ์ƒ‰์ด ํŒŒ๋ž€์ƒ‰์—์„œ ๋นจ๊ฐ„์ƒ‰์œผ๋กœ ๋ฐ”๋€๋‹ˆ๋‹ค!


Media Query ๊ธฐ๋ณธ ๋ฌธ๋ฒ• ๐Ÿ’ป 

Media Query๋Š” @media ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

@media (์กฐ๊ฑด) {
  /* ์กฐ๊ฑด์ด ์ฐธ์ผ ๋•Œ ์ ์šฉํ•  ์Šคํƒ€์ผ */
}

์กฐ๊ฑด ์œ ํ˜•

  1. max-width / min-width: ํ™”๋ฉด ๋„ˆ๋น„๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์กฐ๊ฑด ์„ค์ •
  2. max-height / min-height: ํ™”๋ฉด ๋†’์ด๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์กฐ๊ฑด ์„ค์ •
  3. aspect-ratio: ํ™”๋ฉด์˜ ๊ฐ€๋กœ์„ธ๋กœ ๋น„์œจ
  4. resolution: ํ™”๋ฉด์˜ ํ•ด์ƒ๋„
  5. orientation: ํ™”๋ฉด ๋ฐฉํ–ฅ (์„ธ๋กœ/๊ฐ€๋กœ)

 

์˜ˆ์ œ: ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

 

1. ํ™”๋ฉด ๋„ˆ๋น„์— ๋”ฐ๋ฅธ ์Šคํƒ€์ผ: width / height

  • max-width: ํ™”๋ฉด์˜ ์ตœ๋Œ€ ๋„ˆ๋น„
  • min-width: ํ™”๋ฉด์˜ ์ตœ์†Œ ๋„ˆ๋น„.
/* ๊ธฐ๋ณธ ์Šคํƒ€์ผ */
h1 {
  font-size: 24px;
}

/* ํ™”๋ฉด ๋„ˆ๋น„๊ฐ€ 600px ์ดํ•˜์ผ ๋•Œ */
@media (max-width: 600px) {
  h1 {
    font-size: 18px;
  }
}

 

๐Ÿ‘‰ ํ™”๋ฉด์ด ์ข์•„์ง€๋ฉด ๊ธ€์ž ํฌ๊ธฐ๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค.


2. ์„ธ๋กœ/๊ฐ€๋กœ ๋ฐฉํ–ฅ์— ๋”ฐ๋ผ ์Šคํƒ€์ผ ๋ณ€๊ฒฝ: orientation (๋””๋ฐ”์ด์Šค ๋ฐฉํ–ฅ)

  • portrait: ์„ธ๋กœ ๋ชจ๋“œ
  • landscape: ๊ฐ€๋กœ ๋ชจ๋“œ
@media (orientation: portrait) {
  body {
    background-color: lightgreen;
  }
}

@media (orientation: landscape) {
  body {
    background-color: lightblue;
  }
}

 

๐Ÿ‘‰ ํ™”๋ฉด ๊ฐ€๋กœ ์„ธ๋กœ ๋ชจ๋“œ์— ๋”ฐ๋ผ ๋ฐฐ๊ฒฝ ์ƒ‰๊น”์ด ๋‹ฌ๋ผ์ง


3. ๊ณ ํ•ด์ƒ๋„ ๋””๋ฐ”์ด์Šค ์Šคํƒ€์ผ๋ง: resolution (ํ•ด์ƒ๋„)

  • min-resolution: ์ตœ์†Œ ํ•ด์ƒ๋„
  • max-resolution: ์ตœ๋Œ€ ํ•ด์ƒ๋„
@media (min-resolution: 2dppx) {
  img {
    content: url('high-resolution.png');
  }
}

 

๐Ÿ‘‰ Retina ๋””์Šคํ”Œ๋ ˆ์ด๋‚˜ ๊ณ ํ•ด์ƒ๋„ ํ™”๋ฉด์—์„œ ์„ ๋ช…ํ•œ ์ด๋ฏธ์ง€๋ฅผ ์ œ๊ณตํ•˜๋ ค๋ฉด resolution ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.


4. ๊ฐ€๋กœ ์„ธ๋กœ ๋น„์œจ: aspect-ratio

@media (aspect-ratio: 16/9) {
  .video-container {
    width: 100%;
  }
}

 

๐Ÿ‘‰ ๋””๋ฐ”์ด์Šค ํ™”๋ฉด์˜ ๊ฐ€๋กœ ์„ธ๋กœ ๋น„์œจ์„ ๊ธฐ์ค€์œผ๋กœ ์Šคํƒ€์ผ์„ ์ ์šฉ


Media Query์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž ๐Ÿš 

1. and (์กฐ๊ฑด์ด ๋ชจ๋‘ ์ฐธ์ผ ๋•Œ)

@media (min-width: 600px) and (max-width: 1200px) {
  body {
    font-size: 16px;
  }
}

 

2. or (์กฐ๊ฑด ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์ฐธ์ผ ๋•Œ, ํ‚ค์›Œ๋“œ ,๋กœ ํ‘œํ˜„)

@media (max-width: 600px), (orientation: portrait) {
  body {
    background-color: lightcoral;
  }
}

 

3. not (์กฐ๊ฑด์„ ๋ถ€์ •)

@media not (max-width: 600px) {
  body {
    font-size: 18px;
  }
}

 

4. only (ํ•ด๋‹น ์กฐ๊ฑด์—๋งŒ ์ ์šฉ)

@media only screen and (max-width: 600px) {
  body {
    background-color: lavender;
  }
}

Media Query ์‹ค์ „ ์˜ˆ์ œ ๐Ÿ–ผ๏ธ

1. Mobile First ๋””์ž์ธ ์ „๋žต

๋ชจ๋ฐ”์ผ ์šฐ์„  ์ „๋žต์€ ๊ธฐ๋ณธ ์Šคํƒ€์ผ์„ ๋ชจ๋ฐ”์ผ ์ค‘์‹ฌ์œผ๋กœ ์ž‘์„ฑํ•˜๊ณ , ๋” ํฐ ํ™”๋ฉด์„ ์œ„ํ•œ ์Šคํƒ€์ผ์„ Media Query๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

/* ๊ธฐ๋ณธ ์Šคํƒ€์ผ (๋ชจ๋ฐ”์ผ ์šฐ์„ ) */
body {
  font-size: 14px;
}

/* ํƒœ๋ธ”๋ฆฟ */
@media (min-width: 768px) {
  body {
    font-size: 16px;
  }
}

/* ๋ฐ์Šคํฌํ†ฑ */
@media (min-width: 1024px) {
  body {
    font-size: 18px;
  }
}

 

2. Grid ๋ ˆ์ด์•„์›ƒ์— Media Query ์ ์šฉ

.container {
  display: grid;
  grid-template-columns: 1fr;
  gap: 16px;
}

@media (min-width: 768px) {
  .container {
    grid-template-columns: repeat(2, 1fr);
  }
}

@media (min-width: 1024px) {
  .container {
    grid-template-columns: repeat(4, 1fr);
  }
}

 

3. ์ด๋ฏธ์ง€ ๋ฐ˜์‘ํ˜• ์ฒ˜๋ฆฌ

img {
  width: 100%;
  height: auto;
}

@media (min-width: 768px) {
  img {
    width: 50%;
  }
}

4.  ๋‹คํฌ ๋ชจ๋“œ ๊ตฌํ˜„ํ•˜๊ธฐ

๋‹คํฌ ๋ชจ๋“œ๋Š” ํ˜„๋Œ€ ์›น์‚ฌ์ดํŠธ์—์„œ ํ•„์ˆ˜์ฃ . Media Query๋กœ ๊ฐ„๋‹จํžˆ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์–ด์š”.

@media (prefers-color-scheme: dark) {
  body {
    background-color: #121212;
    color: #ffffff;
  }
}

@media (prefers-color-scheme: light) {
  body {
    background-color: #ffffff;
    color: #000000;
  }
}

5.  ๋ฐ˜์‘ํ˜• ๋„ค๋น„๊ฒŒ์ด์…˜ ๊ตฌํ˜„ํ•˜๊ธฐ 

ํ™”๋ฉด ํฌ๊ธฐ์— ๋”ฐ๋ผ ๋„ค๋น„๊ฒŒ์ด์…˜์„ ๋ณ€๊ฒฝํ•˜๋Š” ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค.

/* ๊ธฐ๋ณธ ์Šคํƒ€์ผ */
nav {
  display: flex;
}

/* ํ™”๋ฉด์ด ์ข์•„์ง€๋ฉด ๋„ค๋น„๊ฒŒ์ด์…˜ ์ˆจ๊ธฐ๊ธฐ */
@media (max-width: 768px) {
  nav {
    display: none;
  }
}

CSS-in-JS์—์„œ Media Query ์‚ฌ์šฉ ๐Ÿ“–

React ์Šคํƒ€์ผ๋ง ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ๋„ Media Query๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Styled-Components

import styled from "styled-components";

const Container = styled.div`
  font-size: 14px;

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

  @media (min-width: 1024px) {
    font-size: 18px;
  }
`;

export default function App() {
  return <Container>Hello, Media Query!</Container>;
}

 

Emotion

/** @jsxImportSource @emotion/react */
import { css } from '@emotion/react';

const containerStyle = css`
  font-size: 14px;

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

  @media (min-width: 1024px) {
    font-size: 18px;
  }
`;

export default function App() {
  return <div css={containerStyle}>Hello, Media Query!</div>;
}

Media Query ์‚ฌ์šฉ ์‹œ ์ฃผ์˜์‚ฌํ•ญ ๐Ÿ–๏ธ

  1. ํ…Œ์ŠคํŠธ ํ•„์ˆ˜: ๋‹ค์–‘ํ•œ ๋””๋ฐ”์ด์Šค์™€ ํ™”๋ฉด ํฌ๊ธฐ์—์„œ ํ…Œ์ŠคํŠธํ•˜์„ธ์š”.
  2. ์กฐ๊ฑด ์ค‘๋ณต ์ฃผ์˜: min-width์™€ max-width ์กฐ๊ฑด์ด ๊ฒน์น˜์ง€ ์•Š๋„๋ก ์„ค์ •
  3. ์„ฑ๋Šฅ ์ตœ์ ํ™”: ๋„ˆ๋ฌด ๋งŽ์€ Media Query๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด CSS ํŒŒ์ผ์ด ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ์–ด์š”.

๊ฒฐ๋ก : ๋ฐ˜์‘ํ˜• ๋””์ž์ธ์€ Media Query๋กœ! ๐ŸŒŸ

Media Query๋Š” ํ˜„๋Œ€ ์›น์—์„œ ๋‹ค์–‘ํ•œ ๋””๋ฐ”์ด์Šค๋ฅผ ์ง€์›ํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ธ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๊ณ  ํ™œ์šฉํ•˜๋ฉด ์•„๋ฆ„๋‹ต๊ณ  ์œ ์—ฐํ•œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ง€๊ธˆ ๋‹น์žฅ ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”„๋กœ์ ํŠธ์— Media Query๋ฅผ ์ ์šฉํ•ด๋ณด์„ธ์š”!

 

๐ŸŒท์ „์„ค์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์–ด๋ด…์‹œ๋‹น! ๐ŸŒท

728x90
๋ฐ˜์‘ํ˜•