문서 흐름(Document Flow)이란?
HTML 요소는 기본적으로 문서 흐름에 따라 배치됩니다. 이는 다음과 같은 규칙을 따릅니다:
- 블록 요소(Block Elements): 한 줄을 모두 차지하며, 수직으로 쌓입니다(예: <div>, <p>, <h1>).
- 인라인 요소(Inline Elements): 한 줄에 나란히 배치되며, 줄 바꿈 없이 옆으로 이어집니다(예: <span>, <a>, <strong>).
- 기본 흐름: 요소는 HTML에 작성된 순서대로 위에서 아래로(블록 요소) 또는 왼쪽에서 오른쪽으로(인라인 요소) 배치됩니다.

<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>문서 흐름 이해하기</title>
<style>
body {
font-family: Arial, sans-serif;
padding: 20px;
}
.block {
background-color: #ffccbc;
border: 2px solid #333;
padding: 10px;
margin-bottom: 10px;
}
.inline {
background-color: #c8e6c9;
border: 2px solid #333;
padding: 5px;
}
</style>
</head>
<body>
<h2>문서 흐름 이해하기</h2>
<h3>1. 블록 요소 (수직으로 쌓임)</h3>
<div class="block">블록 요소 1</div>
<div class="block">블록 요소 2</div>
<div class="block">블록 요소 3</div>
<h3>2. 인라인 요소 (수평으로 나란히)</h3>
<span class="inline">인라인 요소 1</span>
<span class="inline">인라인 요소 2</span>
<span class="inline">인라인 요소 3</span>
</body>
</html>
position (위치 지정)
- 설명: position 속성은 요소의 위치를 어떻게 배치할지 설정합니다. HTML 요소는 기본적으로 문서 흐름에 따라 배치되지만, position을 사용하면 이를 변경할 수 있습니다.
- 값:
- static: 기본값, 문서 흐름에 따라 배치(기본 위치).
- relative: 문서 흐름에 따라 배치되지만, top, left, right, bottom으로 원래 위치에서 상대적으로 이동.
- absolute: 문서 흐름에서 벗어나며, 가장 가까운 position이 relative/absolute/fixed인 부모 요소를 기준으로 top, left, right, bottom으로 이동.
- fixed: 문서 흐름에서 벗어나며, 뷰포트(화면)를 기준으로 top, left, right, bottom으로 이동(스크롤해도 고정됨).
- 주의사항: relative, absolute, fixed를 사용할 때는 top, left, right, bottom 속성을 함께 설정해야 위치를 조정할 수 있습니다.
실습 예제 1
position - absolute, fixed 사용해보기

- 뼈대 코드
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>우주 탐험 배경</title>
</head>
<body>
<div class="star" style="top: 50px; left: 100px;">✨</div>
<div class="star" style="top: 150px; left: 300px;">✨</div>
<div class="star" style="top: 300px; left: 150px;">✨</div>
<div class="star" style="top: 1200px; left: 450px;">✨</div>
<div class="planet"></div>
<div class="spaceship">🚀</div>
</body>
</html>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>우주 탐험 배경</title>
<style>
body {
background-color: black;
margin: 0;
height: 100vh;
/* static(기본값, 문서에 흐름)*/
position: static;
}
.star {
/* position: static; */
/* position: static; (기본값 일 때 top,left,right, bottom 속성이 적용 안됨) */
position: absolute;
font-size: 20px;
}
.planet {
width: 80px;
height: 80px;
background-color: yellow;
border-radius: 50%;
position: absolute;
top: 100px;
left: 200px;
}
.spaceship {
/* fixed: 문서 흐름에서 벗어나며, 뷰포트(화면)를 기준으로 top, left,
right, bottom으로 이동(스크롤해도 고정됨) */
position: fixed; /* 화면 기준 고정 */
top: 50px;
right: 50px;
font-size: 40px;
z-index: 3; /* 가장 위 */
}
</style>
</head>
<body>
<div class="star" style="top: 50px; left: 100px;">✨</div>
<div class="star" style="top: 150px; left: 300px;">✨</div>
<div class="star" style="top: 300px; left: 150px;">✨</div>
<div class="star" style="top: 1200px; left: 450px;">✨</div>
<div class="planet"></div>
<div class="spaceship">🚀</div>
</body>
</html>
실습 예제 2
overflow 확인해 보기

- 뼈대 코드
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>스크롤 가능한 메시지 박스</title>
</head>
<body>
<h2>스크롤 가능한 메시지 박스</h2>
<h3>1. overflow: hidden (넘치는 부분 숨김)</h3>
<div class="message-box box-hidden">
안녕하세요! 이 메시지는 아주 길어서 박스를 넘치게 됩니다. 넘치는 부분은 숨겨집니다.
더 많은 텍스트가 있지만 보이지 않을 거예요. 계속해서 더 길게 작성해 볼게요.
정말 정말 긴 메시지입니다. 끝까지 읽어보세요!
안녕하세요! 이 메시지는 아주 길어서 박스를 넘치게 됩니다. 넘치는 부분은 숨겨집니다.
더 많은 텍스트가 있지만 보이지 않을 거예요. 계속해서 더 길게 작성해 볼게요.
정말 정말 긴 메시지입니다. 끝까지 읽어보세요!
</div>
<h3>2. overflow: scroll (항상 스크롤바 표시)</h3>
<div class="message-box box-scroll">
안녕하세요! 이 메시지는 아주 길어서 박스를 넘치게 됩니다. 스크롤바가 항상 표시됩니다.
더 많은 텍스트가 있지만 스크롤로 볼 수 있어요. 계속해서 더 길게 작성해 볼게요.
정말 정말 긴 메시지입니다. 끝까지 읽어보세요!
</div>
<h3>3. overflow: auto (넘칠 때만 스크롤바 표시)</h3>
<div class="message-box box-auto">
안녕하세요! 이 메시지는 아주 길어서 박스를 넘치게 됩니다. 넘칠 때만 스크롤바가 표시됩니다.
더 많은 텍스트가 있지만 스크롤로 볼 수 있어요. 계속해서 더 길게 작성해 볼게요.
정말 정말 긴 메시지입니다. 끝까지 읽어보세요!
</div>
</body>
</html>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>스크롤 가능한 메시지 박스</title>
<style>
body {
padding: 40px;
font-family: Arial, sans-serif;
}
.message-box {
width: 300px;
height: 150px;
border: 2px solid #333;
padding: 10px;
margin-bottom: 20px;
background-color: #f0f0f0;
}
.box-hidden {
overflow: hidden; /* 넘치는 부분 숨김 */
}
.box-scroll {
overflow: scroll; /* 항상 스크롤바 표시 */
}
.box-auto {
overflow: auto; /* 넘칠 때만 스크롤바 표시 */
}
</style>
</head>
<body>
<h2>스크롤 가능한 메시지 박스</h2>
<h3>1. overflow: hidden (넘치는 부분 숨김)</h3>
<div class="message-box box-hidden">
안녕하세요! 이 메시지는 아주 길어서 박스를 넘치게 됩니다. 넘치는 부분은 숨겨집니다.
더 많은 텍스트가 있지만 보이지 않을 거예요. 계속해서 더 길게 작성해 볼게요.
정말 정말 긴 메시지입니다. 끝까지 읽어보세요!
안녕하세요! 이 메시지는 아주 길어서 박스를 넘치게 됩니다. 넘치는 부분은 숨겨집니다.
더 많은 텍스트가 있지만 보이지 않을 거예요. 계속해서 더 길게 작성해 볼게요.
정말 정말 긴 메시지입니다. 끝까지 읽어보세요!
</div>
<h3>2. overflow: scroll (항상 스크롤바 표시)</h3>
<div class="message-box box-scroll">
안녕하세요! 이 메시지는 아주 길어서 박스를 넘치게 됩니다. 스크롤바가 항상 표시됩니다.
더 많은 텍스트가 있지만 스크롤로 볼 수 있어요. 계속해서 더 길게 작성해 볼게요.
정말 정말 긴 메시지입니다. 끝까지 읽어보세요!
</div>
<h3>3. overflow: auto (넘칠 때만 스크롤바 표시)</h3>
<div class="message-box box-auto">
안녕하세요! 이 메시지는 아주 길어서 박스를 넘치게 됩니다. 넘칠 때만 스크롤바가 표시됩니다.
더 많은 텍스트가 있지만 스크롤로 볼 수 있어요. 계속해서 더 길게 작성해 볼게요.
정말 정말 긴 메시지입니다. 끝까지 읽어보세요!
</div>
</body>
</html>
실습 예제 3
position: static, realtive, z-index 사용해보기
- 뼈대 코드
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>포토 갤러리</title>
</head>
<body>
<h2>나만의 포토 갤러리</h2>
<div class="gallery">
<div class="photo-card card1">사진 1</div>
<div class="photo-card card2">사진 2</div>
<div class="photo-card card3">사진 3</div>
<div class="photo-card card4">사진 4</div>
</div>
</body>
</html>


- 문제 원인: .gallery의 position: static 때문에 .photo-card가 .gallery를 기준으로 위치를 설정하지 않고, <body>를 기준으로 배치되었습니다. 이로 인해 .gallery의 overflow: auto가 동작하지 않았습니다.
- 해결 방법: .gallery의 position을 relative로 설정하여 .photo-card가 .gallery를 기준으로 위치를 설정하도록 했습니다.
- 핵심 포인트: position: absolute를 사용할 때는 기준점이 되는 부모 요소에 position: relative를 설정하는 것이 일반적입니다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>포토 갤러리</title>
<style>
body {
background-color: #f5f5f5;
padding: 40px;
font-family: Arial, sans-serif;
position: static;
}
.gallery {
width: 400px;
height: 300px;
border: 2px solid #333;
/* position: static; */
position: relative;
overflow: auto; /* 넘치는 내용 스크롤 처리 */
}
.photo-card {
width: 150px;
height: 150px;
position: absolute;
border: 2px solid #666;
background-color: #fff;
text-align: center;
line-height: 150px;
font-size: 18px;
}
.card1 {
top: 20px;
left: 20px;
z-index: 1;
background-color: #ffccbc;
}
.card2 {
top: 50px;
left: 100px;
z-index: 2;
background-color: #c8e6c9;
}
.card3 {
top: 80px;
left: 180px;
z-index: 3;
background-color: #b3e5fc;
}
.card4 {
top: 180px;
left: 260px;
z-index: 4;
background-color: #fff9c4;
}
</style>
</head>
<body>
<h2>나만의 포토 갤러리</h2>
<div class="gallery">
<div class="photo-card card1">사진 1</div>
<div class="photo-card card2">사진 2</div>
<div class="photo-card card3">사진 3</div>
<div class="photo-card card4">사진 4</div>
</div>
</body>
</html>
'HTML CSS JavaScript' 카테고리의 다른 글
| CSS Float와 Clear 속성 (0) | 2025.07.18 |
|---|---|
| CSS Transition(부드러운 애니메이션 만들기) (1) | 2025.07.18 |
| CSS font 속성 (2) | 2025.07.18 |
| CSS block, inline (0) | 2025.07.18 |
| CSS background에 이해 (0) | 2025.07.18 |