CSS
Cascading Style Sheets
웹 페이지 스타일링 언어. HTML 요소의 레이아웃, 색상, 폰트 정의. Flexbox, Grid가 핵심.
Cascading Style Sheets
웹 페이지 스타일링 언어. HTML 요소의 레이아웃, 색상, 폰트 정의. Flexbox, Grid가 핵심.
CSS(Cascading Style Sheets)는 1996년 W3C에서 표준화한 웹 페이지 스타일링 언어입니다. HTML이 콘텐츠의 구조를 정의한다면, CSS는 그 구조에 시각적 표현(색상, 레이아웃, 폰트, 애니메이션 등)을 입히는 역할을 합니다. 'Cascading'은 여러 스타일 규칙이 충돌할 때 우선순위에 따라 적용되는 방식을 의미합니다.
현대 CSS의 핵심은 Flexbox와 Grid 레이아웃 시스템입니다. Flexbox는 1차원 레이아웃(행 또는 열)에, Grid는 2차원 레이아웃(행과 열 동시에)에 최적화되어 있습니다. 2024년 기준 글로벌 브라우저의 98% 이상이 두 시스템을 완벽 지원합니다.
CSS는 3단계 선택자 우선순위(Specificity)를 따릅니다: 인라인 스타일(1000점) > ID 선택자(100점) > 클래스 선택자(10점) > 요소 선택자(1점). !important는 이 규칙을 무시하고 최우선 적용되지만, 유지보수를 어렵게 만들어 사용을 지양합니다.
최근 CSS는 CSS Variables(Custom Properties), Container Queries, :has() 선택자 등 강력한 기능들이 추가되고 있습니다. 특히 CSS-in-JS 논쟁과 함께 Tailwind CSS, CSS Modules, styled-components 등 다양한 스타일링 방법론이 공존하며 발전하고 있습니다.
/* CSS Variables와 Flexbox/Grid 레이아웃 */
:root {
--primary-color: #a855f7;
--spacing-md: 1rem;
--radius: 12px;
}
/* Flexbox: 네비게이션 바 */
.navbar {
display: flex;
justify-content: space-between;
align-items: center;
padding: var(--spacing-md);
gap: 1rem;
}
/* Grid: 카드 레이아웃 */
.card-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
gap: var(--spacing-md);
}
/* 반응형 디자인 */
@media (max-width: 768px) {
.navbar {
flex-direction: column;
}
.card-grid {
grid-template-columns: 1fr;
}
}
/* 모던 CSS: Container Query */
@container (min-width: 400px) {
.card {
padding: 2rem;
}
}
/* 애니메이션 */
.button {
transition: transform 0.2s ease, box-shadow 0.2s ease;
}
.button:hover {
transform: translateY(-2px);
box-shadow: 0 10px 20px rgba(168, 85, 247, 0.3);
}
"디자인팀이 전달한 Figma를 보니 컴포넌트별 여백이 8px 단위로 일관성 있게 되어 있네요. CSS Variables로 --spacing-unit: 8px 정의하고 배수로 사용하면 개발-디자인 간 커뮤니케이션이 수월해질 것 같습니다."
"면접관: Flexbox와 Grid의 차이점은 무엇인가요?
지원자: Flexbox는 한 방향(행 또는 열)으로 아이템을 배치하는 1차원 레이아웃이고, Grid는 행과 열을 동시에 제어하는 2차원 레이아웃입니다. 네비게이션 바 같은 선형 배치는 Flexbox, 대시보드나 갤러리 같은 격자형 배치는 Grid가 적합합니다."
"이 컴포넌트에서 !important가 3번이나 사용됐는데, specificity 충돌이 있는 것 같아요. 원인을 찾아보니 부모 컴포넌트에서 인라인 스타일을 쓰고 있네요. 인라인 스타일을 클래스로 바꾸면 !important 없이도 해결될 것 같습니다."