웹을 배우기 전에 알고가야 할 표어가 있다면, 그건 바로 '정답은 없지만, 표준은 있다'는 마음가짐. 웹 기술은 발전 속도가 매우 빠르므로 개인 기술 블로그보다는 검증된 공식 문서를 최우선으로 참조해야 한다. (5년만 지나도 사용이 불가능한 경우가 종종 있다)

HTML 파일을 브라우저에서 즉시 실행하게 해주는 확장 프로그램. 설치 후 Alt + B로 실행 가능하다.

수정 시 한쪽 태그만 바꿔도 쌍이 되는 태그 자동 수정 확장 프로그램. 태그 수정 시간을 단축하고, 실수를 방지할 수 있다.

현재 위치한 태그와 일치하는 쌍 태그를 강조 표시해 준다. 복잡한 중첩 구조 파악에 용이하다.

크롬이나 익스플로러의 경우 웹페이지의 코드를 분석하고 수정하는 도구인 '개발자 도구'를 지원한다. 크롬은 단축키 F12 또는 Ctrl + Shift + I, 아니면 브라우저 우측 상단 [도구 더보기] - [개발자 도구]로 들어갈 수 있다. 위 사진은 네이버의 로그인 화면을 개발자 도구로 본 화면이다.

역할에 따라 세 가지로 나뉜다.
HTML은 웹 페이지의 의미와 구조를 정의하는 언어. 단순히 텍스트를 나열하는 것이 아닌, 각 요소가 어떤 역할을 하는지 컴퓨터에게 알려주는 설계도와 같다. 결국 HTML을 배운다는 것은, 단순히 화면에 글자를 띄우는 법을 배우는 것이 아니라 어떻게 하면 컴퓨터에게 이 데이터의 의미를 가장 정확하게 전달할 것인지 구조화를 고민하는 과정인 셈.
<>) 등을 사용하여 문서나 데이터의 구조를 명시하는 언어.| 단계 | 명칭 | 특징 |
|---|---|---|
| 1단계 | Raw Text | 아무런 가공 없이 텍스트만 냅다 적어놓은 상태 (컴퓨터가 의미 파악 불가) |
| 2단계 | Logical Structure | 넘버링, 들여쓰기 등을 통해 인간이 이해할 수 있게 논리 구조를 부여한 상태 |
| 3단계 | HTML Markup | 약속된 태그를 사용하여 컴퓨터가 구조와 의미를 정확히 이해하도록 완성한 상태 |
HTML 문서는 일정한 계층 구조를 가지고 있는데, 크게 설정 영역(head)과 본문 영역(body)으로 나뉜다.
| 태그 | 역할 | 주요 특징 |
|---|---|---|
<!DOCTYPE html> | 문서 형식 선언 | "이 문서는 HTML5 형식이다"라고 브라우저에 알림 |
<html> | 루트(Root) 요소 | 전체 페이지의 모든 콘텐츠를 감싸는 최상위 태그 |
<head> | 메타데이터 영역 | 브라우저 탭 제목, 인코딩 설정 등 사용자에게 보이지 않는 설정 작성 |
<title> | 문서 제목 | 브라우저 탭에 표시되며, 즐겨찾기(북마크) 시 이름으로 사용됨 |
<body> | 콘텐츠 영역 | 텍스트, 이미지 등 실제 화면에 표시되는 모든 내용을 작성. 한 HTML 문서에는 단 하나의 <body> 요소만 존재해야 한다. |
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>나의 첫 웹 페이지</title>
</head>
<body>
<h1>안녕하세요! 반갑습니다.</h1>
<p>이곳은 실제 화면에 표시되는 콘텐츠 영역(body)입니다.</p>
</body>
</html>

TIP : 그냥
!하나만 쳐도 기본 템플릿을 만들 수 있다. 뺑뺑이 안 해도 괜찮음.


일반적으로 여는 태그(Opening tag), 내용(Content), 닫는 태그(Closing tag)로 구성된다.
/)를 포함하여 요소의 끝을 알림.<br>, <img>, <input>)요소의 동작을 조절하거나 추가적인 정보를 부여하기 위해 사용한다. 주로 CSS 스타일링을 위한 선택자로 활용되기도 한다.
속성을 올바르게 작성하지 않으면 코드가 의도대로 작동하지 않을 수 있으니 주의해야 한다.
"" 또는 '')로 감싸야 한다.<p class="editor-note">안녕하세요! 반갑습니다.</p>
<h1> ~ <h6> (Headings): 문서의 제목을 나타낸다.<h1>은 최상위 제목을 의미하며, 숫자가 커질수록 하위 수준의 제목을 나타낸다.<p> (Paragraphs): 하나의 문단을 정의한다.<ul> (Unordered List): 순서가 중요하지 않은 글머리 기호 목록.<ol> (Ordered List): 순서가 있는 번호 매기기 목록.<li> (List Item): <ul>이나 <ol> 안에서 개별 항목을 정의.<em> (Emphasis): 텍스트를 기울임꼴로 표시하며, 구어체적인 강조를 나타낸다.<strong> (Importance): 텍스트를 굵게 표시하며, 해당 부분이 매우 중요하거나 긴급함을 의미.<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>오늘의 학습 리포트</title>
</head>
<body>
<h1>HTML 기초 학습 가이드</h1>
<p>웹 페이지를 구성하는 가장 기본적인 요소들을 배우고 있습니다.</p>
<h2>1. 오늘의 핵심 요약</h2>
<p>태그는 단순히 디자인을 위한 것이 아니라, <strong>정보의 중요도</strong>를 브라우저에 알리는 역할을 합니다.</p>
<h3>공부할 태그 목록</h3>
<ul>
<li>제목 태그 (h1 ~ h6)</li>
<li>문단 태그 (p)</li>
<li>목록 태그 (ul, ol, li)</li>
</ul>
<h3>학습 순서</h3>
<ol>
<li>태그의 의미 파악하기</li>
<li><em>직접 코드를 타이핑</em>하며 실습하기</li>
<li>브라우저에서 결과 확인하기</li>
</ol>
<p>주의사항: <strong>문서 내 h1 태그는 가급적 한 번만 사용</strong>하는 것이 검색 엔진 최적화에 유리합니다.</p>
</body>
</html>

CSS는 HTML로 만든 뼈대에 살을 붙이고 옷을 입히는 디자인 및 레이아웃 언어.
Cascading은 '위에서 아래로 흐르는 폭포수'라는 뜻. CSS에서 이 용어를 사용하는 이유는 여러 스타일 규칙이 충돌할 때, 우선순위에 따라 아래로 흐르며 최종 스타일이 결정되기 때문.
| 방식 | 작성 위치 | 특징 |
|---|---|---|
| 인라인(Inline) | HTML 태그의 style 속성 | 특정 요소 하나에만 즉시 적용 |
| 내부(Internal) | HTML <head> 내 <style> 태그 | 해당 HTML 페이지 전체에 적용 |
| 외부(External) | 별도의 .css 파일 | 여러 HTML 문서에서 공통 사용 가능 |
<link> 태그)외부 파일을 불러올 때는 HTML의 <head> 영역에 다음과 같이 작성한다.
<link rel="stylesheet" href="style.css">
동일한 요소에 서로 다른 스타일이 정의되었을 때, 브라우저는 다음 순서에 따라 적용한다.
<head>에 작성된 스타일이 그다음.가장 좋은 것은 외부(External) 방식. HTML은 구조만, CSS는 디자인만 담당하도록 분리하는 것이 나중에 코드를 수정하거나 관리할 때 훨씬 유리하기 때문이다.
CSS는 선택자와 선언부로 구성되며, 선언부는 다시 속성과 값의 쌍으로 이루어진다.
/* 선택자 { 속성: 값; } */
h1 {
color: red; /* 글자 색상을 빨간색으로 설정 */
font-size: 30px; /* 글자 크기를 30px로 설정 */
}
;)으로 끝내야 한다.| 종류 | 표현 방식 | 설명 |
|---|---|---|
| 전체 선택자 | * | 페이지 내의 모든 HTML 요소를 선택한다. |
| 요소 선택자 | 태그명 | 지정한 모든 태그를 선택한다 (예: h2, p). |
| 클래스 선택자 | .클래스명 | 특정 class 속성을 가진 모든 요소를 선택한다. 재사용성을 염두에 두고 만들어진 선택자. |
| 아이디 선택자 | #아이디명 | 특정 id 속성을 가진 요소를 선택한다. 문서 내에 단 하나만 존재해야 한다. |
| 속성 선택자 | [속성] | 주어진 속성이나 속성값을 가진 요소를 선택하며, 존재 여부나 값의 일치 여부를 따진이다. |
<!DOCTYPE html>
<html>
<head>
<style>
/* 전체 선택자: 모든 요소의 여백 제거 및 폰트 설정 */
* {
margin: 10px;
font-family: 'Arial', sans-serif;
}
/* 요소 선택자: 모든 <p> 태그의 글자 크기 조절 */
p {
font-size: 16px;
line-height: 1.5;
}
/* 클래스 선택자: 'highlight' 클래스를 가진 요소들 (재사용 가능) */
.highlight {
background-color: yellow;
color: red;
}
/* 아이디 선택자: 'main-title' 아이디를 가진 단 하나의 요소 */
#main-title {
color: navy;
border-bottom: 2px solid navy;
}
/* 속성 선택자: 'target' 속성을 가진 링크만 선택 */
[target] {
font-weight: bold;
text-decoration: none;
}
</style>
</head>
<body>
<h1 id="main-title">CSS 선택자 학습하기</h1>
<p class="highlight">이 문장은 클래스 선택자로 강조되었습니다.</p>
<p>이것은 일반적인 요소 선택자가 적용된 문단입니다.</p>
<ul>
<li class="highlight">리스트 항목에도 같은 클래스를 적용할 수 있습니다.</li>
<li><a href="https://google.com" target="_blank">새 창으로 열리는 링크 (속성 선택자 적용)</a></li>
</ul>
</body>
</html>

요소 간의 계층 구조를 이용하여 특정 조건에 맞는 요소를 선택한다.
; 공백): 선택자 사이에 공백을 두어, 특정 요소 안에 포함된 모든 하위 요소(자식, 손자 등)를 선택한다.>): 특정 요소 바로 한 단계 아래에 있는 자식 요소만을 선택한다.<div class="parent">
<p>나는 자식(Child)입니다. (1단계)</p>
<div class="box">
<p>나는 손자(Grandchild)입니다. (2단계)</p>
</div>
</div>
<p>나는 부모님 밖에 있는 다른 문장입니다.</p>
| 구분 | CSS 선택자 | 선택되는 대상 | 설명 |
|---|---|---|---|
| 자손 결합자 | .parent p | 모든 <p> 태그 | .parent 안에 있기만 하면 자식, 손자 상관없이 모두 선택 (빨간색) |
| 자식 결합자 | .parent > p | 자식 <p> 태그만 | .parent 바로 아래에 있는 첫 번째 단계의 <p>만 선택 (파란색) |
CSS는 부모 요소에 적용된 스타일이 자식 요소에게 전달되는 특성을 가진다.
color, font-family, font-size, text-align 등).margin, padding, border, display 등).동일한 요소에 여러 스타일이 충돌할 때, 브라우저는 '더 구체적인' 선택자의 손을 들어준다.
| 우선순위 | 선택자 종류 |
|---|---|
| 1순위 | !important |
| 2순위 | 인라인 스타일 (Inline style) |
| 3순위 | 아이디 선택자 (#id) |
| 4순위 | 클래스/속성/가상 선택자 (.class) |
| 5순위 | 요소/가상 요소 선택자 (tag) |
| 6순위 | 전체 선택자 (*) |
만약 우선 순위가 같을 경우, 나중에 선언된(가장 아래에 있는) 스타일이 최종 적용. (Cascading 원리)
<!DOCTYPE html>
<html>
<head>
<style>
/* 6순위: 전체 선택자 (가장 낮음) */
* { color: gray; }
/* 5순위: 요소 선택자 */
p { color: blue; }
/* 4순위: 클래스 선택자 */
.my-text { color: green; }
/* 3순위: 아이디 선택자 */
#unique-text { color: orange; }
/* 2순위는 아래 HTML의 inline style (red) 입니다. */
/* 1순위: !important (무조건 승리) */
.important-text { color: pink !important; }
</style>
</head>
<body>
<p id="unique-text" class="my-text important-text" style="color: red;">
1. !important가 적용된 글자 (Pink)
</p>
<p id="unique-text" class="my-text" style="color: red;">
2. 인라인 스타일이 적용된 글자 (Red)
</p>
<p id="unique-text" class="my-text">
3. 아이디 선택자가 적용된 글자 (Orange)
</p>
<p class="my-text">
4. 클래스 선택자가 적용된 글자 (Green)
</p>
<p>
5. 요소 선택자(p)만 적용된 글자 (Blue)
</p>
<span>
6. 아무 설정 없는 span 태그 (Gray)
</span>
</body>
</html>


HTML의 모든 요소는 사각형 형태의 '박스'로 둘러싸여 있다. 이 박스의 크기와 간격을 조절하여 레이아웃을 잡는다.
width)는 Content 영역만을 의미한다.width + padding + border (Margin은 제외).box-sizing: border-box; 속성을 자주 사용한다.요소가 화면에서 어떻게 배치될지 결정.

<div>, <h1>, <p>)<span>, <a>, <strong>)inline 요소는 width, height, 상하 margin 등이 제대로 적용되지 않는다.inline처럼 한 줄에 놓이면서도, block처럼 크기 조절이 가능.책의 문단처럼 작동하며, 페이지의 큰 구조와 단락을 만든다.
width, height 속성을 자유롭게 사용할 수 있다.padding, margin, border가 주변 요소를 사방으로 확실히 밀어낸다.<div>, <h1>~<h6>, <p>, <ul>, <li> 등<div>는 레이아웃을 그룹화하고 구조화하는 데 가장 많이 쓰임.문장 속 단어에 칠한 형광펜처럼 작동하며, 흐름을 끊지 않고 스타일을 적용함.
width, height 속성을 사용할 수 없음. (콘텐츠 양에 따라 결정됨)margin, padding이 정상 적용되어 주변 요소를 밀어낸다.<span>, <a>, <strong>, <img> 등<span>은 그 자체로는 변화가 없으나, 텍스트의 특정 부분만 조작할 때 유용.| 구분 | Block 타입 | Inline 타입 |
|---|---|---|
| 줄 바꿈 | 항상 새로운 줄에서 시작 | 줄 바꿈 없이 옆으로 나열 |
| 너비(Width) | 부모 요소의 100% 차지 | 콘텐츠 크기만큼 차지 |
| 크기 설정 | width, height 가능 | 불가능 |
| 상하 여백 | margin, padding 완벽 적용 | 적용되나 주변 요소를 못 밀어냄 |
| 주 목적 | 레이아웃, 페이지 구조 설계 | 문장 내 특정 부분 스타일링 |
Inline과 Block의 장점을 모두 가진 특별한 속성.
width 및 height 속성을 사용하여 크기를 직접 지정할 수 있다.padding, margin, border가 주변 요소를 사방으로 밀어낸다.요소를 화면에서 완전히 제거하며, 공간조차 차지하지 않게 만듦.
display: none;을 적용하면 요소가 차지하던 공간이 사라져 다음 요소들이 그 자리를 메우게 됨.| 구분 | Block | Inline | Inline-block | None |
|---|---|---|---|---|
| 줄 바꿈 | 발생함 (새 줄) | 발생 안 함 (옆으로) | 발생 안 함 (옆으로) | 요소 자체가 사라짐 |
| 크기 지정 | 가능 | 불가능 | 가능 | 의미 없음 |
| 공간 차지 | 너비 100% | 콘텐츠만큼만 | 콘텐츠/설정만큼만 | 공간 차지 안 함 |
| 상하 여백 | 완벽 적용 | 적용되나 밀어내지 못함 | 완벽 적용 | 해당 없음 |
<!DOCTYPE html>
<html>
<head>
<style>
.container { background-color: #f0f0f0; padding: 10px; border: 1px dashed #ccc; }
.box { background-color: skyblue; border: 2px solid blue; margin: 10px; padding: 5px; }
/* 1. Block: 너비 100%, 줄바꿈 발생 */
.block-type { display: block; width: 200px; height: 50px; }
/* 2. Inline: 크기 지정 불가, 줄바꿈 없음 */
.inline-type { display: inline; width: 200px; height: 50px; background-color: lightgreen; border-color: green; }
/* 3. Inline-block: 크기 지정 가능, 줄바꿈 없음 */
.inline-block-type { display: inline-block; width: 150px; height: 50px; background-color: orange; border-color: darkorange; }
/* 4. None: 아예 사라짐 */
.none-type { display: none; }
.desc { font-weight: bold; margin-top: 20px; display: block; }
</style>
</head>
<body>
<div class="container">
<span class="desc">1. Block 타입 (width 200px 적용됨, 혼자 한 줄 차지)</span>
<div class="box block-type">Block 1</div>
<div class="box block-type">Block 2</div>
<hr>
<span class="desc">2. Inline 타입 (width 200px 무시됨, 옆으로 나열)</span>
<span class="box inline-type">Inline 1</span>
<span class="box inline-type">Inline 2</span>
<span>← (글자 크기만큼만 차지함)</span>
<hr>
<span class="desc">3. Inline-block 타입 (width 150px 적용됨, 옆으로 나열)</span>
<div class="box inline-block-type">Inline-block 1</div>
<div class="box inline-block-type">Inline-block 2</div>
<hr>
<span class="desc">4. None 타입 (아래에 'None' 박스가 있지만 안 보임)</span>
<span>이것은 앞 문장입니다.</span>
<div class="box none-type">나는 보이지 않아요</div>
<span>← 보이지 않는 박스 공간이 사라져서 바로 옆에 붙습니다.</span>
</div>
</body>
</html>

display 등)top, bottom, left, right 네 가지 방향 속성으로 위치를 세밀하게 조정하며, Z-Axis를 통해 겹치는 순서도 결정할 수 있다.top, left 등)을 써도 반응하지 않는 가장 정직한 상태다.body를 기준으로 한다. 원래 차지하던 공간은 사라져 다른 요소들이 그 자리를 메운다.relative와 fixed의 장점을 합친 똑똑한 속성. 평소에는 relative처럼 있다가, 설정한 지점에 도달하면 화면에 착 붙는 fixed처럼 동작한다.<!DOCTYPE html>
<html>
<head>
<style>
.container { background-color: #eee; height: 1500px; padding: 20px; border: 2px solid #ccc; }
.box { width: 100px; height: 60px; color: white; display: flex; align-items: center; justify-content: center; font-weight: bold; margin-bottom: 10px; }
/* 1. Static: 기본값, 이동 불가 */
.static-box { position: static; background-color: gray; top: 50px; left: 50px; }
/* 2. Relative: 자기 원래 자리 기준 이동 (공간 유지) */
.relative-parent { position: relative; background-color: #333; height: 150px; padding: 10px; }
.relative-box { position: relative; background-color: blue; top: 20px; left: 30px; }
/* 3. Absolute: 부모(relative) 기준 이동 (공간 소멸) */
.absolute-box { position: absolute; background-color: red; bottom: 10px; right: 10px; }
/* 4. Fixed: 브라우저 화면(Viewport) 기준 고정 */
.fixed-box { position: fixed; background-color: purple; top: 10px; right: 10px; width: 150px; z-index: 100; }
/* 5. Sticky: 스크롤 하다가 특정 지점에서 고정 */
.sticky-box { position: sticky; top: 0; background-color: orange; width: 100%; margin: 0; }
</style>
</head>
<body>
<div class="fixed-box">Fixed: 나만 따라와!</div>
<div class="container">
<div class="box sticky-box">Sticky: 헤더처럼 위에 붙을게요 (스크롤 해보세요)</div>
<p>1. Static: top, left를 줘도 움직이지 않습니다.</p>
<div class="box static-box">Static</div>
<p>2. Relative & Absolute 부모 안의 자식들:</p>
<div class="relative-parent">
Relative 부모 (검은 영역)
<div class="box relative-box">Relative</div>
<div class="box absolute-box">Absolute</div>
</div>
<p style="margin-top: 50px;">
* <b>Relative</b>: 원래 자리에서 20px 내려왔지만, 뒤의 Absolute 박스가 그 자리를 차지하지 못함 (자리 지킴)<br>
* <b>Absolute</b>: 부모 박스의 오른쪽 아래에 딱 붙음 (공중에 뜸)
</p>
</div>
</body>
</html>
