Skip to content

CSS 기초 더덕마켓 클론코딩 250625 ​

💡

CSS는 사실 이론보다 직접 코드를 작성하는 것이 가장 큰 도움이 된다! 눈으로 결과를 확인하고 수정하는 연습이 필요하다.

1. CSS 소개 및 기본 문법 ​

CSS(Cascading Style Sheets) ​

  • CSS는 HTML 문서에 스타일을 지정하기 위한 언어이다. 태그들이 중첩되어 구성된 HTML 구조에 대해, 색상, 크기, 배치 등 시각적 표현을 추가하며, 스타일이 겹칠 경우에는 우선순위 규칙에 따라(Cascading) 적용됩니다.

문법 ​

less
선택자 {
  속성명: 속성값;
}

// 예시
p {
  color: red;
}

주석 ​

css
/* 주석의 내용 */

2. CSS 문서 사용 ​

HTML 문서에 CSS 문서를 적용하는 방법은 다음과 같이 3가지가 있다.

인라인 스타일 (Inline Style) ​

html
<p style="color: red;">인라인 스타일 예시</p>
  • HTML 태그의 style 속성에 직접 스타일을 작성하는 방식
  • 특정 요소에 빠르게 스타일을 줄 때 사용하지만 유지보수에는 좋지 않음

내부 스타일 시트 (Internal Style Sheet) ​

html
<head>
  <style>
    p {
      color: blue;
    }
  </style>
</head>
  • head 안에 style 태그를 사용하여 CSS를 작성
  • 별도 파일 없이 적용 가능하지만, 여러 페이지에 적용하긴 어려움

외부 스타일 시트 (External Style Sheet) ​

html
<head>
  <link rel="stylesheet" href="style.css" />
</head>
  • 별도의 .css 파일에 스타일을 작성하고 link 태그로 연결
  • 대부분의 웹사이트에서 많이 사용하는 방식이고 유지보수, 재사용성, 협업에 유리함

3. 선택자 ​

less
선택자
├── 기본 선택자
│   ├── 전체 선택자: *
│   ├── 태그 선택자: div, p, h1 등
│   ├── 클래스 선택자: .classname
│   └── ID 선택자: #id
│
├── 결합자 (Combinators)
│   ├── 후손 선택자: A B (A 요소의 모든 후손 B)
│   ├── 자식 선택자: A > B (A 요소의 직계 자식 B)
│   ├── 인접 형제 선택자: A + B (A 요소 바로 뒤에 오는 형제 B)
│   └── 일반 형제 선택자: A ~ B (A 요소 뒤에 나오는 형제 B들)
│
├── 속성 선택자
│   ├── [attr]               : 특정 속성이 존재하는 요소
│   ├── [attr="value"]       : 속성값이 정확히 일치하는 요소
│   ├── [attr~="value"]      : 공백으로 구분된 속성값 중 하나가 일치
│   ├── [attr|="value"]      : 하이픈(-)으로 구분된 접두어가 일치
│   ├── [attr^="value"]      : 특정 값으로 시작하는 속성값
│   ├── [attr$="value"]      : 특정 값으로 끝나는 속성값
│   └── [attr*="value"]      : 특정 값을 포함하는 속성값
│
└── 기타 선택자 (의사 클래스 등)
    ├── 상태 선택자: :hover, :focus, :checked, :disabled, :enabled, :active 등
    ├── 구조 선택자: :first-child, :last-child, :nth-child(n), :not() 등
    └── 의사 요소 선택자: ::before, ::after 등

선택자 ​

css
/* 태그 선택자 */
p {
  color: blue;
}

/* 클래스 선택자 */
.highlight {
  background-color: yellow;
}

/* ID 선택자 */
#main-title {
  font-size: 30px;
  font-weight: bold;
}

/* 전체 선택자 */
* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

/* 그룹 선택자 */
h1,
h2,
h3 {
  font-weight: bold;
  color: darkslategray;
}

/* 자식 선택자 */
ul > li {
  list-style-type: none;
  padding-left: 10px;
}

/* 후손 선택자 */
div p {
  margin-bottom: 10px;
  line-height: 1.5;
}

/* 속성 선택자 */
input[type="checkbox"] {
  width: 20px;
  height: 20px;
}
a[href^="https"] {
  color: green;
}
img[src$=".png"] {
  border: 2px solid red;
}
[title*="cat"] {
  background-color: yellow;
}

/* 의사 클래스 */
a:hover {
  color: red;
  text-decoration: underline;
}

/* 의사 요소 */
p::first-letter {
  font-size: 2em;
  font-weight: bold;
  color: darkblue;
}

우선순위 ​

  1. !important
  2. 인라인 스타일
  3. ID 선택자
  4. 클래스/속성/의사 클래스 선택자
  5. 태그 선택자, 의사 요소
  6. 전체 선택자 *

4. 박스 모델 (Box Model) ​

CSS 박스 모델(Box Model)은 HTML 요소가 화면에 표시될 때, 그 요소가 차지하는 공간을 네 가지 영역으로 나누어 설명하는 개념이다. CSS에서 모든 요소는 실제로 하나의 직사각형 박스 형태로 렌더링되며, width와 height를 명시하지 않더라도 박스 모델은 항상 적용된다.

css
┌───────────────────────────────┐
│            Margin             │
│  ┌───────────────────────────┐│
│  │          Border           ││
│  │   ┌─────────────────────┐ ││
│  │   │       Padding       │ ││
│  │   │   ┌───────────────┐ │ ││
│  │   │   │    Content    │ │ ││
│  │   │   └───────────────┘ │ ││
│  │   └─────────────────────┘ ││
│  └───────────────────────────┘│
└───────────────────────────────┘
  • Content: 실제 내용이 들어가는 영역 (텍스트, 이미지 등)
  • Padding: 콘텐츠와 테두리 사이의 내부 여백
  • Border: 요소의 테두리,
  • Margin: 요소 바깥 여백, 다른 요소와의 거리 조절

박스 모델 확인 방법 (chrome) ​

  1. 웹 페이지에서 확인하고 싶은 요소에 마우스 오른쪽 클릭 -> 검사 선택
  2. 개발자 도구 패널에서 해당 요소를 선택한 상태로 보면, 하단에 박스 모델 시각화 영역이 나온다.

테두리 스타일 ​

CSS 테두리(Border)는 요소의 박스 모델 중 padding과 margin 사이에 위치하며, 요소를 시각적으로 감싸거나 강조하는 데 사용되는 시각적 구분선이다.

border를 설정하는 속성들 ​

css
border: 2px solid black;
border-width: 2px;
border-style: solid;
border-color: red;
  • border: width, style, color를 한 줄로 축약하여 지정
  • border-width: 테두리의 두께를 지정
  • border-style: 테두리의 스타일을 지정
  • border-color: 테두리의 색상을 지정
  • border-top, border-right, border-bottom, border-left: 각 방향의 테두리를 따로 지정

요소의 모서리를 둥글게 ​

css
border-radius: 20px;
border-radius: 20%;

/* 방향별로 다르게 지정 */
border-radius: 10px 20px 30px 40px;
  • 요소의 모서리(corner)를 둥글게 만들기 위해 사용하는 속성이다. 값을 주면 각 모서리가 해당 반지름만큼 둥글게 처리된다.

여백 ​

CSS에서 여백은 요소의 안팎에 존재하는 공간을 의미하며, margin은 바깥 여백, padding은 안쪽 여백을 조절하는 속성이다.


여백 지정 ​

css
/* 모든 면에 동일한 값을 지정 */
margin: 10px;

/* 위아래 여백, 왼오 여백의 값 따로 지정 */
margin: 10px 20px;

/* 위, 왼오, 아래 여백의 값 따로 지정 */
margin: 10px 20px 15px;

/* 위, 오, 아래, 왼 여백의 값 따로 지정 */
margin: 10px 20px 30px 40px;
  • 박스 모델의 여백에는 네 개의 면이 존재하고, 속성값 사용 개수에 따라 네 면의 여백 크기를 다르게 지정할 수 있다.

box-sizing ​

요소의 width와 height가 어떤 영역까지 포함하는지를 결정하는 CSS 속성이다. 기본값은 content-box이다.

css
box-sizing: content-box | border-box;
  • content-box: width, height는 content 영역만 포함한다. padding과 border는 별도로 더해져 최종 크기가 커진다.
  • border-box: width, height가 content + padding + border 전체를 포함한다. 박스의 총 크기가 지정한 값 안에 딱 맞게 유지된다.

css
* {
  box-sizing: border-box;
}
  • border-box를 리셋 스타일로 지정하고 많이 사용한다. 예상한 대로 레이아웃이 유지되고, grid, flex 등 레이아웃 구성 시 크기 계산이 편리하기 때문이다.

배경 ​

CSS에서 background는 요소의 배경을 설정하는 데 사용하는 속성이다.
박스 모델 기준으로, 배경에 설정된 색상이나 이미지는 margin(바깥 여백)을 제외한 border, padding, content 영역 안에서만 표시된다. 배경은 단순한 색상부터 이미지, 그라데이션, 반복, 위치 설정 등 다양한 시각 효과를 지정할 수 있다.

css
.box {
  /* 배경 색상 지정 */
  background-color: #f0f0f0;

  /* 요소의 배경 이미지 지정 */
  background-image: url("/");

  /* 요소 내 배경의 적용 범위  */
  background-clip: padding-box;

  /* 요소 내 배경의 시작 위치 */
  background-origin: content-box;

  /* 배경 이미지의 크기 */
  background-size: cover;
  background-size: 100px 100px;

  /* 배경 이미지의 위치 */
  background-position: center;

  /* 배경 이미지의 반복 패턴 */
  background-repeat: no-repeat;
}

5. 색상 지정 방법 ​

color ​

글자 색을 지정할 때는 color 속성을 사용하며, 색상을 지정하는 방법은 글자 색, 테두리 색, 배경 색 모두 동일하게 적용된다.

css
/* 16진수 */
color: #ff0000;

/* RGB(red, green, blue) */
color: rgb(255, 0, 0);

/* rgba(투명도를 추가 지정) */
color: rgba(255, 0, 0, 0.8);

/* HSL(색조, 채도, 조도) */
color: hsl(0, 100%, 50%);

6. 텍스트 꾸미기 ​

글꼴 바꾸기 ​

css
font-family: Arial, Helvetica, sans-serif;
  • font-family는 CSS에서 글꼴(폰트) 종류를 지정하는 속성이다.
  • 한 개 이상의 글꼴을 지정할 수 있고, 가장 먼저 쓰여진 글꼴부터 우선적으로 요소에 적용된다.

웹 폰트 사용하기 ​

html
<link
  href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR&display=swap"
  rel="stylesheet"
/>
css
font-family: "Noto Sans KR", sans-serif;
  • 웹폰트는 사용자의 컴퓨터에 해당 글꼴이 설치되어 있지 않더라도, 웹 서버로부터 글꼴 파일을 불러와 적용할 수 있는 폰트이다.
  • 사용 방법은 간단하며, HTML의 head 태그에 link 태그를 추가하고, CSS에서 font-family 속성으로 적용하면 된다.

텍스트 꾸미기 ​

css
/* 글자 크기 */
font-size: 18px;

/* 글자 두께 */
font-weight: 600;

/* 줄 간격 */
line-height: 1.6;

/* 텍스트 정렬 */
text-align: center;

/* 텍스트 장식 */
text-decoration: underline;

텍스트 단위 ​

  • rem: 루트 요소의 글자 크기를 배수로 계산해 적용하는 상대 단위
  • em: 부모 요소의 글자 크기를 배수로 계산해 적용하는 상대 단위

7. 요소의 유형 display ​

  • 블록 요소: 자신이 속한 부모 요소의 가로 너비 전체를 차지하며, 항상 새 줄에서 시작해 하나의 블록을 형성한다.
  • 인라인 요소: 자신의 콘텐츠 크기만큼만 공간을 차지하며, 줄바꿈 없이 다른 요소들과 한 줄에 나란히 배치된다.

display ​

  • display 속성은 박스 유형을 정의하는 속성으로, 해당 요소가 블록, 인라인, 플렉스, 그리드 등 어떤 레이아웃 흐름을 따를지를 결정한다.
css
/* 블록 요소로 표시 */
.box {
  display: block;
}

/* 인라인 요소로 표시 */
.inline-text {
  display: inline;
}

/* 요소를 인라인처럼 나란히 배치하면서도, 블록 요소처럼 width와 height 설정이 가능하게 함*/
.card {
  display: inline-block;
}

/* 자식 요소들을 가로로 유연하게 배치 */
.navbar {
  display: flex;
}

8. 문서의 흐름 float ​

CSS의 float 속성은 요소를 문서의 흐름에서 띄워서 부모 요소 또는 루트 요소를 기준으로 위치를 변경한다. 최근에는 flex, grid를 많이 사용한다.

css
img {
  float: left | right | none | inherit;
}

float의 역효과를 방지하기 ​

html
<div class="container clearfix">
  <div class="left" style="float: left;">왼쪽</div>
  <div class="right" style="float: right;">오른쪽</div>
</div>
css
.clearfix::after {
  content: "";
  display: block;
  clear: both;
}
  • float 속성이 적용된 요소를 흔히 "플로팅 요소" 또는 "부동 요소"라고 부른다.
  • 플로팅 요소는 문서 흐름에서 벗어나며, 다른 요소의 공간까지 침범하게 되어 예상치 못한 레이아웃 문제를 일으킬 수 있다.
  • 이러한 문제를 방지하기 위해 사용하는 속성이 clear이며, clear: both를 적용하면 플로팅 요소의 영향을 받지 않고 아래쪽에 정상적으로 배치된다.

위치 지정하기 position ​

HTML 요소의 위치 지정 방식을 정의하는 속성이다. top, right, bottom, left 속성과 함께 사용하여 기준 위치로부터 얼마나 떨어진 위치에 배치할지를 결정한다.

css
/* 1. 기본값 - 문서 흐름에 따라 자동 배치 */
.static-box {
  position: static;
  background: #eee;
}

/* 2. 상대 위치 - 원래 위치를 기준으로 이동 (공간은 그대로 차지) */
.relative-box {
  position: relative;
  top: 20px;
  left: 20px;
}

/* 3. 절대 위치 - 가장 가까운 position이 지정된 조상 요소 기준 */
.absolute-container {
  position: relative; /* 기준이 되는 부모 요소 */
  height: 200px;
}
.absolute-box {
  position: absolute;
  top: 10px;
  right: 10px;
}

/* 4. 고정 위치 - 브라우저 화면 기준으로 고정 (스크롤해도 고정) */
.fixed-box {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
}

/* 5. 스티키 - 스크롤 시 특정 위치에서 고정됨 (부모 안에서만 동작) */
.sticky-box {
  position: sticky;
  top: 0;
}

겹치거나 넘치는 요소 다루기 z-index, overflow ​

z-index ​

css
.box1 {
  position: absolute;
  z-index: 1; /* 아래에 깔림 */
}

.box2 {
  position: absolute;
  z-index: 10; /* 더 위로 올라옴 */
}
  • z-index 속성은 요소의 쌓임 순서를 정의할 수 있다. 겹치는 요소들 사이에서 누가 위에 올 것인지를 결정한다. position 속성이 relative, absolute, fixed, sticky 등으로 지정된 요소에만 적용된다.
  • 숫자가 클수록 위로 올라가고, 동일한 z-index 값이면, HTML 구조상 나중에 선언된 요소가 위에 나온다.

overflow ​

css
.container {
  width: 300px;
  height: 100px;
  overflow: auto;
}
  • 요소 안의 내용이 width나 height보다 많아질 경우, 넘치는 콘텐츠를 어떻게 처리할지를 지정한다.
  • auto: 내용이 넘칠 경우에만 스크롤바 표시
  • scroll: 항상 스크롤바 표시 (내용이 넘치지 않아도)
  • visible: 기본값. 넘치는 콘텐츠 그대로 보임 (잘리지 않음)
  • hidden: 넘치는 콘텐츠는 숨김 (잘려서 안 보임)