CSS
@ https://www.joshwcomeau.com/css
@ Fundamentals
브라우저가 CSS를 해석하는 방식
- 브라우저는 HTML 파일을 파싱하여 DOM 트리 생성
- CSS 파일도 동시에 파싱하여 CSSOM(CSS Object Model) 트리 생성
- DOM과 CSSOM을 결합하여 Render 트리 생성
- 레이아웃 계산 후 렌더링
CSS 문법과 용어
선택자(Selector)÷
타입(Type) 선택자: h1 { }
클래스(Class) 선택자: .my-class { }
ID 선택자: #myid { }
속성(Attribute) 선택자: [disabled] { }
가상(Pseudo) 선택자: :hover, :first-child 등
속성(Property): color, font-size 등
값(Value): 키워드, 크기 단위, 색상 등
CSS의 기본
색상 표기법
키워드: red, blue
16진수: #ff0000
RGB/RGBA: rgb(255,0,0) / rgba(255,0,0,0.5)
HSL/HSLA: hsl(0,100%,50%) / hsla(0,100%,50%,0.5)
단위
절대 단위(px)
- 고정된 크기를 지정할 때 사용
- 디자인 시스템에서 기준 크기 정의에 활용
- 다양한 화면 크기에서 일관된 레이아웃 제공 필요할 때
상대 단위
em: 부모 요소의 폰트 크기를 기준으로 상대적 크기 지정
- 타이포그래피 관련 속성(font-size, line-height, padding 등)에 주로 사용
rem: 루트 요소(html)의 폰트 크기를 기준으로 상대적 크기 지정
- 전체 레이아웃 요소에 주로 사용
%: 부모 요소의 크기를 기준으로 백분율로 지정
- 박스 크기, 여백 등 다양한 용도로 사용
vw, vh: 뷰포트 크기를 기준으로 지정
- 반응형 디자인, 전체 화면 크기에 맞추는 용도
calc() 함수
다른 단위들을 연산하여 새로운 값을 만들 때 사용
예) width: calc(100% - 80px);
고정값과 상대값의 혼합 사용 가능
주 사용 기법은 rem과 % 조합
- 루트 요소(html)에 font-size 기준값(보통 16px) 설정
- rem으로 레이아웃 크기 지정, %로 유동적인 크기 설정
- 예) .container { width: 80%; font-size: 1rem; }
타이포그래피
font-family: 글꼴 지정
font-size: 크기 지정
font-weight: 굵기 지정
line-height: 줄간격 지정
웹폰트 @font-face
@ Rendering Logic +
상속과 캐스케이드
상속(Inheritance)
상속 가능한 속성들(color, font 등)
상속 안되는 속성들(margin, padding 등)
inherit, initial 키워드로 상속 제어
상속 가능한 속성의 예시
body { color: #333; /* 모든 텍스트는 #333 색상 */ font-family: Arial; /* 모든 텍스트는 Arial 폰트 */ }상속 안되는 속성의 예시
div { margin: 10px; /* 자식 요소에 상속되지 않음 */ padding: 5px; /* 자식 요소에 상속되지 않음 */ }inherit, initial 키워드 활용
a { color: inherit; /* 부모 요소의 color 값을 상속받음 */ } button { padding: initial; /* 기본 패딩 값 적용 */ }
캐스케이드(Cascade)
동일한 요소에 적용 시 우선순위 결정
중요도 (!important) > 인라인 > ID > 클래스 > 요소
소스 코드 순서 (마지막에 적용)
우선순위에 따른 적용
p { color: red; } /* 요소 선택자 */ .text { color: blue; } /* 클래스 선택자 */ #intro { color: green; } /* ID 선택자 */ p#intro { color: orange !important; } /* !important 우선순위 최상위 */동일한 p#intro 요소에 여러 스타일이 적용되었을 때, !important > 인라인 > ID > 클래스 > 요소 순으로 우선순위가 적용됩니다.
소스 코드 순서
p { color: red; } p { color: blue; } /* 마지막에 작성된 스타일이 적용됨 */같은 우선순위일 때, 마지막에 작성된 스타일이 적용됩니다.
박스 모델
박스 구성 요소
- Content > Padding > Border > Margin
박스 사이즈 계산
box-sizing: content-box (기본)
box-sizing: border-box (패딩,보더 포함)
마진 상쇄(Margin Collapsing)
- 인접 수직 마진이 하나로 합쳐짐
Flow 레이아웃
Normal Flow
- 인라인, 블록 레벨 요소 배치
Float
요소를 좌우로 이동
텍스트 웹 또는 이미지 주변 레이아웃
Display
inline, block, inline-block 등
none으로 요소 숨김
Clear
- Float 해제
@ Rendering Logic ++
절대/상대 위치 지정
- position: static (기본값)
- position: relative
- 자기 자신을 기준으로 오프셋
- position: absolute
- 위치 상속 조상 요소를 기준으로 오프셋
- position: fixed
- 뷰포트를 기준으로 고정 위치
- position: sticky
- 스크롤 위치에 따라 relative/fixed 전환
z-index 관리
쌓임 맥락(Stacking Context)
- 문서 루트, 위치지정 요소 등이 생성
z-index 값이 높을수록 위로 쌓임
겹침 현상 피하기
마이너스 z-index 활용
격리된 쌓임 맥락 활용
오버플로우 처리
overflow: visible (기본값)
overflow: hidden
- 넘치는 부분 잘라냄
overflow: scroll
- 스크롤바 강제 표시
overflow: auto
- 내용에 따라 스크롤바 자동 표시
overflow-x, overflow-y 축 별 제어
@ Modern Component Architecture
CSS 특정성 문제 해결
- 선택자 특정성(Specificity) 계산
- 인라인 > ID > 클래스 > 요소
- !important를 지양하고 계층적 특정성 활용
- CSS 린팅
- 특정성 제한 규칙 설정
- 코드 스타일 자동화
- CSS 전처리기(Preprocessor)
- Sass, Less, Stylus 등
- 네스팅, 믹스인, 함수 등 추가 기능
컴포넌트 라이브러리 구축
- 모듈화와 재사용성
- 단일 책임 원칙 적용
- 컴포넌트 별 스타일 분리
- 디자인 시스템
- 색상, 타이포그래피, 그리드 등 통일
- 관련 토큰(Token) 정의
- 스타일 가이드
- 코드 규칙 문서화
- 컴포넌트 사례 제시
CSS-in-JS
- 개념
- JS 객체/함수로 CSS 정의
- 동적 스타일링과 조건부 스타일 지원
- styled-components
- 리액트 컴포넌트 기반 CSS 작성
- props에 따른 동적 스타일링
- 장단점
- 캡슐화, 동적성, 코드 복잡성 등
@ Flexbox
flex 레이아웃 모델 이해
- Flex 컨테이너
- display: flex;
- flex-direction
- row - default
- row-reverse
- column
- column-reverse
- flex-wrap
- Flex 항목
- order
- flex-grow
- flex-shrink
- flex-basis
- align-self
- stretch
- align-items
- flex-end
- flex-start
다양한 flexbox 레이아웃
- 네비게이션 바
- 반응형 그리드 레이아웃
- 이미지 갤러리
- 입력 폼 레이아웃
- 같은 높이 레이아웃
- 중앙 정렬 기법
반응형 디자인
- 뷰포트 기반 단위 (vw, vh)
- flex-wrap과 order 활용
- flex: 숏핸드 속성
- flex-basis, flex-grow 조합
@ Responsive And Functional CSS
모바일/태블릿 최적화
- 뷰포트 메타태그
- 대응 모드(Response Mode)
- 미디어 쿼리 활용
동적 CSS 단위
- vw, vh 활용
- 뷰포트 기반 상대 단위
- calc() 함수
- 사칙연산 가능한 단위 합성
- min(), max(), clamp()
- 최소/최대값, 범위 내 값 지정
CSS 변수
- :root에 변수 정의
- --main-color: #333;
- var() 함수로 변수 참조
- color: var(--main-color);
- 컴포넌트 prop에 따른 동적 변경
- 브라우저 기본값 제공
- var(--foo, #ccc)
@ Typography And Images
반응형 이미지 최적화
- 벡터 이미지(SVG) 활용
- 적절한 포맷(WebP 등) 선택
- srcset, sizes 속성
- 다양한 해상도에 맞는 이미지 서빙
<picture>요소 - 미디어 조건에 따른 이미지 선택
웹폰트 실무
- @font-face로 웹폰트 지정
- FOUT(Flash Of Unstyled Text) 방지
- FOIT(Flash Of Invisible Text) 방지
- 서브셋팅, 유니코드 범위 제한
- 가변 폰트(Variable Fonts)
- 다양한 스타일을 하나의 파일로 제공
@ CSS grid
그리드 vs 플렉스박스
- 그리드: 2차원 레이아웃
- 플렉스박스: 1차원 레이아웃
- 목적에 맞게 적절한 선택
그리드 레이아웃 알고리즘
- 그리드 컨테이너
- display: grid;
- grid-template-rows/columns
- grid-gap
- 그리드 셀
- grid-row, grid-column 영역 지정
- 그리드 영역
- grid-template-areas
- grid-area
- 배치 제어
- justify, align 속성
레거시 브라우저 대응
- @supports 기능 검사
- Fallback 메커니즘
- Float 기반 레이아웃
- Modernizr, Polyfill 활용
- CSS Grid 미적용 시 graceful degradation
@ Animation And Interaction
전환과 애니메이션
- 전환(Transition)
- 단일 상태에서 상태 변화
- transition 속성
- 애니메이션 (@keyframes)
- 여러 상태 애니메이션
- @keyframes으로 정의
- 타이밍 함수
- ease, linear, steps 등
- cubic-bezier 직접 정의
애니메이션 디자인
- 스토리보드
- 프레임별 설계
- 애니메이션 원칙
- 시작/중간/끝 포인트
- 느리게 시작/가속/천천히 종료
- 디자이너-개발자 협업
성능 최적화
- 위치 변화가 아닌 속성만 애니메이션
- will-change로 힌트 제공
- GPU 가속화(transform, opacity)
- requestAnimationFrame 활용
@ Little Big Details
그래디언트와 효과
- 선형 그래디언트
- 원형 그래디언트
- 박스 섀도우
- inset, 확산, 퍼짐 등
- 클리핑, 마스크
- 필터 효과
- 블러, 그레이스케일, 대비 등
스크롤과 포커스 개선
부드러운 스크롤
- scroll-behavior
스크롤바 커스터마이징
- scrollbar-* 속성
:focus 아웃라인 스타일
:focus-visible로 포커스 제어
디테일이 만드는 차이
- 마이크로 인터렉션
- 드롭 섀도우, 오버레이 등 미세한 효과
- 호버, 클릭 등 작은 상호작용에 주목
- 입체감 표현
- 원근감, 그래디언트 등으로 3차원 느낌 부여
- 브라우저 기본 스타일 재정의
- 기본 콘트롤(체크박스, 버튼 등) 커스텀
- 유저 피드백
- 로딩 스피너, 성공/실패 메시지 등
- 일관된 브랜딩
- 색상, 타이포그래피, 아이콘 등 통일성
- 마이크로 인터렉션
CSS +
@ CSS 방법론
OOCSS(Object Oriented CSS)
- 객체 지향 원칙을 CSS에 적용한 방법론
- 재사용 가능한 패턴을 "객체"로 정의하고 구조화
- 컨테이너와 컨텐츠 개념으로 구분하여 스타일링
- 구조와 스킨 분리를 통한 유지보수성 향상
BEM(Block Element Modifier)
- 블록(Block), 엘리먼트(Element), 모디파이어(Modifier) 개념을 기반으로 한 네이밍 컨벤션
- 블록: 독립적인 컴포넌트 영역 (예: header, menu)
- 엘리먼트: 블록의 구성 요소 (예: header_logo, menu_item)
- 모디파이어: 블록/엘리먼트의 상태 또는 스타일 변형 (예: menu_item-active)
- 명시적이고 모듈화된 CSS 구조 제공
SMACSS(Scalable and Modular Architecture for CSS)
- CSS 코드의 확장성과 모듈화를 주된 목표로 한 방법론
- 5가지 카테고리로 CSS를 구분
- Base: 기본 HTML 요소 스타일 (리셋/정규화)
- Layout: 레이아웃과 관련된 스타일
- Module: 재사용 가능한 모듈 컴포넌트 스타일
- State: 상태 관련 스타일 (is-active 등)
- Theme: 테마별 스타일 (다크 모드 등)
- 각 카테고리를 분리하여 구조화하고 명명 규칙 제공
- 모듈화, 재사용성, 확장성 향상을 위한 CSS 구조화 방법론
- 코드 중복 제거 및 유지보수성 향상
- 명확한 역할과 경계를 가진 모듈 단위 스타일링
- 프로젝트 규모가 커질수록 중요성 증대
@ CSS 아키텍처
컴포넌트 기반 개발
- 컴포넌트 단위로 CSS를 모듈화하는 방식
- 각 컴포넌트는 독립적인 UI 요소를 나타냄 (예: 버튼, 모달, 내비게이션 등)
- 컴포넌트 별로 스타일 파일을 분리하여 관리
- 컴포넌트의 HTML 마크업, CSS, 자바스크립트를 함께 묶음
- 재사용성과 유지보수성 향상
- 단일 책임 원칙 (Single Responsibility Principle) 적용
- 하나의 컴포넌트는 하나의 역할만 가짐
- 기능 변경 시 해당 컴포넌트만 수정하면 됨
관심사 분리 원칙 (Separation of Concerns)
- CSS를 구조(structure), skin(레이아웃), 상태(state)로 분리
- 구조: 컴포넌트의 HTML 마크업
- 레이아웃: 위치, 크기, 간격 등 배치 관련 스타일
- 상태: 컴포넌트의 상호작용과 관련된 스타일 (active, focus 등)
- 각 관심사별로 CSS를 모듈화하여 관리
모듈화 및 스타일 가이드
- CSS 코드의 모듈화를 통해 재사용성과 확장성 향상
- 스타일 가이드(Style Guide) 작성
- 코딩 컨벤션과 모범 사례를 문서화
- 네이밍 규칙, 파일 구조, 주석 등 규정
- 컴포넌트 스타일링 예제 제시
- 프로젝트 전반의 일관성 유지
- 신규 개발자 온보딩 시간 단축
@ 브라우저 호환성
벤더 프리픽스 사용 전략
- 벤더 프리픽스(Vendor Prefix)란?
- 브라우저 벤더사(Chrome, Firefox, Safari 등)가 자사의 실험적 기능에 추가하는 접두사
- 예시: -webkit-, -moz-, -ms-, -o-
- 새로운 CSS 기능이 표준화되기 전 단계에서 활용
- 구형 브라우저 대응을 위해 프리픽스 버전과 표준 버전 모두 작성
.box { -webkit-transform: rotate(30deg); /* Webkit 브라우저용 */ -moz-transform: rotate(30deg); /* Mozilla 브라우저용 */ -ms-transform: rotate(30deg); /* 구 Internet Explorer용 */ -o-transform: rotate(30deg); /* 구 Opera 브라우저용 */ transform: rotate(30deg); /* 표준 버전 */ }
점진적 향상 기법 (Progressive Enhancement)
- 기본적으로 모든 브라우저에서 컨텐츠가 접근 가능하도록 개발
- 최신 브라우저에서는 향상된 레이아웃과 기능을 제공
- 레거시 브라우저에서도 기본 콘텐츠와 기능은 제공
- 예시: 모던 CSS 속성은 구형 브라우저에서 무시됨
- 기본 마크업 > 브라우저 기본 스타일 > CSS 스타일 > JavaScript 기능 순으로 향상
- 점진적 향상 원칙에 따라 개발하면 크로스브라우징 문제 완화
Polyfill, Postcss 등 도구 활용
- Polyfill: 구형 브라우저에서 지원하지 않는 최신 기능을 에뮬레이트 하는 코드
- 예시: CSS3 서브셋을 구현하는 polyfill.io
- Postcss: 플러그인을 활용해 CSS 변환, 후처리 작업 수행
- Autoprefixer: 벤더 프리픽스 자동 추가
- Cssdb: 패턴 기반으로 레거시 브라우저에 맞게 CSS 변환
- 개발 단계에서 이러한 도구들을 활용하면 크로스브라우징 이슈 해결에 도움
@ CSS 성능 최적화
규칙 최소화 및 중복 제거
- CSS 규칙(rule)이 많을수록 브라우저가 파싱하고 적용해야 하는 양이 증가
- 불필요한 규칙은 제거하고 중복된 규칙은 통합
- CSS 전처리기의 @extend, @mixin 등의 기능으로 중복 제거 가능
- 작고 모듈화된 CSS 파일을 통해 HTTP 요청 수 최소화
효율적인 셀렉터 작성법
- 과도한 특정성(Specificity)은 스타일 오버라이드 어렵게 만듦
- ID 선택자 지양, 클래스 선택자 위주로 사용
- 불필요한 자식, descendant 선택자 남용 자제
/* 비효율적인 선택자 */ body div.container ul#nav li a { ... } /* 효율적인 선택자 */ .nav a { ... } - 키 선택자(key selector) 패턴을 활용하여 재사용성 높임
.nav { ... } .nav a { ... } .nav a:hover { ... }
불필요한 페인트/레이아웃 강제 방지
- 브라우저 렌더링 프로세스 최적화
- 스타일 연산 (Recalculate Style)
- 레이아웃 (Layout)
- 페인트 (Paint)
- CSS 변화로 인한 레이아웃 재계산, 리페인트 비용이 큼
- will-change로 렌더링 관련 힌트 제공
.animated-element { will-change: transform; /* 변환 관련 최적화 힌트 */ } - GPU 가속화 (transform, opacity 등)로 렌더링 부담 완화
- 컴포지팅 기법으로 레이어를 분리하여 빠른 렌더링
이처럼 CSS 규칙과 선택자를 최적화하고, 렌더링 프로세스를 고려한 기법을 활용하면 성능이 향상됩니다. 프로젝트 규모가 커질수록 CSS 성능 최적화가 중요해집니다.
@ 최신 CSS 기능
CSS Grid 레이아웃
CSS 변수(Custom Properties)
CSS Houdini
- 새로운 CSS 기능 확장 방법
Container Queries
- 컨테이너 기반 반응형 queries