λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Stylesheet/CSS

[CSS3]CSS CSS μœ„μΉ˜ 속성 μ™„λ²½ κ°€μ΄λ“œ: position, z-index, float, clear

by YJ Dev 2024. 5. 28.
728x90
λ°˜μ‘ν˜•
SMALL

CSS μœ„μΉ˜ 속성은 νŽ˜μ΄μ§€ λ ˆμ΄μ•„μ›ƒμ„ λ””μžμΈν•  λ•Œ 맀우 μ€‘μš”ν•œ 역할을 ν•©λ‹ˆλ‹€. 이번 κΈ€μ—μ„œλŠ” position z-index, float, clear와 같은 μ£Όμš” CSS 속성을 깊이 있게 닀루어 λ³΄κ² μŠ΅λ‹ˆλ‹€.

css μœ„μΉ˜ 속성

position μ†μ„±πŸ“

position 속성은 HTML μš”μ†Œμ˜ μœ„μΉ˜λ₯Ό μ§€μ •ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€. κΈ°λ³Έ 값은 static이며, 이외에도 relative, absolute, fixed, sticky와 같은 값이 μžˆμŠ΅λ‹ˆλ‹€.

static

  • λͺ¨λ“  HTML μš”μ†Œμ˜ κΈ°λ³Έκ°’μž…λ‹ˆλ‹€. 이 속성을 μ„€μ •ν•˜λ©΄ μš”μ†ŒλŠ” λ¬Έμ„œμ˜ 정상 흐름에 따라 배치되며, top, right, bottom, left와 같은 μœ„μΉ˜ 속성은 λ¬΄μ‹œλ©λ‹ˆλ‹€.
.element {
    position: static;
}

예제

<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <title>Position Static Example</title>
  <style>
    .static {
      position: static;
      width: 100px;
      height: 100px;
      background-color: red;
    }
  </style>
</head>
<body>
  <div class="static">Static</div>
</body>
</html>

κ²°κ³Ό: 빨간색 λ°•μŠ€κ°€ κΈ°λ³Έ 흐름에 따라 λ°°μΉ˜λ©λ‹ˆλ‹€.

relative

  • μš”μ†Œλ₯Ό λ¬Έμ„œμ˜ 정상 흐름에 따라 λ°°μΉ˜ν•œ ν›„, top, right, bottom, left 속성을 μ‚¬μš©ν•˜μ—¬ μžμ‹ μ„ κΈ°μ€€μœΌλ‘œ μ΄λ™μ‹œν‚΅λ‹ˆλ‹€.
  • 이동은 μ›λž˜ μœ„μΉ˜λ₯Ό κΈ°μ€€μœΌλ‘œ ν•˜λ©°, μš”μ†Œμ˜ μ›λž˜ μœ„μΉ˜λŠ” μ—¬μ „νžˆ λ¬Έμ„œμ˜ 흐름에 영ν–₯을 λ―ΈμΉ©λ‹ˆλ‹€.
  • top: μœ„μͺ½μ„ κΈ°μ€€μœΌλ‘œ μ’Œν‘œκ°’μ„ μ§€μ •ν•©λ‹ˆλ‹€.
  • right: 였λ₯Έμͺ½μ„ κΈ°μ€€μœΌλ‘œ μ’Œν‘œκ°’μ„ μ§€μ •ν•©λ‹ˆλ‹€.
  • bottom: μ•„λž˜μͺ½μ„ κΈ°μ€€μœΌλ‘œ μ’Œν‘œκ°’μ„ μ§€μ •ν•©λ‹ˆλ‹€.
  • left: μ™Όμͺ½μ„ κΈ°μ€€μœΌλ‘œ μ’Œν‘œκ°’μ„ μ§€μ •ν•©λ‹ˆλ‹€.
.element {
    position: relative;
    top: 10px;
    left: 20px;
}

예제

<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <title>Position Relative Example</title>
  <style>
    .relative {
      position: relative;
      top: 20px;
      left: 20px;
      width: 100px;
      height: 100px;
      background-color: blue;
    }
  </style>
</head>
<body>
  <div class="relative">Relative</div>
</body>
</html>

κ²°κ³Ό: νŒŒλž€μƒ‰ λ°•μŠ€κ°€ μ›λž˜ μœ„μΉ˜μ—μ„œ 20px μ•„λž˜, 20px 였λ₯Έμͺ½μœΌλ‘œ μ΄λ™ν•©λ‹ˆλ‹€.

absolute

  • μš”μ†ŒλŠ” λ¬Έμ„œμ˜ 정상적인 νλ¦„μ—μ„œ 제거되며, κ°€μž₯ κ°€κΉŒμš΄ 쑰상 μš”μ†Œ 쀑 position 속성이 relative, absolute, fixed, λ˜λŠ” sticky둜 μ„€μ •λœ μš”μ†Œλ₯Ό κΈ°μ€€μœΌλ‘œ λ°°μΉ˜λ©λ‹ˆλ‹€.
  • 쑰상 μš”μ†Œκ°€ μ—†λ‹€λ©΄, 초기 μ»¨ν…Œμ΄λ‹ 블둝(<html>)을 κΈ°μ€€μœΌλ‘œ λ°°μΉ˜λ©λ‹ˆλ‹€.
.element {
    position: absolute;
    top: 50px;
    left: 100px;
}

예제

<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <title>Position Absolute Example</title>
  <style>
    .relative-parent {
      position: relative;
      width: 200px;
      height: 200px;
      background-color: lightgray;
    }
    .absolute {
      position: absolute;
      top: 30px;
      left: 30px;
      width: 100px;
      height: 100px;
      background-color: green;
    }
  </style>
</head>
<body>
  <div class="relative-parent">
    <div class="absolute">Absolute</div>
  </div>
</body>
</html>

κ²°κ³Ό: νšŒμƒ‰ λ°•μŠ€ 내에 μžˆλŠ” 녹색 λ°•μŠ€κ°€ νšŒμƒ‰ λ°•μŠ€λ₯Ό κΈ°μ€€μœΌλ‘œ 30px μ•„λž˜, 30px 였λ₯Έμͺ½μ— λ°°μΉ˜λ©λ‹ˆλ‹€.

fixed

  • μš”μ†ŒλŠ” λ¬Έμ„œμ˜ 정상적인 νλ¦„μ—μ„œ 제거되며, 뷰포트λ₯Ό κΈ°μ€€μœΌλ‘œ λ°°μΉ˜λ©λ‹ˆλ‹€. μŠ€ν¬λ‘€ν•΄λ„ μš”μ†Œμ˜ μœ„μΉ˜λŠ” λ³€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
.element {
    position: fixed;
    top: 0;
    right: 0;
}

예제

<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <title>Position Fixed Example</title>
  <style>
    .fixed {
      position: fixed;
      top: 0;
      left: 0;
      width: 100px;
      height: 100px;
      background-color: orange;
    }
    .content {
      height: 2000px;
    }
  </style>
</head>
<body>
  <div class="fixed">Fixed</div>
  <div class="content"></div>
</body>
</html>

κ²°κ³Ό: 주황색 λ°•μŠ€κ°€ ν™”λ©΄μ˜ μ™Όμͺ½ 상단에 κ³ μ •λ˜μ–΄ μŠ€ν¬λ‘€ν•΄λ„ μœ„μΉ˜κ°€ λ³€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

sticky

  • μš”μ†ŒλŠ” 슀크둀 μœ„μΉ˜μ— 따라 relative와 fixed 사이λ₯Ό μ „ν™˜ν•©λ‹ˆλ‹€. μš”μ†Œκ°€ μ»¨ν…Œμ΄λ„ˆ λ‚΄μ—μ„œ νŠΉμ • 슀크둀 μœ„μΉ˜μ— λ„λ‹¬ν•˜λ©΄ fixed처럼 μž‘λ™ν•˜κ³ , 그렇지 μ•ŠμœΌλ©΄ relative처럼 μž‘λ™ν•©λ‹ˆλ‹€.
.element {
    position: sticky;
    top: 0;
}

예제

<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <title>Position Sticky Example</title>
  <style>
    .sticky {
      position: sticky;
      top: 0;
      width: 100%;
      height: 50px;
      background-color: purple;
    }
    .content {
      height: 2000px;
      background-color: lightgray;
    }
  </style>
</head>
<body>
  <div class="sticky">Sticky</div>
  <div class="content"></div>
</body>
</html>

κ²°κ³Ό: 보라색 λ°•μŠ€κ°€ 슀크둀 μ‹œ νŽ˜μ΄μ§€ 상단에 κ³ μ •λ˜λ©°, λ‹€λ₯Έ μš”μ†Œκ°€ μœ„λ‘œ μ§€λ‚˜κ°ˆ λ•ŒκΉŒμ§€ μœ„μΉ˜λ₯Ό μœ μ§€ν•©λ‹ˆλ‹€.

position: absolute와 position: fixed의 차이점❓

  • position: absoluteλŠ” κ°€μž₯ κ°€κΉŒμš΄ position: relative λΆ€λͺ¨ μš”μ†Œλ₯Ό κΈ°μ€€μœΌλ‘œ 배치되고, position: fixedλŠ” ν™”λ©΄(viewport)을 κΈ°μ€€μœΌλ‘œ λ°°μΉ˜λ˜μ–΄ 슀크둀 μ‹œμ—λ„ μœ„μΉ˜κ°€ λ³€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

z-index μ†μ„±πŸ—‚οΈ

μ •μ˜μ™€ μ‚¬μš© λͺ©μ 

z-index 속성은 μš”μ†Œμ˜ μŒ“μž„ μˆœμ„œλ₯Ό μ„€μ •ν•˜μ—¬, μš”μ†Œλ“€μ΄ μ„œλ‘œ 겹쳀을 λ•Œ μ–΄λ–€ μš”μ†Œκ°€ μ•žμ— 보일지 κ²°μ •ν•©λ‹ˆλ‹€. position 속성이 relative, absolute, fixed, sticky 쀑 ν•˜λ‚˜μ—¬μ•Ό μ μš©λ©λ‹ˆλ‹€.

μŒ“μž„ λ§₯락(Stacking Context)

μŒ“μž„ λ§₯락은 z-index 값에 μ˜ν•΄ μƒμ„±λ˜λ©°, λΆ€λͺ¨ μš”μ†Œμ— μ˜ν•΄ ν˜•μ„±λ©λ‹ˆλ‹€. λ™μΌν•œ μŒ“μž„ λ§₯락 λ‚΄μ—μ„œλŠ” z-index 값이(1~9999 μ‚¬μ΄μ˜ 숫자 κ°’) 높은 μš”μ†Œκ°€ μ•žμ— ν‘œμ‹œλ©λ‹ˆλ‹€.

예제

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Z-index Example</title>
<style>
  .box {
    width: 200px;
    height: 200px;
    position: absolute;
  }

  #box1 {
    background-color: red;
    top: 50px;
    left: 50px;
    z-index: 1;
  }

  #box2 {
    background-color: blue;
    top: 100px;
    left: 100px;
    z-index: 2;
  }

  #box3 {
    background-color: green;
    top: 150px;
    left: 150px;
    z-index: 3;
  }
</style>
</head>
<body>

<div class="box" id="box1"></div>
<div class="box" id="box2"></div>
<div class="box" id="box3"></div>

</body>
</html>

이 μ˜ˆμ œμ—μ„œλŠ” μ„Έ 개의 μ‚¬κ°ν˜• μƒμžλ₯Ό μƒμ„±ν•˜κ³  각 μƒμžμ˜ z-index 속성을 λ‹€λ₯΄κ²Œ μ„€μ •ν•©λ‹ˆλ‹€. λΉ¨κ°„ μƒμžλŠ” κ°€μž₯ μ•„λž˜μ— μŒ“μ΄κ³ (1), νŒŒλž€ μƒμžλŠ” κ·Έ μœ„μ— μŒ“μž…λ‹ˆλ‹€(2), λ§ˆμ§€λ§‰μœΌλ‘œ 녹색 μƒμžκ°€ κ°€μž₯ μœ„μ— μŒ“μž…λ‹ˆλ‹€(3). 이λ₯Ό 톡해 z-index 속성을 μ‚¬μš©ν•˜μ—¬ μš”μ†Œμ˜ μŒ“μž„ μˆœμ„œλ₯Ό μ‘°μ ˆν•˜λŠ” 방법을 이해할 수 μžˆμŠ΅λ‹ˆλ‹€.

float μ†μ„±πŸ„

float의 κΈ°λ³Έ κ°œλ…κ³Ό μ‚¬μš© 방법

float 속성은 μš”μ†Œλ₯Ό μ™Όμͺ½ λ˜λŠ” 였λ₯Έμͺ½μœΌλ‘œ λ–  있게 ν•˜μ—¬, ν…μŠ€νŠΈλ‚˜ 인라인 μš”μ†Œκ°€ κ·Έ μ£Όμœ„λ₯Ό λ‘˜λŸ¬μ‹Έλ„λ‘ ν•©λ‹ˆλ‹€.

img {
    float: left;
    margin-right: 10px; /* 이미지와 ν…μŠ€νŠΈ μ‚¬μ΄μ˜ 간격 쑰정을 μœ„ν•΄ μ‚¬μš©λ¨ */
}

μœ„μ™€ 같은 CSS μ½”λ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 이미지λ₯Ό ν…μŠ€νŠΈμ˜ μ™Όμͺ½μ— λ„μ›Œ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. 이제 이 μ΄λ―Έμ§€λŠ” μ™Όμͺ½μœΌλ‘œ λ„μ›Œμ§€κ³ , ν…μŠ€νŠΈκ°€ μ΄λ―Έμ§€μ˜ μš°μΈ‘μ— λ Œλ”λ§λ©λ‹ˆλ‹€.

속성 κ°’

float 속성은 λ‹€μŒκ³Ό 같은 값듀을 κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€:

  1. left: μš”μ†Œλ₯Ό μ™Όμͺ½μœΌλ‘œ λ„μ›λ‹ˆλ‹€.
  2. right: μš”μ†Œλ₯Ό 였λ₯Έμͺ½μœΌλ‘œ λ„μ›λ‹ˆλ‹€.
  3. none: μš”μ†Œλ₯Ό λ„μš°μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 이 값이 κΈ°λ³Έκ°’μž…λ‹ˆλ‹€.

float λ ˆμ΄μ•„μ›ƒμ„ μ‚¬μš©ν•  λ•Œμ˜ μž₯점과 단점

μž₯점:

  • ν…μŠ€νŠΈλ‚˜ 인라인 μš”μ†Œκ°€ ν”Œλ‘œνŒ… 된 μš”μ†Œμ˜ μ£Όμœ„λ₯Ό μžμ—°μŠ€λŸ½κ²Œ κ°μŒ€ 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 이미지와 ν…μŠ€νŠΈλ₯Ό ν•¨κ»˜ λ°°μΉ˜ν•  λ•Œ μœ μš©ν•©λ‹ˆλ‹€.

단점:

  • λΆ€λͺ¨ μš”μ†Œμ˜ 높이가 μžμ‹ μš”μ†Œλ₯Ό ν¬ν•¨ν•˜μ§€ μ•Šμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. 이 λ•Œλ¬Έμ— λΆ€λͺ¨ μš”μ†Œμ— λŒ€ν•œ 높이 쑰절이 ν•„μš”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • λ³΅μž‘ν•œ λ ˆμ΄μ•„μ›ƒμ—μ„œλŠ” ν”Œλ‘œνŠΈ μ†μ„±λ§ŒμœΌλ‘œλŠ” ν•œκ³„κ°€ μžˆμŠ΅λ‹ˆλ‹€.

floatλ₯Ό μ‚¬μš©ν•  λ•Œ λ°œμƒν•˜λŠ” λ ˆμ΄μ•„μ›ƒ 문제λ₯Ό μ–΄λ–»κ²Œ ν•΄κ²°ν•  수 μžˆλ‚˜μš”β“

  • ν”Œλ‘œνŒ…λœ μš”μ†Œλ₯Ό ν¬ν•¨ν•˜λŠ” λΆ€λͺ¨ μš”μ†Œμ— clearfix 클래슀λ₯Ό μ μš©ν•˜λ©΄, float둜 인해 λ°œμƒν•˜λŠ” λ ˆμ΄μ•„μ›ƒ 문제λ₯Ό ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

clear μ†μ„±πŸš«

float와 clear의 관계

clear 속성은 ν”Œλ‘œνŒ…λœ μš”μ†Œ μ˜†μ— λ‹€λ₯Έ μš”μ†Œκ°€ λ°°μΉ˜λ˜μ§€ μ•Šλ„λ‘ μ œμ–΄ν•©λ‹ˆλ‹€. 주둜 float 속성과 ν•¨κ»˜ μ‚¬μš©ν•˜μ—¬ λ ˆμ΄μ•„μ›ƒμ„ μ •λ¦¬ν•©λ‹ˆλ‹€.

clear 속성 κ°’

  1. none: μ•„λ¬΄λŸ° νŠΉλ³„ν•œ 처리λ₯Ό ν•˜μ§€ μ•ŠμŒ.
  2. left: float 된 μš”μ†Œκ°€ μ™Όμͺ½μ— μžˆμ„ λ•Œ ν•΄λ‹Ή μͺ½μ˜ float 영ν–₯을 μ œκ±°ν•©λ‹ˆλ‹€.
  3. right: float된 μš”μ†Œκ°€ 였λ₯Έμͺ½μ— μžˆμ„ λ•Œ ν•΄λ‹Ή μͺ½μ˜ float 영ν–₯을 μ œκ±°ν•©λ‹ˆλ‹€.
  4. both: μ–‘μͺ½(μ™Όμͺ½κ³Ό 였λ₯Έμͺ½)에 λͺ¨λ‘ float된 μš”μ†Œκ°€ μžˆμ„ λ•Œ μ–‘μͺ½μ˜ float 영ν–₯을 λͺ¨λ‘ μ œκ±°ν•©λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, λΆ€λͺ¨ μš”μ†Œ μ•ˆμ— float된 μš”μ†Œκ°€ μžˆλŠ” κ²½μš°μ— float된 μš”μ†Œμ˜ 영ν–₯을 λΆ€λͺ¨ μš”μ†Œμ˜ 높이에 영ν–₯을 λ―ΈμΉ˜μ§€ μ•Šκ²Œ ν•˜λ €λ©΄ clear 속성을 μ‚¬μš©ν•˜μ—¬ ν•΄λ‹Ή 영ν–₯을 μ œκ±°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <title>Float 속성과 Clear 속성 예제</title>
  <style>
    .clearfix::after {
      content: "";
      display: table;
      clear: both;
    }
    .float-left {
      float: left;
      width: 100px;
      height: 100px;
      background: red;
    }
    .float-right {
      float: right;
      width: 100px;
      height: 100px;
      background: blue;
    }
  </style>
</head>
<body>
  <div class="clearfix">
    <div class="float-left">Float Left</div>
    <div class="float-right">Float Right</div>
    <p>이 ν…μŠ€νŠΈλŠ” ν”Œλ‘œνŒ…λœ μš”μ†Œμ˜ μ£Όμœ„λ₯Ό λ‘˜λŸ¬μŒ‰λ‹ˆλ‹€.</p>
  </div>
</body>
</html>

μœ„ μ½”λ“œλŠ” clearfix ν΄λž˜μŠ€μ— 적용된 μš”μ†Œμ— λŒ€ν•΄ μ–‘μͺ½μœΌλ‘œ float된 μš”μ†Œλ“€μ˜ 영ν–₯을 λͺ¨λ‘ μ œκ±°ν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 λΆ€λͺ¨ μš”μ†Œκ°€ float된 μš”μ†Œμ˜ 높이에 영ν–₯을 받지 μ•Šκ³  μ œλŒ€λ‘œ λ ˆμ΄μ•„μ›ƒμ΄ ꡬ성될 수 μžˆμŠ΅λ‹ˆλ‹€.

μ’…ν•© μ˜ˆμ œπŸ’‘

μ•žμ„œ μ„€λͺ…ν•œ 속성듀을 μ’…ν•©ν•˜μ—¬ λ ˆμ΄μ•„μ›ƒμ„ ꡬ성해 λ³΄κ² μŠ΅λ‹ˆλ‹€.

<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>CSS μœ„μΉ˜ 속성 예제</title>
  <style>
    .container {
      width: 100%;
      border: 1px solid #ccc;
    }
    .header {
      position: relative;
      z-index: 2;
      background: #f1f1f1;
      padding: 10px;
      text-align: center;
    }
    .sidebar {
      float: left;
      width: 25%;
      background: #e1e1e1;
      height: 300px;
    }
    .content {
      float: right;
      width: 70%;
      background: #d1d1d1;
      height: 300px;
    }
    .footer {
      clear: both;
      background: #c1c1c1;
      padding: 10px;
      text-align: center;
    }
  </style>
</head>
<body>
  <div class="container">
    <div class="header">헀더 μ˜μ—­</div>
    <div class="sidebar">μ‚¬μ΄λ“œλ°” μ˜μ—­</div>
    <div class="content">컨텐츠 μ˜μ—­</div>
    <div class="footer">ν‘Έν„° μ˜μ—­</div>
  </div>
</body>
</html>

이 μ˜ˆμ œμ—μ„œλŠ” position, float, clear, z-index 속성을 ν™œμš©ν•˜μ—¬ κ°„λ‹¨ν•œ μ›ΉνŽ˜μ΄μ§€ λ ˆμ΄μ•„μ›ƒμ„ κ΅¬μ„±ν–ˆμŠ΅λ‹ˆλ‹€. header μš”μ†ŒλŠ” z-index 속성을 μ‚¬μš©ν•˜μ—¬ κ°€μž₯ μ•žμ— λ°°μΉ˜λ˜μ—ˆκ³ , sidebar와 content μš”μ†ŒλŠ” float 속성을 μ‚¬μš©ν•˜μ—¬ λ‚˜λž€νžˆ λ°°μΉ˜λ˜μ—ˆμŠ΅λ‹ˆλ‹€. footer μš”μ†ŒλŠ” clear: bothλ₯Ό μ‚¬μš©ν•˜μ—¬ ν”Œλ‘œνŒ… 된 μš”μ†Œ μ•„λž˜μ— λ°°μΉ˜λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

핡심 λ‚΄μš©πŸ‘€

css μœ„μΉ˜ 속성
css position 속성

728x90
λ°˜μ‘ν˜•