본문 바로가기

비개발자의 개발 일지

현장 팀장에서 수출 ERP까지 — AI와 함께 시스템을 만든 기록

시리즈 보기
php

솔로의 식탁 — 시맨틱 레이아웃 + 외부 CSS 완전 정리

by 왕진 2026. 6. 22.
반응형

 

 

Web Development · Layout

솔로의 식탁
시맨틱 레이아웃 · 외부 CSS · 반응형 그리드

5개 메뉴를 1열 → 2열 → 3열로 자동 변환하는 레시피 사이트 골격
시작 오늘 분석할 코드

"솔로의 식탁" 레시피 사이트의 메인 페이지 골격이다. HTML 본문은 단순한 시맨틱 마크업만 두고, 디자인·레이아웃은 외부 CSS 파일(style-result-1.css)에서 처리한다. 화면 크기에 따라 1열 → 2열 → 3열로 메뉴가 재배치되는 반응형이 핵심이다.

<!-- index-result-1.html --> <!DOCTYPE html> <html lang="ko"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>솔로의 식탁</title> <link rel="stylesheet" href="css/style-result-1.css"> </head> <body> <div id="container"> <header> <h1>솔로의 식탁</h1> </header> <section id="menus"> <div id="menu1"><h2>밥/죽</h2></div> <div id="menu2"><h2>국/찌개</h2></div> <div id="menu3"><h2>반찬</h2></div> <div id="menu4"><h2>일품요리</h2></div> <div id="menu5"><h2>음료/칵테일</h2></div> </section> <footer><p>솔로의 식탁</p></footer> </div> </body> </html>
실제 출력 미리보기 (PC 너비)
솔로의 식탁

밥/죽

국/찌개

반찬

일품요리

음료/칵테일

솔로의 식탁

용어 핵심 키워드
시맨틱 태그의미가 있는 태그 — header, section, footer 등
<link>외부 CSS 파일 연결 — head 안에 작성
box-sizing: border-boxpadding·border 포함해서 width 계산
position: relative/absolute자식의 절대 위치 기준점/실제 절대 위치
background: url(...)CSS로 div에 배경 이미지 깔기
background-size: cover박스를 꽉 채우도록 이미지 확대 — 잘리는 부분 발생
@media미디어 쿼리 — 화면 너비별 다른 CSS 적용
display: flex자식 요소를 가로로 정렬하는 플렉스 레이아웃
flex-wrap: wrap자식이 넘치면 다음 줄로 줄바꿈
justify-contentflex 자식의 가로 정렬 방식

1 외부 CSS — <link>로 분리

HTML에 <style>로 직접 쓰지 않고 별도의 .css 파일에 모은 뒤 <link>로 가져온다. 이 사이트는 css/style-result-1.css에 모든 스타일이 들어 있다.

<link rel="stylesheet" href="css/style-result-1.css">
내부 <style> (인라인)
  • HTML 안에 직접 작성
  • 한 페이지에서만 쓰는 작은 스타일
  • 여러 페이지에 동일한 코드 중복
외부 .css + <link>
  • HTML과 분리 → 유지보수 용이
  • 여러 페이지에서 공유
  • 브라우저가 캐시 → 재방문 시 빠름
📌 실무 기준 — 3페이지 이상 또는 30줄 이상 스타일이라면 외부 CSS로 빼는 게 표준이다.

2 시맨틱 태그 — 의미가 있는 골격

본문은 <header>, <section>, <footer> 같은 의미가 있는 태그로 구성된다. 모두 <div>로 만들 수도 있지만 시맨틱 태그를 쓰면 검색엔진·스크린리더가 구조를 이해할 수 있다.

태그 역할 이 코드에서
<header> 페이지·섹션의 머리말 "솔로의 식탁" 큰 제목
<section> 의미 단위 블록 id="menus" — 메뉴 카드 묶음
<footer> 페이지·섹션의 꼬리말 저작권 / 사이트명
<div id="container"> 전체 묶는 일반 컨테이너 너비 100% 잡고 모든 내용 감쌈
id="notice"인 빈 section은 원본에 있지만 내용이 없다. 실제 운영 시 공지·새 글 등을 넣을 자리. 빈 채로 두면 화면에 안 보이지만 SEO·접근성 관점에서는 채우는 게 좋다.

3 박스 모델 리셋 — * 셀렉터

모든 요소의 기본 margin·padding을 0으로 만들고 box-sizing: border-box를 적용한다. 이게 CSS의 첫 줄이다.

* { margin: 0; padding: 0; box-sizing: border-box; }
※ 왜 이렇게 시작하는가
  • 브라우저마다 <h1>·<p>의 기본 여백이 미묘하게 다름
  • 모두 0으로 리셋해야 디자이너가 의도한 대로 정확하게 그려짐
  • border-box: 너비 계산이 직관적 — width: 100%면 padding·border 포함해서 정확히 100%
content-box (기본)
너비 100% + padding 20px → 실제 차지 너비는 100% + 40px → 가로 스크롤 발생
border-box
너비 100% + padding 20px → 정확히 100% 안에 padding이 포함됨 → 레이아웃 안정

 

반응형

 

4 메뉴 카드 — 배경 이미지 + 텍스트 위치
#menus > div { position: relative; /* 자식 absolute 기준점 */ height: 400px; border: 1px solid black; margin-bottom: 15px; } #menu1 { background: url("../images/dish1.jpg") no-repeat center; background-size: cover; } #menus h2 { position: absolute; /* 부모 카드 기준 절대 위치 */ right: 3%; bottom: 10px; color: white; text-shadow: 3px 3px 5px black; }
position relative + absolute 패턴 — 메뉴 카드(부모)에 relative를 주고, 안의 <h2>(자식)에 absolute를 주면, h2가 "가장 가까운 relative 부모" 기준으로 우측 하단에 고정된다. 화면 크기가 바뀌어도 카드의 우측 하단을 그대로 따라간다.
background-size: cover

이미지가 박스보다 크든 작든 박스를 가득 채우도록 자동 확대/축소한다. 비율은 유지되므로 일부가 잘릴 수 있다. 음식 사진처럼 "박스에 꽉 차야 예쁜" 경우에 적합하다.

../images/dish1.jpg../"한 단계 위 폴더"를 가리킨다. CSS는 css/ 폴더 안에 있고, 이미지는 images/ 폴더에 있어서 한 번 위로 올라가야 한다.

5 반응형 — @media 미디어 쿼리

화면 너비에 따라 메뉴 배치가 바뀐다. 이 사이트는 3단계 분기를 사용한다.

너비 레이아웃 menu1~4 menu5
~767px (모바일) 1열 100% 100%
768~991px (태블릿) 2열 49%씩 100% (한 줄 차지)
992px~ (PC) 3열 33%씩 3개 flex: 2 → menu4와 함께 둘째 줄
@media all and (min-width: 768px) { #menus { display: flex; flex-wrap: wrap; justify-content: space-between; } #menu1, #menu2, #menu3, #menu4 { width: 49%; } #menu5 { width: 100%; } } @media all and (min-width: 992px) { #menu1, #menu2, #menu3, #menu4, #menu5 { width: 33%; } #menu5 { flex: 2 2 0; } }
~767px (모바일)
 
 
 
 
 
768~991px
 
 
 
 
 
992px~
 
 
 
 
 
※ min-width로 분기하는 이유 (모바일 퍼스트)
  • 기본 스타일은 모바일(가장 좁은 화면) 기준으로 작성
  • min-width: 768px는 "768px 이상이면 추가 적용"이라는 뜻
  • 화면이 커질수록 스타일이 누적 → 모바일 코드가 가장 단순하고 빠름

6 justify-content: space-between

flex 컨테이너 안에서 첫 자식은 왼쪽 끝, 마지막 자식은 오른쪽 끝에 붙이고, 사이에는 균등 간격을 자동으로 둔다. 이 사이트는 메뉴를 49%씩 두 개 배치하면서 사이의 2% 간격을 자동으로 만든다.

[ menu1 49% ] 2% [ menu2 49% ] ← 한 줄 [ menu3 49% ] 2% [ menu4 49% ] ← 다음 줄 (wrap) [ menu5 100% ] ← 셋째 줄
flex: 2 2 0"남은 공간을 2배로 차지"는 뜻. PC에서 menu5가 menu4보다 두 배 넓게 자라도록 한 설정이다.

7 푸터 텍스트 세로 가운데 — line-height 트릭
footer { height: 200px; background: #373737; } footer p { line-height: 200px; /* footer 높이와 같게 → 세로 가운데 */ text-align: center; /* 가로 가운데 */ }
📌 line-height = 박스 높이 트릭 — 한 줄짜리 텍스트를 박스의 세로 중앙에 두는 가장 간단한 방법. 줄이 두 줄 이상이면 깨지므로 다음 단계는 flex(display: flex; align-items: center;)로 해결한다.

8 화면이 그려지는 흐름
1) HTML 파싱 → <link>로 외부 CSS 다운로드 시작 2) CSS의 *{margin:0;padding:0;border-box} 적용 — 모든 기본값 리셋 3) #container 너비 100% — 화면 전체 4) header → h1 가운데, 폰트 크기 3em 5) #menus → 안의 div들이 1열로 쌓임 (모바일 기본) 6) 각 div → 배경 이미지 깔리고 cover로 채워짐 7) h2 → 카드 우측 하단(absolute)에 흰 글씨로 표시 8) footer → 어두운 회색 바, 흰 글씨로 사이트명 9) [화면 768px↑] → @media 발동 → flex로 2열 재배치 10) [화면 992px↑] → 다시 발동 → 3열, menu5는 2배 폭

9 자주 하는 실수
실수 증상 해결
외부 CSS 경로 오타 스타일이 전혀 안 먹음 F12로 콘솔에서 404 확인 → 경로 수정
이미지 경로 ../ 누락 배경이 비어 보임 CSS 위치 기준 상대 경로 다시 확인
position: absolute만 줌 h2가 화면 전체 기준으로 떠다님 부모에 position: relative 필수
max-width 대신 width: 768px로 분기 의도와 반대로 동작 모바일 퍼스트는 min-width 사용
vendor prefix 빼먹음 구형 브라우저(IE10 등)에서 깨짐 요즘은 PostCSS·Autoprefixer가 자동 처리
line-height 가운데 정렬을 두 줄에도 적용 둘째 줄이 박스 밖으로 빠짐 두 줄 이상은 flex + align-items 사용

핵심 한 줄 요약

link[rel=stylesheet]외부 CSS 연결 — 유지보수·캐시 측면에서 표준
시맨틱 골격header / section / footer로 의미 있는 구조
* {margin:0;padding:0;border-box}CSS 첫 줄 — 브라우저 차이 리셋 + 너비 계산 안정
relative + absolute부모에 relative 자식에 absolute → 카드 안 위치 고정
background-size: cover박스를 꽉 채우도록 이미지 자동 확대 (일부 잘림)
@media min-width모바일 퍼스트 — 화면 커질수록 스타일 누적
flex + space-between자식 49%씩 양쪽 끝 정렬 → 사이 간격 자동
line-height = height한 줄 텍스트 세로 가운데 정렬 트릭

Tags

#시맨틱태그 #header #section #footer #외부CSS #모바일퍼스트 #미디어쿼리 #flex #space-between #position #background-size #line-height #카드레이아웃 #CSS #HTML #웹개발 #티스토리
▼ 티스토리 태그 입력란 복사용
시맨틱태그, header, section, footer, 외부CSS, 모바일퍼스트, 미디어쿼리, flex, space-between, position, background-size, cover, line-height, 카드레이아웃, CSS, HTML, 웹개발, 티스토리
반응형

댓글