HTML과 CSS 두 파일로 반응형 서비스 페이지를 어떻게 구성하나요?
HTML·CSS 두 파일로 소개·카드·이미지·요금표·문의 폼·FAQ를 만듭니다. 영역을 section으로 나누고 작은 화면에서는 카드·이미지 폭을 조절하며 표만 가로로 스크롤하게 합니다.
적용 조건·범위: 위 코드는 표·폼·이미지·FAQ를 모두 포함한 단독 최소 페이지입니다. 폼은 브라우저 형식 검사만 수행하며 서버 저장은 없습니다. 아래 누적 프로젝트의 풍부한 스타일과는 범위를 구분합니다. 320/360/768/1024px, 200% 확대, Tab 순서, 이미지 Network 상태를 회차별로 기록하세요. 실화면 검증을 하지 않았다면 '통합 확인 완료'로 표시하지 않습니다.
공식 문서 참고: W3C WAI: 시맨틱 HTML로 페이지 영역 구성 · MDN: 화면 조건에 따라 CSS를 적용하는 미디어 쿼리
독립 실습: 직접 만들고 확인하기
HTML CSS 종합 실습: 소개·카드·이미지·요금표·문의 폼·FAQ가 있는 반응형 서비스 페이지 · 독립 실습
메뉴 이동·문의 이메일 검증·FAQ 열기와 좁은 화면 배치를 확인하세요.
예제 크게 보기 (새 탭)main { max-width: 1100px; margin: 0 auto; padding: 16px; }
section { padding-block: 24px; }
@media (min-width: 768px) { main { padding: 32px; } }*, *::before, *::after { box-sizing: border-box; }
body { margin: 0; font-family: sans-serif; color: #222; }
h1 { font-size: 32px; }
img { max-width: 100%; height: auto; }
.table-scroll { overflow-x: auto; }
table { min-width: 480px; border-collapse: collapse; }
th, td { padding: 8px; border: 1px solid #777; }
form { display: grid; gap: 8px; }
input { min-width: 0; }
:focus-visible { outline: 2px solid #222; outline-offset: 3px; }직접 실행: 환경 준비와 전체 파일
독자 질문
소개·카드·이미지·요금표·문의 폼·FAQ를 두 파일로 묶어 좁은 화면에서도 사용할 수 있게 하려면 어떤 구조와 CSS가 필요할까요?
직접 만들 화면
TaskFlow의 header, hero, 기능 카드, 이미지, 요금표, 문의 폼, FAQ, footer가 이 순서로 이어지는 화면
새 폴더에 index.html과 style.css를 만들고 아래 전체 파일을 각각 저장하세요. 브라우저에서 index.html을 엽니다.
<!doctype html>
<html lang="ko">
<head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>HTML CSS 종합 실습: 소개·카드·이미지·요금표·문의 폼·FAQ가 있는 반응형 서비스 페이지</title><link rel="stylesheet" href="./style.css"></head>
<body>
<header><nav aria-label="주요 메뉴"><a href="#features">기능</a> <a href="#pricing">요금제</a> <a href="#contact">문의</a></nav></header>
<main>
<section aria-labelledby="hero-title"><h1 id="hero-title">TaskFlow</h1><img src="https://blogflow.kr/wp-content/uploads/2026/09/html-css-image-checklist-cover-20260914.webp" alt="이미지 비율 학습용 표지" width="900" height="600"><p>해야 할 일을 한곳에서 살펴보세요.</p></section>
<section id="features" aria-labelledby="features-title"><h2 id="features-title">주요 기능</h2><article><h3>빠른 입력</h3><p>할 일을 적습니다.</p></article></section>
<section id="pricing" aria-labelledby="pricing-title"><h2 id="pricing-title">요금제</h2><div class="table-scroll"><table><caption>요금 비교</caption><tr><th scope="col">항목</th><th scope="col">Basic</th><th scope="col">Pro</th></tr><tr><th scope="row">프로젝트</th><td>3개</td><td>무제한</td></tr></table></div></section>
<section id="contact" aria-labelledby="contact-title"><h2 id="contact-title">문의</h2><form><label for="email">이메일</label><input id="email" name="email" type="email" required><button type="submit">형식 확인</button></form></section>
<section aria-labelledby="faq-title"><h2 id="faq-title">FAQ</h2><details><summary>사용 방법은?</summary><p>기능을 선택하세요.</p></details></section>
</main>
<footer><p>TaskFlow 정적 화면</p></footer>
</body>
</html>
style.css 끝에 아래 규칙을 추가하세요. 이미지와 표가 작은 화면에서 문서 전체를 밀어내지 않게 합니다.
확인할 결과와 실제 검증 상태
위 코드는 표·폼·이미지·FAQ를 모두 포함한 단독 최소 페이지입니다. 폼은 브라우저 형식 검사만 수행하며 서버 저장은 없습니다. 아래 누적 프로젝트의 풍부한 스타일과는 범위를 구분합니다. 320/360/768/1024px, 200% 확대, Tab 순서, 이미지 Network 상태를 회차별로 기록하세요. 실화면 검증을 하지 않았다면 ‘통합 확인 완료’로 표시하지 않습니다.
실제 브라우저·DevTools 조작 결과: 미확인. 위 내용은 코드에서 예상되는 결과와 독자가 수행할 확인 절차입니다.
다음 학습 연결
15회차에서는 이 완성본의 문서 구조와 이미지 성능을 최종 진단합니다.
작은 변형: 요금표에 기능 행 하나와 FAQ 질문 하나를 추가하세요. 360px에서는 표 안에서만 가로 이동하고, 새 질문을 Tab과 Enter로 여닫을 수 있어야 합니다.
페이지 구조
최종 TaskFlow 정적 페이지는 다음 흐름을 사용합니다.
skip link
header / nav
main
hero
features
service preview
pricing
contact
FAQ
footer
fixed help link
사용자에게 중요한 순서대로 배치합니다.

완성 실습에서 중요한 점
코드가 많아졌다고 새 기술을 계속 추가하지 않습니다.
각 요소가 지금까지 배운 원칙을 유지하는지 확인합니다.
- hero 이미지 width/height
- feature Grid
- pricing table 국소 scroll
- form label
- details/summary
- sticky header
- focus-visible
- overflow 대응
실행 확인
320px
360px
768px
1024px
1440px
200% zoom
keyboard only
모든 구간을 확인합니다.
자주 발생하는 오류와 해결
종합 실습에서 새로운 UI 효과를 계속 추가합니다
목표는 기능 확장이 아니라 기존 학습 내용의 통합입니다. 새 animation이나 복잡한 장식보다 구조·반응형·접근성 일관성을 우선합니다.
CSS를 페이지 순서대로 계속 덧붙입니다
reset/base/layout/shared component/section/responsive/accessibility처럼 책임별로 정리하면 중복과 cascade 충돌을 줄일 수 있습니다.
desktop 화면만 보고 완료합니다
320~360px, 768px, 1024px 이상, 200% zoom, keyboard-only 사용까지 함께 확인합니다.
학습 완료 체크리스트
- 여러 section을 하나의 정보 구조로 통합할 수 있습니다.
- Flex/Grid/position 역할을 구분할 수 있습니다.
- 표·폼·FAQ의 시맨틱 구조를 유지할 수 있습니다.
- 반응형·접근성·이미지 문제를 동시에 점검할 수 있습니다.
- CSS 파일을 책임별로 정리할 수 있습니다.
CSS 구조 정리
긴 style.css를 다음 책임 순서로 정리합니다.
1. reset / root
2. base element
3. layout
4. shared component
5. section-specific component
6. responsive
7. accessibility helpers
아래는 책임별 구성을 보여 주는 부분 예제입니다. 독립 실습에서는 해당 절의 style.css 전체 코드와 추가 규칙을 사용하고, 누적 실습에서는 하단 완료 파일을 기준으로 적용합니다.
*,
*::before,
*::after {
box-sizing: border-box;
}
body {
margin: 0;
font-family:
Arial,
sans-serif;
line-height: 1.6;
color: #171717;
background: #f5f5f5;
}
img {
display: block;
max-width: 100%;
}
.page {
width: min(
100% - 32px,
960px
);
margin-inline: auto;
}
main {
padding-block: 48px;
}
section + section {
margin-top: 72px;
}
.card {
padding: 24px;
border: 1px solid #d7d7d7;
background: #fff;
}
.feature-grid {
display: grid;
grid-template-columns:
repeat(
auto-fit,
minmax(
min(100%, 220px),
1fr
)
);
gap: 16px;
}
.hero {
display: grid;
gap: 24px;
}
@media (
min-width: 48rem
) {
.hero {
grid-template-columns:
minmax(0, 1fr)
minmax(0, 1fr);
align-items: center;
}
}
독립 실습은 여기서 마칠 수 있습니다. 아래 선택 실습은 TaskFlow 프로젝트 파일로 진행합니다.
선택 실습: 할 일 앱에 적용하기
TaskFlow는 간단한 서비스 화면에서 시작해 할 일 앱으로 이어 만드는 예제입니다. 이 선택 실습에서는 HTML과 CSS로 이번 화면을 만듭니다.
1~13회차 결과물을 하나의 완성된 정적 서비스 페이지로 통합합니다.
선택: 연재 프로젝트와 전체 자료
연재 프로젝트를 이어 만드는 분을 위한 자료입니다. 이 글의 개념과 예제만 찾으셨다면 필요한 파일과 실행 방법만 펼쳐보세요.
TaskFlow 프로젝트 적용
HTML CSS 종합 실습: 소개·카드·이미지·요금표·문의 폼·FAQ가 있는 반응형 서비스 페이지 · 단계별 TaskFlow
TaskFlow 누적 14단계입니다. 메뉴 이동·문의 이메일 검증·FAQ 열기와 좁은 화면 배치를 확인하세요.
예제 크게 보기 (새 탭)실행 가능한 시작본과 이번 단계
이번 단계 시작 ZIP을 새 폴더에 압축 해제합니다. 이 ZIP은 직전 단계의 완료 파일과 같으며 앞 글의 코드를 따로 모을 필요가 없습니다. 이번 단계 완료 ZIP은 다른 폴더에 풀어 비교합니다.
앞 단계의 FAQ·표·폼·Container Query·이미지를 유지하면서 hero 제목·설명·문의 버튼을 한 영역으로 묶고 메뉴를 통합합니다.
index.html: 이 파일의 기존 내용을 아래 완료 파일 전체와 대조하여 교체합니다. 다른 파일은 유지합니다.style.css: 이 파일의 기존 내용을 아래 완료 파일 전체와 대조하여 교체합니다. 다른 파일은 유지합니다.
짧은 코드 예제는 변경 위치를 설명합니다. 파일 전체를 작성하거나 교체할 때는 완료 파일 전체를 사용하세요. 생략 표시가 있는 부분 코드를 파일 전체로 저장하지 않습니다.
실행: ZIP의 index.html을 브라우저에서 엽니다. 외부 서버나 npm 설치 없이 로컬 HTML·CSS·이미지를 사용합니다. 문의 폼은 서버 전송을 연결하지 않은 문서 예제입니다. 연습 값만 사용하고 입력 형식을 확인합니다.
직접 확인할 결과: 완성 서비스 페이지에 소개·기능·요금제·문의·FAQ가 모두 남아 있으며 중복 main·id가 없습니다.
전체 파일·코드 보기
완료 파일 전체
index.html 전체 파일
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="utf-8"/>
<meta content="width=device-width, initial-scale=1.0" name="viewport"/>
<title>
TaskFlow - 작업 정리 서비스
</title>
<link href="./style.css" rel="stylesheet"/>
</head>
<body>
<a class="skip-link" href="#main">
본문으로 바로가기
</a>
<header class="site-header">
<div class="page site-header__inner">
<a class="brand" href="#home">
TaskFlow
</a>
<nav aria-label="주요 메뉴" class="nav">
<a href="#features">
기능
</a>
<a href="#pricing">
요금제
</a>
<a href="#contact">
문의
</a>
<a href="#faq">
FAQ
</a>
</nav>
</div>
</header>
<main class="page" id="main" tabindex="-1">
<div class="service-layout">
<div>
<section class="hero" id="home">
<div>
<h1>
해야 할 일을 한눈에 정리하세요
</h1>
<p>
TaskFlow는 오늘의 작업을 빠르게 정리하는 서비스입니다.
</p>
<a class="button-link" href="#contact">
시작 문의하기
</a>
</div>
<img alt="TaskFlow 서비스 소개 페이지의 기능·문의 화면" class="hero__image" height="800" src="./images/hero.webp" width="1200"/>
</section>
<section id="features">
<h2>
주요 기능
</h2>
<div class="feature-grid">
<article class="card feature-card">
<span class="feature-card__badge">
NEW
</span>
<h3>
빠른 작업 추가
</h3>
<p>
해야 할 일을 바로 기록할 수 있습니다.
</p>
<img alt="TaskFlow 기능 카드 세 개" class="feature-card__image" height="450" src="./images/feature-board.webp" width="800"/>
</article>
<article class="card">
<h3>
간단한 분류
</h3>
<p>
해야 할 일을 구분합니다.
</p>
</article>
<article class="card">
<h3>
진행 확인
</h3>
<p>
완료 여부를 확인합니다.
</p>
</article>
<article class="card task-preview">
<div class="task-preview__content">
<h3>
아주 긴 작업 제목과 URL
</h3>
<p>
https://example.com/very-long-task-url-without-normal-break-points-123456789
</p>
</div>
<a href="#contact">
문의
</a>
</article>
</div>
</section>
<section class="faq" id="faq">
<h2>
자주 묻는 질문
</h2>
<details>
<summary>
TaskFlow는 어떤 서비스인가요?
</summary>
<p>
해야 할 일을 빠르게 정리하는 작업 관리 서비스 예제입니다.
</p>
</details>
<details>
<summary>
모바일에서도 볼 수 있나요?
</summary>
<p>
작은 화면부터 설계한 반응형 레이아웃을 사용합니다.
</p>
</details>
<details>
<summary>
문의는 어디서 하나요?
</summary>
<p>
아래 문의 폼을 이용할 수 있습니다.
</p>
</details>
</section>
<section id="pricing">
<h2>
요금제
</h2>
<div class="pricing-grid">
<article class="card">
<h3>
Basic
</h3>
<p>
개인 학습용
</p>
</article>
<article class="card">
<h3>
Pro
</h3>
<p>
더 많은 프로젝트
</p>
</article>
</div>
<div aria-label="요금제 비교표 가로 스크롤" class="table-scroll" role="region" tabindex="0">
<table class="pricing-table">
<caption>
TaskFlow 요금제 기능 비교
</caption>
<thead>
<tr>
<th scope="col">
항목
</th>
<th scope="col">
Basic
</th>
<th scope="col">
Pro
</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">
프로젝트
</th>
<td>
3개
</td>
<td>
무제한
</td>
</tr>
<tr>
<th scope="row">
작업 보관
</th>
<td>
30일
</td>
<td>
무제한
</td>
</tr>
<tr>
<th scope="row">
팀 공유
</th>
<td>
없음
</td>
<td>
지원
</td>
</tr>
</tbody>
</table>
</div>
</section>
<section id="contact">
<h2>
문의하기
</h2>
<form>
<div class="form-field">
<label for="name">
이름
</label>
<input autocomplete="name" id="name" name="name" type="text"/>
</div>
<div class="form-field">
<label for="email">
이메일
</label>
<input autocomplete="email" id="email" name="email" type="email"/>
</div>
<div class="form-field">
<label for="message">
문의 내용
</label>
<textarea id="message" name="message" rows="5"></textarea>
</div>
<button type="submit">
문의 보내기
</button>
</form>
</section>
<div class="feature-slot">
<article class="card feature-card">
<img alt="TaskFlow 기능 카드 세 개" class="feature-card__image" height="450" src="./images/feature-board.webp" width="800"/>
<div>
<h3>
작업 카드
</h3>
<p>
넓은 공간에서는 이미지와 설명을 나란히 배치합니다.
</p>
</div>
</article>
</div>
</div>
<aside aria-label="기능 미리보기">
<div class="feature-slot">
<article class="card feature-card">
<img alt="TaskFlow 기능 카드 세 개" class="feature-card__image" height="450" src="./images/feature-board.webp" width="800"/>
<div>
<h3>
작업 카드
</h3>
<p>
넓은 공간에서는 이미지와 설명을 나란히 배치합니다.
</p>
</div>
</article>
</div>
</aside>
</div>
</main>
<footer class="site-footer">
<div class="page">
<p>
© TaskFlow
</p>
</div>
</footer>
<a class="help-button" href="#contact">
문의
</a>
</body>
</html>
style.css 전체 파일
:root {
color: #171717;
background: #f5f5f5;
}
*,
*::before,
*::after {
box-sizing: border-box;
}
body {
margin: 0;
font-family:
Arial,
sans-serif;
line-height: 1.6;
color: #171717;
background: #f5f5f5;
}
.page {
width: min(
100% - 32px,
960px
);
margin-inline: auto;
}
.site-header,
.site-footer {
padding-block: 20px;
}
main {
padding-block: 48px;
}
section + section {
margin-top: 64px;
}
.card {
padding: 24px;
border: 1px solid #d7d7d7;
background: #fff;
}
form {
display: grid;
gap: 16px;
}
.form-field {
display: grid;
gap: 8px;
}
input,
textarea {
width: 100%;
min-height: 44px;
padding: 10px 12px;
border: 1px solid #b8b8b8;
background: #fff;
}
button {
min-height: 44px;
padding: 10px 16px;
border: 1px solid #171717;
background: #171717;
color: #fff;
}
a { color: inherit; }
input, textarea, button { font: inherit; }
h1 { font-size: 32px; font-weight: 700; }
h2 { font-size: 24px; }
h3 { font-size: 20px; }
.site-header__inner {
display: flex;
flex-direction: column;
gap: 12px;
}
.nav {
display: flex;
flex-wrap: wrap;
gap: 8px 16px;
}
.feature-list {
display: flex;
flex-direction: column;
gap: 16px;
}
@media (min-width: 48rem) {
.site-header__inner {
flex-direction: row;
align-items: center;
justify-content: space-between;
}
.feature-list {
flex-direction: row;
}
.feature-list > * {
flex: 1;
}
}
.site-header {
position: sticky;
top: 0;
z-index: 10;
background: #f5f5f5;
border: 1px solid #ddd;
}
.feature-card {
position: relative;
}
.feature-card__badge {
position: absolute;
top: 12px;
right: 12px;
padding: 4px 8px;
border: 1px solid #171717;
background: #fff;
font-size: 12px;
}
.help-button {
position: fixed;
right: 16px;
bottom: 16px;
min-width: 44px;
min-height: 44px;
padding: 10px 14px;
border: 1px solid #171717;
background: #171717;
color: #fff;
text-decoration: none;
}
.faq {
display: grid;
gap: 12px;
}
.faq details {
border: 1px solid #d7d7d7;
background: #fff;
}
.faq summary {
padding: 16px;
cursor: pointer;
font-weight: 700;
}
.faq details p {
margin: 0;
padding: 0 16px 16px;
}
.faq summary:focus-visible {
outline: 2px solid #171717;
outline-offset: 2px;
}
.feature-grid,
.pricing-grid {
display: grid;
grid-template-columns:
repeat(
auto-fit,
minmax(
min(100%, 220px),
1fr
)
);
gap: 16px;
}
.task-preview {
display: flex;
align-items: flex-start;
gap: 12px;
}
.task-preview__content {
min-width: 0;
flex: 1;
}
.task-preview__content p {
overflow-wrap: anywhere;
}
.settings-layout {
display: grid;
grid-template-columns:
180px
minmax(0, 1fr);
gap: 24px;
}
.table-scroll {
overflow-x: auto;
}
.pricing-table {
width: 100%;
min-width: 640px;
border-collapse: collapse;
background: #fff;
}
.pricing-table caption {
margin-bottom: 12px;
text-align: left;
font-weight: 700;
}
.pricing-table th,
.pricing-table td {
padding: 12px;
border: 1px solid #d7d7d7;
text-align: left;
}
img {
display: block;
max-width: 100%;
}
.hero__image {
width: 100%;
height: auto;
}
.feature-card__image {
width: 100%;
aspect-ratio: 16 / 9;
object-fit: cover;
}
.service-layout {
display: grid;
gap: 24px;
}
@media (
min-width: 64rem
) {
.service-layout {
grid-template-columns:
minmax(0, 1fr)
280px;
}
}
.feature-slot {
container-type:
inline-size;
}
.feature-card {
display: grid;
gap: 16px;
}
@container (
min-width: 30rem
) {
.feature-card {
grid-template-columns:
180px
minmax(0, 1fr);
align-items: center;
}
}
.service-layout > * { min-width: 0; }
:root {
--z-header: 10;
--z-floating: 20;
}
.site-header {
position: sticky;
top: 0;
z-index:
var(--z-header);
}
.help-button {
position: fixed;
right: 16px;
bottom: 16px;
z-index:
var(--z-floating);
}
:focus-visible {
outline: 2px solid #171717;
outline-offset: 3px;
}
.skip-link {
position: absolute;
left: 16px;
top: -100px;
z-index: 100;
padding: 10px 12px;
background: #171717;
color: #fff;
}
.skip-link:focus {
top: 16px;
}
section[id], main[id] { scroll-margin-top: 8rem; }
body { padding-bottom: 5rem; }
.hero { display: grid; gap: 24px; }
@media (min-width: 48rem) { .hero { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); align-items: center; } }
.button-link { display: inline-block; padding: 10px 16px; border: 1px solid #171717; background: #171717; color: #fff; }
위 파일과 ZIP의 동명 파일은 동일합니다. 회차별 README·CHANGES 문서는 ZIP에 포함합니다. 생성 산출물·node_modules·실제 환경 변수 파일은 포함하지 않습니다.
index.html 전체 구조
<!doctype html>
<html lang="ko">
<head>
<meta charset="UTF-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0"
/>
<title>
TaskFlow - 작업 정리 서비스
</title>
<link
rel="stylesheet"
href="./style.css"
/>
</head>
<body>
<a
class="skip-link"
href="#main"
>
본문으로 바로가기
</a>
<header class="site-header">
<div class="page site-header__inner">
<a
class="brand"
href="#home"
>
TaskFlow
</a>
<nav
class="nav"
aria-label="주요 메뉴"
>
<a href="#features">기능</a>
<a href="#pricing">요금제</a>
<a href="#contact">문의</a>
<a href="#faq">FAQ</a>
</nav>
</div>
</header>
<main
class="page"
id="main"
>
<section
class="hero"
id="home"
>
<div>
<p class="eyebrow">
Simple Task Manager
</p>
<h1>
해야 할 일을 한눈에 정리하세요
</h1>
<p>
TaskFlow는 오늘의 작업과 진행 상태를 간단하게 정리하는 서비스입니다.
</p>
<a
class="button-link"
href="#contact"
>
시작 문의하기
</a>
</div>
<img
class="hero__image"
src="./images/hero.webp"
alt="TaskFlow 작업 목록 화면 예시"
width="1200"
height="800"
/>
</section>
<section id="features">
<h2>주요 기능</h2>
<div class="feature-grid">
<article class="card">
<h3>빠른 작업 추가</h3>
<p>
오늘 할 일을 바로 기록합니다.
</p>
</article>
<article class="card">
<h3>상태 확인</h3>
<p>
진행 중과 완료 작업을 구분합니다.
</p>
</article>
<article class="card">
<h3>간단한 정리</h3>
<p>
필요한 작업을 한 화면에서 확인합니다.
</p>
</article>
</div>
</section>
<section id="pricing">
<h2>요금제</h2>
<div class="table-scroll">
<table class="pricing-table">
<caption>
TaskFlow 요금제 비교
</caption>
<thead>
<tr>
<th scope="col">항목</th>
<th scope="col">Basic</th>
<th scope="col">Pro</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">프로젝트</th>
<td>3개</td>
<td>무제한</td>
</tr>
<tr>
<th scope="row">팀 공유</th>
<td>없음</td>
<td>지원</td>
</tr>
</tbody>
</table>
</div>
</section>
<section id="contact">
<h2>문의하기</h2>
<form>
<div class="form-field">
<label for="name">
이름
</label>
<input
id="name"
name="name"
type="text"
autocomplete="name"
/>
</div>
<div class="form-field">
<label for="email">
이메일
</label>
<input
id="email"
name="email"
type="email"
autocomplete="email"
/>
</div>
<div class="form-field">
<label for="message">
문의 내용
</label>
<textarea
id="message"
name="message"
rows="5"
></textarea>
</div>
<button type="submit">
문의 보내기
</button>
</form>
</section>
<section
class="faq"
id="faq"
>
<h2>자주 묻는 질문</h2>
<details>
<summary>
모바일에서도 사용할 수 있나요?
</summary>
<p>
작은 화면부터 설계한 반응형 화면을 제공합니다.
</p>
</details>
<details>
<summary>
JavaScript가 필요한가요?
</summary>
<p>
현재 페이지는 HTML/CSS 정적 화면이며 다음 과정에서 기능을 추가합니다.
</p>
</details>
</section>
</main>
<footer class="site-footer">
<div class="page">
<p>
© TaskFlow
</p>
</div>
</footer>
<a
class="help-button"
href="#contact"
>
문의
</a>
</body>
</html>
시작본과 이번 변경
웹 접근성 기초 점검: 키보드 순서·초점 표시·확대 화면을 직접 확인하는 체크리스트의 완료 체크포인트를 시작본으로 사용합니다.
13회차의 index.html/style.css와 이미지 파일을 시작 상태로 사용합니다. 아래 누적 HTML 구조를 대조하고 기존 폼·FAQ·표·이미지·접근성 CSS를 유지하며 중복 선택자를 정리합니다. 전체 HTML 예시와 CSS 부분 예시를 구분해 적용합니다.
연속 프로젝트 선수 조건
- 1~13회차의 HTML/CSS 요소를 모두 이해하고 있어야 합니다.
- 새 기술을 추가하는 글이 아니라 지금까지 만든 요소를 하나의 서비스 페이지로 통합하는 완성 실습입니다.
이전 체크포인트
publishing-step-13-accessibility
이번 목표
1~13회차 결과물을 하나의 완성된 정적 서비스 페이지로 통합합니다.
완료 기준
- header/nav/main/footer 존재
- hero 존재
- feature cards 존재
- image 존재
- pricing table 존재
- contact form 존재
- FAQ 존재
- mobile/desktop 반응형
- keyboard 사용 가능
- page 전체 horizontal overflow 없음
완료 체크포인트
publishing-step-14-service-page
다음 학습
마지막 글에서는 완성 페이지를 HTML 구조·이미지 성능·SEO 관점에서 진단하고 JavaScript가 이어받을 최종 정적 체크포인트를 확정합니다.
글 소개·학습 준비·전체 목차

웹 퍼블리싱 · 14 / 15 · 완성 실습 · 반응형 서비스 페이지
소개·기능 카드·이미지·요금표·문의 폼·FAQ를 의미 있는 section으로 나누고, 이미지 폭과 표의 가로 스크롤을 조절하면 작은 화면에서도 읽을 수 있는 정적 서비스 페이지를 만들 수 있습니다.
별도 index.html과 style.css 두 파일로 최소 페이지를 완성한 뒤 화면 폭과 키보드 동작을 확인합니다. 하단에서는 이전 TaskFlow의 구성 요소를 통합한 전체 파일과 대조합니다.
새로운 개념을 많이 추가하기보다 이미 배운 기술이 서로 충돌하지 않고 하나의 화면에서 자연스럽게 동작하도록 정리하는 것이 목표입니다.
이번 글에서 배우는 내용
- 페이지 정보 구조 통합
- hero
- feature cards
- pricing table
- contact form
- FAQ
- responsive layout
- 공통 CSS 구조 정리
- 완성 페이지 검수
먼저 알아야 할 내용
시맨틱 HTML·폼·표·details와 CSS Flex/Grid·반응형을 알면 됩니다. 처음 방문해도 아래 최소 서비스 페이지를 두 파일로 만들 수 있습니다.
목차
이 글이 도움이 되었나요?
읽음 기록
읽음 — / 전체 15개 · 필수 13개
새 글 받아보기
RSS 리더에서 BlogFlow의 새 글을 확인할 수 있습니다.