CSS ๋ฏธ๋์ด ์ฟผ๋ฆฌ๋ ๋ฐ์ํ ์น ๋์์ธ์ ํต์ฌ ์์๋ก, ๋ค์ํ ๋๋ฐ์ด์ค์์ ์ผ๊ด๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ๋ฐ ํ์์ ์ ๋๋ค. ์ด๋ฒ ํฌ์คํ ์ ์ด๋ณด์๋ ์ฝ๊ฒ ์ดํดํ ์ ์๋๋ก CSS ๋ฏธ๋์ด ์ฟผ๋ฆฌ์ ๊ธฐ๋ณธ ๊ฐ๋ , ๊ณ ๊ธ ํ์ฉ๋ฒ, ์ค์ ์์ , ๋๋ฒ๊น ๊ณผ ์ต์ ํ ๋ฐฉ๋ฒ์ ํฌํจํ์ฌ ์๋ฒฝํ๊ฒ ์ค๋ช ํฉ๋๋ค. ๋ฐ์ํ ์น ๋์์ธ์ ์ํ ๋ฏธ๋์ด ์ฟผ๋ฆฌ ์์ฑ๋ฒ๊ณผ ๋ธ๋ ์ดํฌํฌ์ธํธ ์ค์ , ์ ์ฐํ ๋ ์ด์์ ๊ตฌ์ฑ๊น์ง, CSS ๋ฏธ๋์ด ์ฟผ๋ฆฌ์ ๋ชจ๋ ๊ฒ์ ์์๋ณด์ธ์๐
โฃ ๋ชฉ์ฐจ
๋ฐ์ํ ๋์์ธ์ ๊ตฌํํ๋ ๋ฐ์๋ ๋ฏธ๋์ด ์ฟผ๋ฆฌ ๋์ CSS grid์ flexbox๊ฐ ์ ์ฉํ ๋์์ผ๋ก ์ฐ์
๋๋ค. ์ด๋ค์ ์ด์ฉํ๋ฉด ๋ฏธ๋์ด ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ ๋ง์ ๊ฒฝ์ฐ์ ๋ฐ์ํ ๋์์ธ์ ๊ตฌํํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ ์ด์์์ด ๋ณต์กํ ๊ฒฝ์ฐ์๋ ์ฌ์ ํ ๋ฏธ๋์ด ์ฟผ๋ฆฌ๊ฐ ํ์ํฉ๋๋ค.
CSS grid์ flexbox์ ๊ดํ ๋ด์ฉ์ ์๋ ํฌ์คํ
์ ์ฐธ๊ณ ํด ์ฃผ์ธ์๐
๋ฏธ๋์ด ์ฟผ๋ฆฌ์ ๊ธฐ๋ณธ ๋ฌธ๋ฒ๐ค
CSS ๋ฏธ๋์ด ์ฟผ๋ฆฌ๋ ํน์ ์กฐ๊ฑด์ ๋ฐ๋ผ ์คํ์ผ์ ์ ์ฉํ ์ ์๋๋ก ํ๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ ๋๋ค. ์ด๋ฅผ ํตํด ๋ค์ํ ๋๋ฐ์ด์ค์ ํ๋ฉด ํฌ๊ธฐ์ ์ต์ ํ๋ ๋ฐ์ํ ๋์์ธ์ ๊ตฌํํ ์ ์์ต๋๋ค.
๋ฌธ๋ฒ ์ค๋ช
๋ฏธ๋์ด ์ฟผ๋ฆฌ๋ @media ๊ท์น์ผ๋ก ์์ํ๋ฉฐ, ์กฐ๊ฑด๋ถ ๋ ผ๋ฆฌ ์ฐ์ฐ์์ ํจ๊ป ์ฌ์ฉ๋ฉ๋๋ค. ์ฃผ์ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
@media not|only ๋ฏธ๋์ดํ์
and ๋ฏธ๋์ดํน์ฑ and|or|not ๋ฏธ๋์ด ํน์ฑ {
/* CSS ์ฝ๋ */
}
1. ๋ฏธ๋์ด ํ์
CSS ๋ฏธ๋์ด ์ฟผ๋ฆฌ์์ ์คํ์ผ์ ์ ์ฉํ ๋์ ๋งค์ฒด๋ฅผ ์ง์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ฃผ์ ๋ฏธ๋์ด ํ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- screen: ์ปดํจํฐ ํ๋ฉด, ํ๋ธ๋ฆฟ, ์ค๋งํธํฐ ๋ฑ ์ ์ ๋์คํ๋ ์ด์ฉ.
- print: ์ธ์๋ฌผ๊ณผ ๊ด๋ จ๋ ์คํ์ผ์ ์ ์ํ ๋ ์ฌ์ฉ.
- all: ๋ชจ๋ ๋งค์ฒด์ ์ ์ฉ. ๊ธฐ๋ณธ๊ฐ์ผ๋ก, ๋ชจ๋ ์ ํ์ ์ถ๋ ฅ ์ฅ์น์ ์ ์ฉ๋ฉ๋๋ค.
- speech: ์คํฌ๋ฆฐ ๋ฆฌ๋์ ๊ฐ์ ์์ฑ ํฉ์ฑ ์ฅ์น์ฉ.
2. ๋ฏธ๋์ด ํน์ฑ
๋ฏธ๋์ด ์ฟผ๋ฆฌ์์ ํน์ ์กฐ๊ฑด์ ์ค์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๊ฒฝ์ฐ์๋ง ์คํ์ผ์ ์ ์ฉํ ์ ์์ต๋๋ค. ์ฃผ์ ๋ฏธ๋์ด ํน์ฑ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- width: ๋ทฐํฌํธ์ ๋๋น.
- height: ๋ทฐํฌํธ์ ๋์ด.
- min-width: ์ต์ ๋๋น.
- max-width: ์ต๋ ๋๋น.
- min-height: ์ต์ ๋์ด.
- max-height: ์ต๋ ๋์ด.
- orientation: ํ๋ฉด์ ๋ฐฉํฅ (portrait ๋๋ landscape).
- resolution: ๋์คํ๋ ์ด์ ํด์๋.
- aspect-ratio: ๋ทฐํฌํธ์ ๊ฐ๋ก ์ธ๋ก ๋น์จ.
- color: ๋๋ฐ์ด์ค๊ฐ ์ง์ํ๋ ์ปฌ๋ฌ ์.
- monochrome: ๋ชจ๋ ธํฌ๋กฌ ๋๋ฐ์ด์ค์ ๋นํธ ๊น์ด.
- pointer: ํฌ์ธํฐ ์ฅ์น์ ์ ๋ฐ๋ (none, coarse, fine).
- hover: ํฌ์ธํฐ ์ฅ์น๊ฐ ํธ๋ฒ๋ฅผ ์ง์ํ๋์ง ์ฌ๋ถ (none, hover).
3. ๋ ผ๋ฆฌ ์ฐ์ฐ์
๋ ผ๋ฆฌ ์ฐ์ฐ์๋ ์ฌ๋ฌ ์กฐ๊ฑด์ ๊ฒฐํฉํ๊ฑฐ๋ ํน์ ์กฐ๊ฑด์ ์ ์ธํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ฃผ์ ๋ ผ๋ฆฌ ์ฐ์ฐ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- and: ๋ ์กฐ๊ฑด์ ๋ชจ๋ ๋ง์กฑํด์ผ ์คํ์ผ์ด ์ ์ฉ๋ฉ๋๋ค.
- not: ํน์ ์กฐ๊ฑด์ ์ ์ธํ๊ณ ์คํ์ผ์ ์ ์ฉํฉ๋๋ค.
- only: ํน์ ๋ฏธ๋์ด ํ์ ๊ณผ ํจ๊ป ์ฌ์ฉ๋์ด, ๊ทธ ๋ฏธ๋์ด ํ์ ์๋ง ์คํ์ผ์ ์ ์ฉํฉ๋๋ค. ์ฃผ๋ก ๊ตฌํ ๋ธ๋ผ์ฐ์ ํธํ์ฑ์ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
์์
1. ํ๋ฉด ๋๋น์ ๋ฐ๋ฅธ ์คํ์ผ ๋ณ๊ฒฝ
/* ๊ธฐ๋ณธ ์คํ์ผ */
body {
background-color: white;
font-size: 16px;
}
/* ํ๋ฉด ๋๋น๊ฐ 600px ์ดํ์ผ ๋ ์ ์ฉ */
@media (max-width: 600px) {
body {
background-color: lightgray;
font-size: 14px;
}
}
2. ํ๋ฉด ๋ฐฉํฅ์ ๋ฐ๋ฅธ ์คํ์ผ ๋ณ๊ฒฝ
/* ๊ธฐ๋ณธ ์คํ์ผ */
body {
margin: 20px;
}
/* ํ๋ฉด์ด ์ธ๋ก ๋ฐฉํฅ์ผ ๋ ์ ์ฉ */
@media (orientation: portrait) {
body {
margin: 10px;
}
}
๋ฐ์ํ ๋์์ธ์ ์ํ ๋ฏธ๋์ด ์ฟผ๋ฆฌ ์์ฑ๋ฒโ๏ธ
1. ๋ธ๋ ์ดํฌํฌ์ธํธ ์ค์
๋ธ๋ ์ดํฌํฌ์ธํธ๋ ํ๋ฉด ํฌ๊ธฐ๊ฐ ํน์ ๊ฐ์ ๋๋ฌํ ๋ CSS ์คํ์ผ์ ๋ณ๊ฒฝํ๋ ๊ธฐ์ค์ ์ ๋๋ค. ์ผ๋ฐ์ ์ธ ๋ธ๋ ์ดํฌํฌ์ธํธ ์ค์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๋ชจ๋ฐ์ผ: max-width: 600px
- ํ๋ธ๋ฆฟ: max-width: 768px
- ๋ฐ์คํฌํฑ: min-width: 1024px
์ด๋ฌํ ๋ธ๋ ์ดํฌํฌ์ธํธ๋ ๋๋ฐ์ด์ค ์ข ๋ฅ์ ์ฌ์ฉ์ ํต๊ณ์ ๋ฐ๋ผ ์กฐ์ ํ ์ ์์ต๋๋ค.
์์
/* ๋ชจ๋ฐ์ผ์ฉ ์คํ์ผ */
@media (max-width: 600px) {
body {
font-size: 14px;
background-color: lightgray;
}
}
/* ํ๋ธ๋ฆฟ์ฉ ์คํ์ผ */
@media (max-width: 768px) {
body {
font-size: 16px;
background-color: lightblue;
}
}
/* ๋ฐ์คํฌํ์ฉ ์คํ์ผ */
@media (min-width: 1024px) {
body {
font-size: 18px;
background-color: white;
}
}
2. ์ ์ฐํ ๋ ์ด์์ ๊ตฌ์ฑ
๋ฐ์ํ ๋์์ธ์์๋ ๊ทธ๋ฆฌ๋ ์์คํ
๊ณผ ํ๋ ์ค๋ฐ์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฐํ ๋ ์ด์์์ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
๋ทฐํฌํธ ๋จ์(vw, vh)๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋ฉด ํฌ๊ธฐ์ ๋ฐ๋ผ ์์์ ํฌ๊ธฐ๊ฐ ์๋์ผ๋ก ์กฐ์ ๋ฉ๋๋ค.
์์
/* ๊ธฐ๋ณธ ๊ทธ๋ฆฌ๋ ๋ ์ด์์ */
.container {
display: grid;
grid-template-columns: 1fr;
gap: 10px;
}
@media (min-width: 600px) {
.container {
grid-template-columns: repeat(2, 1fr);
}
}
@media (min-width: 1024px) {
.container {
grid-template-columns: repeat(3, 1fr);
}
}
3. ๋ฏธ๋์ด ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์ฐํ ์ด๋ฏธ์ง ํฌ๊ธฐ ์ค์
์ด๋ฏธ์ง์ ํฌ๊ธฐ๋ฅผ ์ ์ฐํ๊ฒ ์กฐ์ ํ์ฌ ๋ค์ํ ํ๋ฉด ํฌ๊ธฐ์ ๋ง๊ฒ ์ ์ฉํ ์ ์์ต๋๋ค.
์์
img {
width: 100%;
height: auto;
}
@media (min-width: 600px) {
img {
width: 50%;
}
}
@media (min-width: 1024px) {
img {
width: 33.33%;
}
}
4. ํฐํธ ํฌ๊ธฐ ์ค์
๋ฏธ๋์ด ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ํ ํ๋ฉด ํฌ๊ธฐ์ ๋ฐ๋ผ ํฐํธ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ ์ ์์ต๋๋ค.
์์
body {
font-size: 16px;
}
@media (max-width: 600px) {
body {
font-size: 14px;
}
}
@media (min-width: 1024px) {
body {
font-size: 18px;
}
}
5. ๋๋ฐ์ด์ค ๋ฐฉํฅ์ ๋ฐ๋ฅธ ์คํ์ผ ์กฐ์
ํ๋ฉด์ ๋ฐฉํฅ์ ๋ฐ๋ผ ์คํ์ผ์ ์กฐ์ ํ์ฌ ์ฌ์ฉ์๊ฐ ๋ ๋์ ๊ฒฝํ์ ํ ์ ์๋๋ก ํฉ๋๋ค.
์์
/* ๊ธฐ๋ณธ ์คํ์ผ */
body {
margin: 20px;
padding: 10px;
}
/* ์ธ๋ก ๋ฐฉํฅ์ผ ๋ ์ ์ฉ */
@media (orientation: portrait) {
body {
margin: 10px;
padding: 5px;
}
}
/* ๊ฐ๋ก ๋ฐฉํฅ์ผ ๋ ์ ์ฉ */
@media (orientation: landscape) {
body {
margin: 30px;
padding: 15px;
}
}
6. ๊ณ ํด์๋๋๋ฐ์ด์ค ๋์
๊ณ ํด์๋ ๋๋ฐ์ด์ค(๋ ํฐ๋ ๋์คํ๋ ์ด ๋ฑ)์ ๋ง์ถฐ ์ด๋ฏธ์ง๋ฅผ ์ต์ ํํ๊ฑฐ๋ ์คํ์ผ์ ์กฐ์ ํ ์ ์์ต๋๋ค.
์์
/* ๊ธฐ๋ณธ ์ด๋ฏธ์ง */
body {
background-image: url('normal-image.jpg');
}
/* ๊ณ ํด์๋ ๋๋ฐ์ด์ค์ฉ ์ด๋ฏธ์ง */
@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {
body {
background-image: url('high-res-image.jpg');
}
}
7. ๋ฏธ๋์ด ์ฟผ๋ฆฌ๋ก ๋ด๋น๊ฒ์ด์ ๋ฐ ๋ฐ์ํ ๊ตฌํ
๋ฐ์ํ ๋ค๋น๊ฒ์ด์
๋ฐ๋ฅผ ๊ตฌํํ์ฌ ๋ค์ํ ํ๋ฉด ํฌ๊ธฐ์์ ์ ์ ํ๊ฒ ๋ณด์ด๋๋ก ํฉ๋๋ค.
์์
<nav class="navbar">
<a href="#">Home</a>
<a href="#">About</a>
<a href="#">Contact</a>
</nav>
<style>
.navbar {
display: flex;
flex-direction: column;
align-items: center;
}
.navbar a {
padding: 10px;
text-decoration: none;
color: black;
}
@media (min-width: 600px) {
.navbar {
flex-direction: row;
justify-content: space-around;
}
}
</style>
๊ณ ๊ธ ๋ฏธ๋์ด ์ฟผ๋ฆฌ ํ์ฉ๋ฒ๐
๋ฐ์ํ ์น ๋์์ธ์ ํ ๋จ๊ณ ์ ๊ทธ๋ ์ด๋ํ๋ ค๋ฉด, ๊ณ ๊ธ ๋ฏธ๋์ด ์ฟผ๋ฆฌ ํ์ฉ๋ฒ์ ์ตํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ด ์น์ ์์๋ ํน์ ๋๋ฐ์ด์ค ํ๊ฒํ , CSS ๋ณ์์์ ์ฐ๊ณ, ์ฌ์ฉ์ฑ ํฅ์ ๋ฑ์ ๊ณ ๊ธ ๊ธฐ๋ฒ์ ์๊ฐํฉ๋๋ค.
1. ํน์ ๋๋ฐ์ด์ค ํ๊ฒํ
ํน์ ๋๋ฐ์ด์ค๋ฅผ ํ๊ฒ์ผ๋ก ํ ๋ฏธ๋์ด ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ฉด ๋ ์ธ๋ฐํ ๋ฐ์ํ ๋์์ธ์ ๊ตฌํํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๊ณ ํด์๋ ๋๋ฐ์ด์ค, ํฐ์น์คํฌ๋ฆฐ ๋๋ฐ์ด์ค ๋ฑ์ ํ๊ฒํ ํ ์ ์์ต๋๋ค.
๊ณ ํด์๋ ๋๋ฐ์ด์ค ํ๊ฒํ
๊ณ ํด์๋ ๋๋ฐ์ด์ค(๋ ํฐ๋ ๋์คํ๋ ์ด ๋ฑ)์์๋ ๊ณ ํด์๋ ์ด๋ฏธ์ง๋ฅผ ์ ๊ณตํ์ฌ ํ์ง์ ๋์ผ ์ ์์ต๋๋ค.
์์
/* ๊ธฐ๋ณธ ์ด๋ฏธ์ง */
body {
background-image: url('normal-image.jpg');
}
/* ๊ณ ํด์๋ ๋๋ฐ์ด์ค์ฉ ์ด๋ฏธ์ง */
@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {
body {
background-image: url('high-res-image.jpg');
}
}
ํฐ์น์คํฌ๋ฆฐ ๋๋ฐ์ด์ค ํ๊ฒํ
ํฐ์น์คํฌ๋ฆฐ ๋๋ฐ์ด์ค์์๋ ํฐ์น ์นํ์ ์ธ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
์์
/* ๊ธฐ๋ณธ ์คํ์ผ */
button {
padding: 10px;
font-size: 16px;
}
/* ํฐ์น์คํฌ๋ฆฐ ๋๋ฐ์ด์ค์ฉ ์คํ์ผ */
@media (hover: none) and (pointer: coarse) {
button {
padding: 20px;
font-size: 18px;
}
}
2. CSS ๋ณ์์ ๋ฏธ๋์ด ์ฟผ๋ฆฌ
CSS ๋ณ์(์ปค์คํ
ํ๋กํผํฐ)๋ฅผ ๋ฏธ๋์ด ์ฟผ๋ฆฌ์ ํจ๊ป ์ฌ์ฉํ๋ฉด ์ ์ง๋ณด์์ ํ์ฅ์ฑ์ด ๋์ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
์์
:root {
--main-bg-color: white;
--main-font-size: 16px;
}
@media (max-width: 600px) {
:root {
--main-bg-color: lightgray;
--main-font-size: 14px;
}
}
@media (min-width: 1024px) {
:root {
--main-bg-color: white;
--main-font-size: 18px;
}
}
body {
background-color: var(--main-bg-color);
font-size: var(--main-font-size);
}
3. ๋ฏธ๋์ด ํน์ฑ ๊ฒฐํฉ
๋ฏธ๋์ด ํน์ฑ์ ๊ฒฐํฉํ์ฌ ๋ณต์กํ ์กฐ๊ฑด์ ์ค์ ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ค์ํ ์ํฉ์ ๋ง๋ ์คํ์ผ์ ์ ์ฐํ๊ฒ ์ ์ฉํ ์ ์์ต๋๋ค.
ํ๋ฉด ํฌ๊ธฐ์ ๋ฐฉํฅ ๊ฒฐํฉ
ํ๋ฉด ํฌ๊ธฐ์ ๋ฐฉํฅ์ ๊ฒฐํฉํ์ฌ ์คํ์ผ์ ์กฐ์ ํ ์ ์์ต๋๋ค.
์์
@media (min-width: 768px) and (orientation: landscape) {
body {
background-color: lightyellow;
}
}
๋ณตํฉ ์กฐ๊ฑด ์ฌ์ฉ
๋ณตํฉ ์กฐ๊ฑด์ ์ฌ์ฉํ์ฌ ๋ค์ํ ์ํฉ์ ๋ง๋ ์คํ์ผ์ ์ ์ฉํ ์ ์์ต๋๋ค.
์์
@media (min-width: 768px) and (min-resolution: 2dppx), (max-width: 600px) {
body {
background-color: lightcoral;
}
}
4.์ปจํ ์ด๋ ์ฟผ๋ฆฌ ์ฌ์ฉ (CSS Level 4)
์ฝํ
์ด๋ ์ฟผ๋ฆฌ๋ ์์์ ๋ถ๋ชจ ํฌ๊ธฐ์ ๋ฐ๋ผ ์คํ์ผ์ ์ ์ฉํ ์ ์๋ ์๋ก์ด ๊ธฐ๋ฒ์
๋๋ค. ๋ธ๋ผ์ฐ์ ์ง์์ด ์ ํ์ ์ด์ง๋ง, ์ต์ ๊ธฐ์ ์ ๋ฏธ๋ฆฌ ์ตํ๋ ๊ฒ์ ์ค์ํฉ๋๋ค.
์์
/* ์ฝํ
์ด๋ ํฌ๊ธฐ์ ๋ฐ๋ฅธ ์คํ์ผ ์กฐ์ */
.container {
container-type: inline-size;
}
@container (min-width: 500px) {
.item {
font-size: 20px;
}
}
5. ํ๋ฆฌํผ๋ ์ปฌ๋ฌ ์คํด
์ฌ์ฉ์์ ์์คํ
์์ ์ค์ ์ ๋ฐ๋ผ ์คํ์ผ์ ์กฐ์ ํ ์ ์์ต๋๋ค. ๋คํฌ ๋ชจ๋์ ๋ผ์ดํธ ๋ชจ๋์ ๋ง์ถฐ ์ฌ์ดํธ์ ์์์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
์์
/* ๊ธฐ๋ณธ ๋ผ์ดํธ ๋ชจ๋ ์คํ์ผ */
body {
background-color: white;
color: black;
}
/* ๋คํฌ ๋ชจ๋ ์คํ์ผ */
@media (prefers-color-scheme: dark) {
body {
background-color: black;
color: white;
}
}
6. ์ฌ์ฉ์ ํ๊ฒฝ ์ค์ ๊ธฐ๋ฐ ์คํ์ผ ์กฐ์
์ฌ์ฉ์์ ํ๊ฒฝ ์ค์ ์ ๋ง์ถฐ ์น์ฌ์ดํธ์ ์คํ์ผ์ ์กฐ์ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์๊ฐ ์ ๋๋ฉ์ด์
์ ์ ํธํ์ง ์๋ ๊ฒฝ์ฐ ์ ๋๋ฉ์ด์
์ ๋นํ์ฑํํ ์ ์์ต๋๋ค.
์์
/* ๊ธฐ๋ณธ ์ ๋๋ฉ์ด์
์คํ์ผ */
@keyframes example {
from {opacity: 0;}
to {opacity: 1;}
}
div {
animation: example 1s linear infinite;
}
/* ์ฌ์ฉ์๊ฐ ์ ๋๋ฉ์ด์
์ ์ ํธํ์ง ์๋ ๊ฒฝ์ฐ */
@media (prefers-reduced-motion: reduce) {
div {
animation: none;
}
}
7. ๋ฏธ๋์ด ์ฟผ๋ฆฌ๋ก ๋ ์ด์์ ์ต์ ํ
๋ ์ด์์์ ์ต์ ํํ์ฌ ๋ค์ํ ํ๋ฉด ํฌ๊ธฐ์์ ๋ณด๊ธฐ ์ข์ ๋ ์ด์์์ ๊ตฌํํ ์ ์์ต๋๋ค.
์์
/* ๊ธฐ๋ณธ ๋ ์ด์์ */
.container {
display: flex;
flex-direction: column;
}
@media (min-width: 600px) {
.container {
flex-direction: row;
}
}
์ค์ ์์ ๐ ๏ธ
๋ฐ์ํ ์น ๋์์ธ์ ๊ตฌํํ๊ธฐ ์ํด ๋ค์ํ ๋ฏธ๋์ด ์ฟผ๋ฆฌ์ CSS ๊ธฐ๋ฒ์ ์ฌ์ฉํ์ฌ ์ค์ ์์ ๋ฅผ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค. ์ด ์์ ์์๋ ๋ฐ์ํ ๋ด๋น๊ฒ์ด์ ๋ฐ์ ๋ฐ์ํ ์ด๋ฏธ์ง ๊ฐค๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค์ด๋ด ๋๋ค.
์์ 1: ๋ฐ์ํ ๋ค๋น๊ฒ์ด์ ๋ฐ
๋ฐ์ํ ๋ค๋น๊ฒ์ด์ ๋ฐ: ํ๋ฉด ๋๋น๊ฐ 768px ์ดํ์ผ ๋ ํ๋ฒ๊ฑฐ ๋ฉ๋ด๊ฐ ํ์๋๊ณ , ์ด๋ฅผ ํด๋ฆญํ๋ฉด ๋ค๋น๊ฒ์ด์ ๋งํฌ๊ฐ ํ์๋ฉ๋๋ค. ํฐ ํ๋ฉด์์๋ ๋ชจ๋ ๋ค๋น๊ฒ์ด์ ๋งํฌ๊ฐ ๊ฐ๋ก๋ก ๋์ด๋ฉ๋๋ค.
HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Responsive Navbar</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<nav class="navbar">
<div class="logo">MySite</div>
<div class="menu-icon" onclick="toggleMenu()">☰</div>
<ul class="nav-links">
<li><a href="#">Home</a></li>
<li><a href="#">About</a></li>
<li><a href="#">Services</a></li>
<li><a href="#">Contact</a></li>
</ul>
</nav>
<script>
function toggleMenu() {
const navLinks = document.querySelector('.nav-links');
navLinks.classList.toggle('active');
}
</script>
</body>
</html>
CSS
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 0;
}
.navbar {
display: flex;
justify-content: space-between;
align-items: center;
background-color: #333;
padding: 10px;
}
.logo {
color: white;
font-size: 24px;
}
.nav-links {
list-style: none;
display: flex;
margin: 0;
padding: 0;
}
.nav-links li {
margin: 0 10px;
}
.nav-links a {
text-decoration: none;
color: white;
padding: 5px 10px;
border-radius: 5px;
transition: background 0.3s;
}
.nav-links a:hover {
background-color: #575757;
}
.menu-icon {
display: none;
font-size: 24px;
color: white;
cursor: pointer;
}
@media (max-width: 768px) {
.nav-links {
display: none;
flex-direction: column;
width: 100%;
position: absolute;
top: 50px;
left: 0;
background-color: #333;
}
.nav-links.active {
display: flex;
}
.nav-links li {
text-align: center;
margin: 10px 0;
}
.menu-icon {
display: block;
}
}
์์ 2: ๋ฐ์ํ ์ด๋ฏธ์ง ๊ฐค๋ฌ๋ฆฌ
๋ฐ์ํ ์ด๋ฏธ์ง ๊ฐค๋ฌ๋ฆฌ: ํ๋ฉด ๋๋น์ ๋ฐ๋ผ ๊ฐค๋ฌ๋ฆฌ์ ์ด ์๊ฐ ๋ณํฉ๋๋ค. 600px ๋ฏธ๋ง์์๋ 1์ด, 600px ์ด์์์๋ 2์ด, 1024px ์ด์์์๋ 3์ด๋ก ์ด๋ฏธ์ง๊ฐ ๋ฐฐ์น๋ฉ๋๋ค.
HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Responsive Image Gallery</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<div class="gallery">
<div class="gallery-item"><img src="image1.jpg" alt="Image 1"></div>
<div class="gallery-item"><img src="image2.jpg" alt="Image 2"></div>
<div class="gallery-item"><img src="image3.jpg" alt="Image 3"></div>
<div class="gallery-item"><img src="image4.jpg" alt="Image 4"></div>
<div class="gallery-item"><img src="image5.jpg" alt="Image 5"></div>
<div class="gallery-item"><img src="image6.jpg" alt="Image 6"></div>
</div>
</body>
</html>
CSS
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 0;
}
.gallery {
display: grid;
gap: 10px;
padding: 10px;
}
.gallery-item {
overflow: hidden;
}
.gallery-item img {
width: 100%;
height: auto;
display: block;
transition: transform 0.3s;
}
.gallery-item img:hover {
transform: scale(1.1);
}
@media (min-width: 600px) {
.gallery {
grid-template-columns: repeat(2, 1fr);
}
}
@media (min-width: 1024px) {
.gallery {
grid-template-columns: repeat(3, 1fr);
}
}
๋๋ฒ๊น ๊ณผ ์ต์ ํ๐ ๏ธ
๋ฏธ๋์ด ์ฟผ๋ฆฌ ๋๋ฒ๊น ํด ์๊ฐ
๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฏธ๋์ด ์ฟผ๋ฆฌ๋ฅผ ๋๋ฒ๊น ํ ์ ์์ต๋๋ค. ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์ด๊ณ , "Toggle Device toolbar"๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์ํ ํ๋ฉด ํฌ๊ธฐ์์ ์ฌ์ดํธ๋ฅผ ํ ์คํธํ ์ ์์ต๋๋ค.
์ฑ๋ฅ ์ต์ ํ
- ๋ฏธ๋์ด ์ฟผ๋ฆฌ ์์: ๋ฏธ๋์ด ์ฟผ๋ฆฌ๋ CSS ํ์ผ์ ์๋จ์ ์์นํ๋๋ก ํ์ฌ, ํ์ด์ง๊ฐ ๋ก๋๋ ๋ ์ฟผ๋ฆฌ๋ฅผ ๋นจ๋ฆฌ ํด์ํ ์ ์๋๋ก ํฉ๋๋ค.
- CSS ์ต์ ํ: ๋ถํ์ํ CSS ์ฝ๋๋ฅผ ์ ๊ฑฐํ๊ณ , CSS ํ์ผ์ ์์ถํ์ฌ ํ์ผ ํฌ๊ธฐ๋ฅผ ์ต์ํํฉ๋๋ค. ์ด๋ฅผ ํตํด ํ์ด์ง์ ๋ก๋ฉ ์๋๋ฅผ ๊ฐ์ ํ ์ ์์ต๋๋ค.
- ์ด๋ฏธ์ง ์ต์ ํ: ๋ฐ์ํ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ ๋๋ ํ์ํ ํฌ๊ธฐ๋งํผ ์ด๋ฏธ์ง๋ฅผ ์ต์ ํํ์ฌ ์ ๊ณตํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋์ญํญ์ ์ ์ฝํ๊ณ ํ์ด์ง ๋ก๋ฉ ์๋๋ฅผ ํฅ์ํ ์ ์์ต๋๋ค.
- ๋ ์ด์์ ์ต์ ํ: ๋ ์ด์์์ด ๋ณต์กํ ๊ฒฝ์ฐ, CSS ๊ทธ๋ฆฌ๋๋ ํ๋ ์ค๋ฐ์ค์ ๊ฐ์ ๋ ์ด์์ ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ์ฝ๋๋ฅผ ์ต์ ํํ ์ ์์ต๋๋ค.
- ๋ฏธ๋์ด ์ฟผ๋ฆฌ ์กฐ๊ฑด ์ต์ ํ: ๋ถํ์ํ ๋ฏธ๋์ด ์ฟผ๋ฆฌ๋ฅผ ์ ๊ฑฐํ๊ณ , ์กฐ๊ฑด์ ์ต์ ํํ์ฌ ํ์ํ ์คํ์ผ๋ง ์ ์ฉ๋๋๋ก ํฉ๋๋ค.
- ๋ธ๋ผ์ฐ์ ์บ์ฑ ํ์ฉ: ์บ์ฑ์ ํตํด ์์ฃผ ์ฌ์ฉ๋๋ ํ์ผ์ ๋ธ๋ผ์ฐ์ ์ ์ ์ฅํ์ฌ ๋ค์ด๋ก๋ ์๊ฐ์ ๋จ์ถํ ์ ์์ต๋๋ค. ์ ์ ํ ์บ์ฑ ์ ๋ต์ ์ฌ์ฉํ์ฌ ํ์ด์ง์ ์ฑ๋ฅ์ ํฅ์ํฉ๋๋ค.
์์
/* ๋ฏธ๋์ด ์ฟผ๋ฆฌ ๋ด ๋๋ฒ๊น
์ฉ ์ถ๋ ฅ ์ถ๊ฐ */
@media (min-width: 768px) {
body {
background-color: lightblue;
/* ๋๋ฒ๊น
์ฉ ์ถ๋ ฅ ์ถ๊ฐ */
content: 'Min-width: 768px';
}
}
/* CSS ํ์ผ ์์ถ ๋ฐ ์ต์ ํ */
/* Before */
body {
background-color: lightblue;
}
@media (min-width: 768px) {
body {
font-size: 16px;
}
}
/* After */
body{background-color:lightblue}@media (min-width:768px){body{font-size:16px}}
<!-- ์ด๋ฏธ์ง ์ต์ ํ -->
<!-- Before -->
<img src="large-image.jpg" alt="Large Image">
<!-- After -->
<img src="small-image.jpg" alt="Small Image" width="320" height="240">
ํต์ฌ ๋ด์ฉ๐