웹에서 색상 표현하기
1. 색상 이름 (Color Names)
가장 직관적인 방법으로, 브라우저가 미리 정의해 둔 색상 이름을 사용한다. (red, blue, black, lightgray 등) 사용하기 쉽지만, 표현할 수 있는 색상의 수가 제한적이다.
h1 { color: steelblue; }2. 16진수 (Hexadecimal)
# 기호와 함께 빛의 삼원색(Red, Green, Blue)을 16진수로 표현한다. #RRGGBB 형태로 각 색상이 00(0)부터 FF(255)까지의 값을 가진다. 가장 널리 사용되는 방식이다.
/* #RRGGBB */
.header { background-color: #FFFFFF; } /* 흰색 */
.footer { background-color: #333333; } /* 어두운 회색 */
/* RR, GG, BB 값이 모두 같을 경우 #RGB 형태로 축약 가능 */
p { color: #F00; } /* #FF0000 (빨간색)과 동일 */3. rgb와 rgba
rgb() 함수를 사용하여 Red, Green, Blue 값을 0~255 사이의 숫자로 표현한다. rgba()는 여기에 alpha(투명도, 0.0~1.0) 채널이 추가된 형태로, 0.0은 완전 투명, 1.0은 완전 불투명을 의미한다.
/* rgb(red, green, blue) */
h2 { color: rgb(68, 68, 68); }
/* rgba(red, green, blue, alpha) */
.overlay { background-color: rgba(0, 0, 0, 0.5); } /* 50% 투명한 검은색 */
/* 모던 문법 (CSS Color Module Level 4): 쉼표 없이 공백, 알파는 슬래시 뒤에 */
.modern { background-color: rgb(0 0 0 / 50%); }4. hsl과 hsla
hsl() 함수는 색상(Hue), 채도(Saturation), 명도(Lightness)를 이용해 색을 표현하여 좀 더 직관적인 색상 조절이 가능하다.
Hue: 색상환의 각도 (0~360)
Saturation: 채도 (0%~100%)
Lightness: 밝기 (0%~100%)
/* hsl(hue, saturation, lightness) */
.button { background-color: hsl(240, 100%, 50%); } /* 파란색 */
/* hsla(hue, saturation, lightness, alpha) */
.button:hover { background-color: hsla(240, 100%, 50%, 0.8); }같은 색을 네 가지 방식으로 — 결과는 모두 동일
steelblue
(이름)
#4682B4
(16진수)
rgb(70,130,180)
hsl(207,44%,49%)
투명도(alpha) 비교 — 뒤 배경이 비쳐 보이는 정도:
배경 색과 배경 이미지
background-color: 배경 색상을 지정한다.background-image: 배경으로 사용할 이미지의 경로를 지정한다.url()함수를 사용한다.background-repeat: 배경 이미지의 반복 여부를 지정한다. (repeat,no-repeat,repeat-x,repeat-y)background-position: 배경 이미지의 시작 위치를 지정한다.background-size: 배경 이미지의 크기를 조절한다.auto: 원본 크기cover: 요소를 완전히 덮도록 이미지를 확대/축소 (이미지 잘릴 수 있음). 히어로 이미지나 카드 상단 배경에 적합.contain: 이미지가 잘리지 않도록 요소 안에 포함되게 확대/축소 (여백 생길 수 있음). 로고처럼 원본이 모두 보여야 하는 경우에 적합.100px 200px: 너비와 높이를 직접 지정
background-attachment: 페이지 스크롤 시 배경 이미지의 움직임 여부를 지정한다. (scroll: 같이 스크롤,fixed: 고정)background-clip,background-origin: 배경을 적용할 범위를 테두리, 안쪽 여백, 콘텐츠 중 어디까지로 할지 정하는 고급 속성이다.
예시 코드 (Shorthand background 속성 활용)
.hero-section {
background-color: #f0f0f0;
background-image: url('images/hero.jpg');
background-repeat: no-repeat;
background-position: center center;
background-size: cover;
background-attachment: fixed;
/* 위의 5가지 속성을 'background' 단축 속성으로 표현 */
/* background: #f0f0f0 url('images/hero.jpg') no-repeat center center/cover fixed; */
}그라데이션 효과로 배경 꾸미기
두 가지 이상의 색상이 점진적으로 변하는 효과를 배경 이미지로 적용할 수 있다.
선형 그라데이션 (Linear Gradient)
직선 방향으로 색상이 변한다. linear-gradient() 함수를 사용하며, 방향과 색상을 지정한다.
.box {
/* 기본: 위에서 아래로 */
background-image: linear-gradient(blue, pink);
/* 방향 지정: to right, to left, to top right 등 */
background-image: linear-gradient(to right, #ff7e5f, #feb47b);
/* 각도 지정 */
background-image: linear-gradient(45deg, #6a11cb, #2575fc);
}원형 그라데이션 (Radial Gradient)
중심점에서 원형 또는 타원형으로 색상이 변한다. radial-gradient() 함수를 사용한다.
.circle-box {
background-image: radial-gradient(yellow, orange, red);
background-image: radial-gradient(circle, white, skyblue);
}위→아래
to right
45deg
radial
CSS와 박스 모델
모든 HTML 요소는 사각형의 박스(box) 형태로 렌더링되며, 이 박스의 구성 요소를 박스 모델이라고 한다.
Content: 텍스트나 이미지가 표시되는 실제 내용 영역
Padding: 콘텐츠와 테두리(Border) 사이의 안쪽 여백
Border: 테두리
Margin: 테두리 바깥의 다른 요소와의 간격을 나타내는 바깥 여백
네 영역은 양파처럼 content(가장 안쪽) → padding → border → margin(가장 바깥쪽) 순으로 겹겹이 감싸는 구조다.
margin (바깥 여백)
padding (안쪽 여백) · 갈색 테두리가 border
content
(실제 내용)
width: 100%를 주었는데 영역을 넘친다면?
기본적으로 브라우저는 width = 콘텐츠 영역만으로 계산하고, padding과 border는 따로 더해진다. 이를 직관적으로 바꾸려면 box-sizing: border-box를 쓰면 padding/border가 width 안으로 포함된다. 포지셔닝 단원에서 자세히 다룬다.
Block 요소 vs Inline 요소
Block 요소 (div, p, h1 등):
항상 새로운 줄에서 시작하고, 사용 가능한 너비 전체를 차지한다.
width,height,margin,padding속성을 모두 사용할 수 있다.
Inline 요소 (span, a, img 등):
줄을 바꾸지 않고 다른 인라인 요소와 같은 줄에 배치된다.
콘텐츠의 너비만큼만 차지한다.
width,height속성이 적용되지 않으며,margin과padding은 좌우에만 적용된다.예외:
<img>,<video>,<iframe>등 일부 인라인 요소는 교체 요소(replaced element)로,width/height가 적용된다.
Inline-block 요소 (display: inline-block로 지정):
인라인 요소처럼 줄을 바꾸지 않고 옆으로 나란히 배치된다.
동시에 블록 요소처럼
width,height, 상하margin/padding까지 모두 적용된다.즉 inline(나란히)의 배치 + block(크기 지정)의 장점을 합친 형태로, 메뉴·버튼·태그·카드를 가로로 나열할 때 자주 쓴다.
세 가지를 한눈에 비교하면 다음과 같다.
구분 | 배치 |
| 상하 |
|---|---|---|---|
| 새 줄에서 시작(세로로 쌓임) | ✅ 적용 | ✅ 적용 |
| 같은 줄에 나란히 | ❌ 무시됨 | ❌ 무시됨 |
| 같은 줄에 나란히 | ✅ 적용 | ✅ 적용 |
display 속성
요소의 기본 표시 유형을 변경할 수 있다.
block: 요소를 블록 요소처럼 표시한다.inline: 요소를 인라인 요소처럼 표시한다.inline-block: 인라인 요소처럼 배치되지만, 블록 요소처럼width,height,margin을 모두 가질 수 있다.none: 요소를 화면에서 완전히 사라지게 한다.flex,grid: 레이아웃을 위한 값들. Flexbox 단원에서 자세히 다룬다.
block — 각자 새 줄에서 시작하고 가로 전체를 차지
block 요소 A
block 요소 B
inline — 줄을 바꾸지 않고 옆으로 나란히 (width/height 무시됨)
inline A inline B inline C
inline-block — 나란히 배치되면서 width/height도 적용됨 (각 120px)
box A box B box C
inline에 width를 줘도 안 변하는 이유
위 preview에서 inline 요소(A·B·C)에는 width:120px를 줬지만 무시되어 글자 너비만큼만 차지한다. 반면 inline-block 박스는 같은 width:120px가 그대로 적용되어 칸이 균일하다. "나란히 두면서 크기도 정하고 싶다" → inline-block이 정답이다.
직접 해보기: inline-block으로 가로 메뉴 만들기
아래 <li> 메뉴는 기본적으로 세로로 쌓인다(li는 block 요소). 이를 가로로 나란히 놓이면서 너비가 균일한 버튼이 되도록 CSS를 작성해 보자.
시작 코드 — 아래 HTML을 그대로 두고 <style>만 채운다.
<ul class="menu">
<li>홈</li>
<li>소개</li>
<li>메뉴</li>
<li>문의</li>
</ul>
<style>
/* 1) 목록 점(•) 제거, 들여쓰기(padding) 제거 */
/* 2) 각 li를 가로로 나란히 + 너비 100px로 균일하게 */
/* 3) 버튼처럼 보이도록 배경색·가운데 정렬·안쪽 여백 추가 */
</style>요구사항
.menu의 목록 점을 없애고(list-style: none) 기본 들여쓰기를 제거한다(padding: 0)..menu li를 가로로 나란히 배치하고(display: inline-block), 너비를100px로 균일하게 맞춘다.각 항목을 버튼처럼: 배경색,
text-align: center, 상하/좌우padding, 항목 사이 간격(margin)을 준다.
왜 inline이 아니라 inline-block인가
display: inline으로는 2번의 width: 100px가 무시되어 칸 너비가 글자 수에 따라 들쭉날쭉해진다. 너비를 균일하게 고정하려면 inline-block이 필요하다.
정답 예시 (펼쳐 보기)
.menu {
list-style: none; /* 목록 점 제거 */
padding: 0; /* 기본 들여쓰기 제거 */
}
.menu li {
display: inline-block; /* 가로로 나란히 + 크기 지정 가능 */
width: 100px; /* 너비 균일 (inline이면 무시됨!) */
padding: 10px 0;
margin-right: 4px;
background-color: #5e35b1;
color: white;
text-align: center;
border-radius: 6px;
}홈
소개
메뉴
문의
BORDER 테두리 관련 속성들
border-style: 테두리의 선 스타일을 지정한다. (solid,dashed,dotted,double등)border-width: 테두리의 두께를 지정한다.border-color: 테두리의 색상을 지정한다.Shorthand
border:border: [width] [style] [color];순서로 한 번에 지정한다.border-radius: 테두리를 둥글게 깎는 효과를 준다. 값이 클수록 더 둥글어진다.50%로 지정하면 원을 만들 수 있다.box-shadow: 박스에 그림자 효과를 준다.box-shadow: [x-offset] [y-offset] [blur] [spread] [color];앞에inset키워드를 붙이면 안쪽 그림자가 된다 (누름 효과 등에 활용).
.my-box {
border: 2px solid #333;
border-radius: 10px;
box-shadow: 5px 5px 15px rgba(0, 0, 0, 0.2);
}solid
dashed
dotted
double
radius:12px
radius:50%
box-shadow
여백을 조절하는 속성들
padding (안쪽 여백)
콘텐츠와 테두리 사이의 간격이다. 배경색과 이미지는 padding 영역까지 적용된다.
.box {
/* 4방향 모두 20px */
padding: 20px;
/* 상하 10px, 좌우 20px */
padding: 10px 20px;
/* 상 10px, 좌우 20px, 하 30px */
padding: 10px 20px 30px;
/* 상 10px, 우 20px, 하 30px, 좌 40px (시계방향) */
padding: 10px 20px 30px 40px;
}margin (바깥 여백)
요소의 테두리 바깥쪽 영역으로, 다른 요소와의 간격을 조절한다. padding과 마찬가지로 값을 1~4개 사용하여 4방향을 지정할 수 있다.
.box {
margin: 20px;
}마진 중첩 현상 (Margin Collapsing)
수직 방향으로 인접한 두 블록 요소의 margin이 만날 때, 둘 중 더 큰 값의 margin만 적용되는 현상이다. 좌우 margin에는 발생하지 않는다.
<div class="box1" style="margin-bottom: 20px;">Box 1</div>
<div class="box2" style="margin-top: 30px;">Box 2</div>20px + 30px = 50px가 아니라, 둘 중 큰 30px만 실제 간격이 된다.
Box 1 (margin-bottom: 20px)
실제 간격 = max(20, 30) = 30px
Box 2 (margin-top: 30px)
회피 방법
부모에
padding이나border를 1px라도 주면 중첩이 해제됨부모를
display: flex또는display: grid로 만들면 마진 중첩이 발생하지 않음gap속성(flex/grid 안에서)으로 간격을 주면 해결이 깔끔하고 안전함
유용한 색상 키워드
transparent: 완전 투명.background-color: transparent;처럼 쓴다.currentColor: 현재 요소의color값을 참조한다. 텍스트 색과 테두리 색을 함께 맞추고 싶을 때 유용.
.button {
color: steelblue;
border: 2px solid currentColor; /* steelblue로 자동 적용 */
}종합 실습: 나만의 프로필 카드 만들기
지금까지 배운 속성들을 총동원하여 세련된 프로필 카드를 만들어 본다.
요구사항
전체 페이지의 배경색을
hsl(210, 30%, 95%)로 지정한다.프로필 카드의 너비를
300px로 하고,margin을 이용해 페이지 중앙에 배치한다.카드에
10px의border-radius와rgba(0, 0, 0, 0.1)색상의 부드러운box-shadow를 적용한다.카드 상단 헤더 영역은
linear-gradient를 이용해#2193b0에서#6dd5ed로 변하는 배경을 적용한다.프로필 이미지는 원형으로 만들고(
border-radius: 50%),3px두께의 흰색 테두리(border)를 추가한다.카드 콘텐츠 영역에는
30px의padding을 적용한다.
완성 코드
index.html
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>프로필 카드</title>
<link rel="stylesheet" href="profile_style.css">
</head>
<body>
<div class="card">
<div class="card-header"></div>
<div class="card-body">
<img src="profile.jpg" alt="프로필 사진" class="profile-img">
<h2 class="name">김코딩</h2>
<p class="title">프론트엔드 개발자</p>
<p class="description">
사용자 경험을 중시하며, 깔끔하고 직관적인 웹을 만드는 것을 좋아합니다.
</p>
</div>
</div>
</body>
</html>profile_style.css
body {
font-family: sans-serif;
background-color: hsl(210, 30%, 95%);
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
margin: 0;
}
.card {
width: 300px;
background-color: white;
border-radius: 10px;
box-shadow: 0 10px 20px rgba(0, 0, 0, 0.1);
overflow: hidden;
text-align: center;
}
.card-header {
height: 120px;
background-image: linear-gradient(to right, #2193b0, #6dd5ed);
}
.card-body {
padding: 30px;
padding-top: 0;
}
.profile-img {
width: 120px;
height: 120px;
object-fit: cover;
border-radius: 50%;
border: 3px solid white;
margin-top: -60px;
box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
}
.name {
margin-top: 20px;
margin-bottom: 5px;
font-size: 24px;
}
.title {
color: #777;
margin: 0;
font-size: 16px;
}
.description {
margin-top: 20px;
font-size: 14px;
line-height: 1.5;
color: #555;
}김코딩
프론트엔드 개발자
사용자 경험을 중시하며, 깔끔하고 직관적인 웹을 만드는 것을 좋아합니다.