CSS @ ๊ท์น (At-rules)
ํน์ ๊ท์น์ ์ํํ๋๋ก ์ง์ํ๋ ๋ฌธ์ฅ์
๋๋ค.
์ฃผ์ @ ๊ท์น
@import
๋ค๋ฅธ ์คํ์ผ์ํธ๋ฅผ ํ์ฌ ์คํ์ผ์ํธ๋ก ๊ฐ์ ธ์ต๋๋ค.
@import url('styles.css');
@import url('print.css') print;
CSS
๋ณต์ฌ
@media (๋ฏธ๋์ด ์ฟผ๋ฆฌ)
ํน์ ๋ฏธ๋์ด ์กฐ๊ฑด์ ๋ฐ๋ผ ์คํ์ผ์ ์ ์ฉํฉ๋๋ค.
@media screen and (max-width: 768px) {
.container {
width: 100%;
}
}
CSS
๋ณต์ฌ
@font-face
์น ํฐํธ๋ฅผ ์ ์ํ์ฌ ์ฌ์ฉ์ ์ ์ ๊ธ๊ผด์ ์ฌ์ฉํ ์ ์๊ฒ ํฉ๋๋ค.
@font-face {
font-family: 'MyFont';
src: url('myfont.woff2') format('woff2');
}
CSS
๋ณต์ฌ
4. @keyframes
CSS ์ ๋๋ฉ์ด์
์ ์ค๊ฐ ๋จ๊ณ๋ฅผ ์ ์ํฉ๋๋ค.
@keyframes slide {
from {
transform: translateX(0);
}
to {
transform: translateX(100px);
}
}
CSS
๋ณต์ฌ
@charset
์คํ์ผ์ํธ์ ๋ฌธ์ ์ธ์ฝ๋ฉ์ ์ง์ ํฉ๋๋ค.
@charset "UTF-8";
CSS
๋ณต์ฌ
@supports
๋ธ๋ผ์ฐ์ ๊ฐ ํน์ CSS ๊ธฐ๋ฅ์ ์ง์ํ๋์ง ํ์ธํฉ๋๋ค.
@supports (display: grid) {
.container {
display: grid;
}
}
CSS
๋ณต์ฌ
๋ฐ์ํ ์น ๋์์ธ
๋ค์ํ ๋๋ฐ์ด์ค์ ํ๋ฉด ํฌ๊ธฐ์ ๋ง์ถฐ ๋ ์ด์์์ด ์๋์ผ๋ก ์กฐ์ ๋๋ ์น ๋์์ธ ๊ธฐ๋ฒ์
๋๋ค.
ํต์ฌ ๊ฐ๋
๋ทฐํฌํธ (Viewport)
๋ชจ๋ฐ์ผ ๊ธฐ๊ธฐ์์ ์น ํ์ด์ง๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ํ์ํ๊ธฐ ์ํ ๋ฉํ ํ๊ทธ ์ค์ ์ด ํ์ํฉ๋๋ค.
<meta name="viewport" content="width=device-width, initial-scale=1.0">
HTML
๋ณต์ฌ
๋ฏธ๋์ด ์ฟผ๋ฆฌ (Media Queries)
ํ๋ฉด ํฌ๊ธฐ, ํด์๋, ๋ฐฉํฅ ๋ฑ์ ๋ฐ๋ผ ๋ค๋ฅธ ์คํ์ผ์ ์ ์ฉํฉ๋๋ค.
์ผ๋ฐ์ ์ธ ๋ธ๋ ์ดํฌํฌ์ธํธ
๋๋ฐ์ด์ค ์ ํ | ํ๋ฉด ํฌ๊ธฐ ๋ฒ์ | ๋ฏธ๋์ด ์ฟผ๋ฆฌ | ์ค๋ช
|
๋ชจ๋ฐ์ผ (์ํ) | 0px ~ 575px | @media (max-width: 575px) | ์ค๋งํธํฐ ์ธ๋ก ๋ชจ๋ |
๋ชจ๋ฐ์ผ (๋ํ) | 576px ~ 767px | @media (min-width: 576px) | ๋ํ ์ค๋งํธํฐ |
ํ๋ธ๋ฆฟ (์ธ๋ก) | 768px ~ 991px | @media (min-width: 768px) | ํ๋ธ๋ฆฟ ์ธ๋ก ๋ชจ๋, ์ํ ๋
ธํธ๋ถ |
ํ๋ธ๋ฆฟ (๊ฐ๋ก) | 992px ~ 1199px | @media (min-width: 992px) | ํ๋ธ๋ฆฟ ๊ฐ๋ก ๋ชจ๋, ์คํ ๋ฐ์คํฌํฑ |
๋ฐ์คํฌํฑ | 1200px ~ 1399px | @media (min-width: 1200px) | ์ผ๋ฐ ๋ฐ์คํฌํฑ |
๋ํ ๋ฐ์คํฌํฑ | 1400px ์ด์ | @media (min-width: 1400px) | ๊ณ ํด์๋ ๋ํ ๋ชจ๋ํฐ |
๋ฏธ๋์ด ์ฟผ๋ฆฌ ์์ :
/* ๋ชจ๋ฐ์ผ ์ฐ์ (Mobile First) */
.container {
width: 100%;
padding: 10px;
}
/* ํ๋ธ๋ฆฟ */
@media (min-width: 768px) {
.container {
width: 750px;
margin: 0 auto;
}
}
/* ๋ฐ์คํฌํฑ */
@media (min-width: 1024px) {
.container {
width: 960px;
}
}
/* ๊ณ ํด์๋ ๋ฐ์คํฌํฑ */
@media (min-width: 1200px) {
.container {
width: 1140px;
}
}
CSS
๋ณต์ฌ
์ ์ฐํ ๊ทธ๋ฆฌ๋ (Flexible Grid)
๊ณ ์ ๋ ํฝ์
๋จ์ ๋์ ๋ฐฑ๋ถ์จ, em, rem ๋ฑ ์๋์ ๋จ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
.row {
display: flex;
flex-wrap: wrap;
}
.col {
flex: 1;
min-width: 0;
}
/* ๋๋ CSS Grid ์ฌ์ฉ */
.grid-container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 20px;
}
CSS
๋ณต์ฌ
์ ์ฐํ ์ด๋ฏธ์ง
์ด๋ฏธ์ง๊ฐ ์ปจํ
์ด๋๋ฅผ ๋ฒ์ด๋์ง ์๋๋ก ํฉ๋๋ค.
img {
max-width: 100%;
height: auto;
display: block;
}
CSS
๋ณต์ฌ
๋ฐ์ํ ๋์์ธ ์ ๋ต
๋ชจ๋ฐ์ผ ์ฐ์ (Mobile First)
์์ ํ๋ฉด์ ๊ธฐ๋ณธ์ผ๋ก ํ๊ณ ํฐ ํ๋ฉด์ผ๋ก ํ์ฅํ๋ ๋ฐฉ์์
๋๋ค.
/* ๊ธฐ๋ณธ ์คํ์ผ (๋ชจ๋ฐ์ผ) */
.header {
font-size: 16px;
}
/* ํฐ ํ๋ฉด์ผ๋ก ํ์ฅ */
@media (min-width: 768px) {
.header {
font-size: 20px;
}
}
CSS
๋ณต์ฌ
๋ฐ์คํฌํฑ ์ฐ์ (Desktop First)
ํฐ ํ๋ฉด์ ๊ธฐ๋ณธ์ผ๋ก ํ๊ณ ์์ ํ๋ฉด์ผ๋ก ์ถ์ํ๋ ๋ฐฉ์์
๋๋ค.
/* ๊ธฐ๋ณธ ์คํ์ผ (๋ฐ์คํฌํฑ) */
.header {
font-size: 20px;
}
/* ์์ ํ๋ฉด์ผ๋ก ์ถ์ */
@media (max-width: 767px) {
.header {
font-size: 16px;
}
}
CSS
๋ณต์ฌ
๋ฏธ๋์ด ์ฟผ๋ฆฌ ์กฐ๊ฑด
ํ๋ฉด ํฌ๊ธฐ
@media (min-width: 768px) { }
@media (max-width: 1023px) { }
@media (min-width: 768px) and (max-width: 1023px) { }
CSS
๋ณต์ฌ
ํ๋ฉด ๋ฐฉํฅ
@media (orientation: portrait) {
/* ์ธ๋ก ๋ชจ๋ */
}
@media (orientation: landscape) {
/* ๊ฐ๋ก ๋ชจ๋ */
}
CSS
๋ณต์ฌ
ํด์๋
@media (-webkit-min-device-pixel-ratio: 2),
(min-resolution: 192dpi) {
/* ๋ ํฐ๋ ๋์คํ๋ ์ด์ฉ ๊ณ ํด์๋ ์ด๋ฏธ์ง */
.logo {
background-image: url('logo@2x.png');
}
}
CSS
๋ณต์ฌ
๋ฏธ๋์ด ํ์
@media screen { }
@media print { }
@media speech { }
CSS
๋ณต์ฌ
์ค์ ์์
๋ฐ์ํ ๋ค๋น๊ฒ์ด์
/* ๋ชจ๋ฐ์ผ: ํ๋ฒ๊ฑฐ ๋ฉ๋ด */
.nav-menu {
display: none;
}
.nav-toggle {
display: block;
}
.nav-menu.active {
display: flex;
flex-direction: column;
}
/* ๋ฐ์คํฌํฑ: ๊ฐ๋ก ๋ฉ๋ด */
@media (min-width: 768px) {
.nav-menu {
display: flex;
flex-direction: row;
}
.nav-toggle {
display: none;
}
}
CSS
๋ณต์ฌ
๋ฐ์ํ ํ์ดํฌ๊ทธ๋ํผ
/* ๊ธฐ๋ณธ ํฐํธ ํฌ๊ธฐ */
html {
font-size: 16px;
}
h1 {
font-size: 2rem; /* 32px */
}
/* ํ๋ธ๋ฆฟ */
@media (min-width: 768px) {
html {
font-size: 18px;
}
}
/* ๋ฐ์คํฌํฑ */
@media (min-width: 1024px) {
html {
font-size: 20px;
}
}
/* ๋๋ clamp() ํจ์ ์ฌ์ฉ */
h1 {
font-size: clamp(1.5rem, 5vw, 3rem);
}
CSS
๋ณต์ฌ
CSS Grid์ Flexbox๋ฅผ ํ์ฉํ ๋ฐ์ํ ๋ ์ด์์
Flexbox ์์
.container {
display: flex;
flex-wrap: wrap;
gap: 20px;
}
.item {
flex: 1 1 300px; /* ์ต์ 300px, ๊ณต๊ฐ์ด ์์ผ๋ฉด ํ์ฅ */
}
CSS
๋ณต์ฌ
Grid ์์
.grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
gap: 20px;
}
/* ๋ช
์์ ๋ธ๋ ์ดํฌํฌ์ธํธ */
@media (min-width: 768px) {
.grid {
grid-template-columns: repeat(2, 1fr);
}
}
@media (min-width: 1024px) {
.grid {
grid-template-columns: repeat(3, 1fr);
}
}
CSS
๋ณต์ฌ
์ปจํ ์ด๋ ์ฟผ๋ฆฌ (@container)
์ต์ CSS ๊ธฐ๋ฅ์ผ๋ก, ๋ถ๋ชจ ์ปจํ
์ด๋์ ํฌ๊ธฐ์ ๋ฐ๋ผ ์คํ์ผ์ ์ ์ฉํฉ๋๋ค.
.container {
container-type: inline-size;
container-name: card;
}
@container card (min-width: 400px) {
.card-content {
display: grid;
grid-template-columns: 1fr 2fr;
}
}
CSS
๋ณต์ฌ
๋ฐ์ํ ๋์์ธ Best Practices
ํญ๋ชฉ | ๋ด์ฉ |
๋ชจ๋ฐ์ผ ์ฐ์ ์ ๊ทผ | ์์ ํ๋ฉด๋ถํฐ ์์ํ์ฌ ์ ์ง์ ์ผ๋ก ํ์ฅ |
ํฐ์น ์นํ์ UI | ๋ฒํผ๊ณผ ๋งํฌ๋ ์ต์ 44x44px ํฌ๊ธฐ ์ ์ง |
์ ์ ํ ๋ธ๋ ์ดํฌํฌ์ธํธ | ์ฝํ
์ธ ๊ธฐ๋ฐ์ผ๋ก ๋ธ๋ ์ดํฌํฌ์ธํธ ์ค์ |
์ฑ๋ฅ ์ต์ ํ | ํ์ํ ๊ฒฝ์ฐ์๋ง ๋ฆฌ์์ค ๋ก๋ |
ํ
์คํธ | ๋ค์ํ ๋๋ฐ์ด์ค์ ๋ธ๋ผ์ฐ์ ์์ ํ
์คํธ |
์ ๊ทผ์ฑ | ํค๋ณด๋ ๋ค๋น๊ฒ์ด์
๊ณผ ์คํฌ๋ฆฐ ๋ฆฌ๋ ์ง์ |
์ ์ฉํ ๋จ์
๋จ์ | ์ค๋ช
|
vw, vh | ๋ทฐํฌํธ ๋๋น/๋์ด์ 1% |
% | ๋ถ๋ชจ ์์ ๊ธฐ์ค ์๋ ํฌ๊ธฐ |
em | ๋ถ๋ชจ ์์์ ํฐํธ ํฌ๊ธฐ ๊ธฐ์ค |
rem | ๋ฃจํธ(html) ์์์ ํฐํธ ํฌ๊ธฐ ๊ธฐ์ค |
fr | Grid์์ ์ฌ์ฉํ๋ ๋น์จ ๋จ์ |



