
React๋ฅผ ์ฌ์ฉํด ์น ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฐ๋ฐํ ๋,
๋ฐ์คํฌํฑ ํ๊ฒฝ๋ฟ๋ง ์๋๋ผ ๋ชจ๋ฐ์ผ ํ๊ฒฝ์์๋ ์ ๋์ํ๋๋ก ๋ง๋๋ ๊ฒ์ด ์ค์ํ๋ค.
์ฌ์ฉ์๋ค์ ๋ง์ ๋น์จ์ด ๋ชจ๋ฐ์ผ ๊ธฐ๊ธฐ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ชจ๋ฐ์ผ ๋์์ ํ์๊ฐ ๋์๋ค.
๋ฐ์ํ ์น(Responsive Web)์ ๋ค์ํ ํ๋ฉด ํฌ๊ธฐ์ ๋ฐ๋ผ
์ฝํ
์ธ ์ ๋ ์ด์์์ด ์๋์ผ๋ก ์กฐ์ ๋๋ ์น ๋์์ธ ๋ฐฉ์์ด๋ค.
์ด๋ฅผ ํตํด ๋ฐ์คํฌํฑ, ํ๋ธ๋ฆฟ, ๋ชจ๋ฐ์ผ ๋ฑ
๋ค์ํ ํ๊ฒฝ์์ ๋์ผํ ์น์ฌ์ดํธ๋ฅผ ์์ฐ์ค๋ฝ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
๋ชจ๋ฐ์ผ ํ๊ฒฝ์์ ์ ์ ํ ํ์๋ฅผ ์ํด ๊ฐ์ฅ ๋จผ์ ํด์ผ ํ ์ผ์
๋ทฐํฌํธ ๋ฉํ ํ๊ทธ๋ฅผ ์ค์ ํ๋ ๊ฒ์ด๋ค.
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
์ด ํ๊ทธ๋ฅผ ์ค์ ํ์ง ์์ผ๋ฉด
๋ชจ๋ฐ์ผ ๋ธ๋ผ์ฐ์ ๋ ์นํ์ด์ง๋ฅผ ์ถ์ํด์ ๋ณด์ฌ์ฃผ๊ธฐ ๋๋ฌธ์ ์๋ํ UI๊ฐ ๋ํ๋ ์ ์๋ค.
CSS์ ๋ฏธ๋์ด ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋ฉด์ ๋๋น์ ๋ฐ๋ผ ์คํ์ผ์ ๋ค๋ฅด๊ฒ ์ ์ฉํ ์ ์๋ค.
/* ๋ชจ๋ฐ์ผ ์ฐ์ */
.container {
padding: 16px;
}
/* ํญ๋ง ์ด์ */
@media (min-width: 768px) {
.container {
padding: 24px;
}
}
/* ๋ฐ์คํฌํ ํ ์ด์ */
@media (min-width: 1024px) {
.container {
padding: 32px;
}
}
๋ชจ๋ฐ์ผ ํผ์คํธ ๋ฐฉ์์ผ๋ก ์ค๊ณํ๋ฉด ๊ธฐ๋ณธ ์คํ์ผ์ ๋ชจ๋ฐ์ผ์ ๊ธฐ์ค์ผ๋ก ์์ฑํ๊ณ ,
์ ์ ๋์ ํ๋ฉด์ ๋ง์ถฐ ์คํ์ผ์ ํ์ฅํด ๋๊ฐ๋ค.
React์์ styled-components๋ฅผ ์ฌ์ฉํ๋ค๋ฉด,
JS ์์์ ๋ฏธ๋์ด ์ฟผ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ ์ ์๋ค.
import styled from 'styled-components'
const Box = styled.div`
padding: 16px;
@media (min-width: 768px) {
padding: 24px;
}
@media (min-width: 1024px) {
padding: 32px;
}
`
์ฝ๋๋ฅผ ์ปดํฌ๋ํธ ๋จ์๋ก ๋๋ ์ ์๊ธฐ ๋๋ฌธ์ ์ ์ง๋ณด์์ ์ฉ์ดํ๋ค.
๋ชจ๋ฐ์ผ ๋์ ์ px ๋จ์๋ณด๋ค๋ rem, %, vh, vw ๊ฐ์ ์๋ ๋จ์์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
ํฐํธ ํฌ๊ธฐ๋ ๋ง์ง์ด ๊ธฐ๊ธฐ ํด์๋์ ๋ง๊ฒ ์์ฐ์ค๋ฝ๊ฒ ์กฐ์ ๋๋๋ก ํ๊ธฐ ์ํจ์ด๋ค.
font-size: 1.2rem;
width: 80%;
height: 50vh;
JavaScript๋ก ํ๋ฉด ํฌ๊ธฐ์ ๋ฐ๋ผ ๋ค๋ฅธ ๊ฐ์ฒด ๋ฐ UI๋ฅผ ์กฐ์ ํ๊ณ ์ถ์ ๋๋
useWindowSize ๊ฐ์ ์ปค์คํ
ํ
์ ์ฌ์ฉํ๋ค.
import { useState, useEffect } from 'react'
function useWindowSize() {
const [size, setSize] = useState([window.innerWidth, window.innerHeight])
useEffect(() => {
const handleResize = () => {
setSize([window.innerWidth, window.innerHeight])
}
window.addEventListener('resize', handleResize)
return () => window.removeEventListener('resize', handleResize)
}, [])
return size
}
์ด๋ฅผ ํตํด ํ๋ฉด ํฌ๊ธฐ์ ๋ฐ๋ผ ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ฅผ ๋ณด์ฌ์ฃผ๋ ๋ฑ ์ ์ฐํ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.
react-device-detect ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํ ๋๋ฐ์ด์ค ๊ฐ์งstyled-components ์์๋ ๋ฏธ๋์ด ์ฟผ๋ฆฌ๋ฅผ ์์ฐ์ค๋ฝ๊ฒ ์ฌ์ฉํ ์ ์๋ค.