λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
μΉ΄ν…Œκ³ λ¦¬ μ—†μŒ

λ°˜μ‘ν˜• μ›Ή μ‚¬μ΄νŠΈλ₯Ό λ§Œλ“œλŠ” λ‹€μ–‘ν•œ 방법

by 5566 2023. 10. 29.

1. Flexbox와 CSS Gridλ₯Ό μ΄μš©ν•œ λ ˆμ΄μ•„μ›ƒ μ œμž‘

μ›Ή λ””μžμΈμ—μ„œ λ°˜μ‘ν˜• μ›Ή μ‚¬μ΄νŠΈλ₯Ό λ§Œλ“€κΈ° μœ„ν•΄ κ°€μž₯ 많이 μ‚¬μš©λ˜λŠ” 방법 쀑 ν•˜λ‚˜λŠ” Flexbox와 CSS Gridλ₯Ό μ΄μš©ν•œ λ ˆμ΄μ•„μ›ƒ μ œμž‘μž…λ‹ˆλ‹€. 이 두 κΈ°μˆ μ€ μœ μ—°ν•œ λ ˆμ΄μ•„μ›ƒμ˜ ꡬ성을 κ°€λŠ₯ν•˜κ²Œ ν•˜λ©°, κ°„λ‹¨ν•˜κ³  κ°•λ ₯ν•œ 속성듀을 μ œκ³΅ν•˜μ—¬ μ›Ή νŽ˜μ΄μ§€μ˜ ꡬ쑰λ₯Ό 효율적으둜 λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

Flexboxλ₯Ό μ΄μš©ν•œ λ ˆμ΄μ•„μ›ƒ μ œμž‘

FlexboxλŠ” μš”μ†Œλ“€μ„ κ°€λ‘œ λ˜λŠ” μ„Έλ‘œ 좕을 κΈ°μ€€μœΌλ‘œ μœ μ—°ν•˜κ²Œ λ°°μΉ˜ν•  수 μžˆλŠ” κΈ°μˆ μž…λ‹ˆλ‹€. 이λ₯Ό 톡해 μ»¨ν…Œμ΄λ„ˆ μ•ˆμ˜ μš”μ†Œλ“€μ„ μ‰½κ²Œ μ •λ ¬ν•˜κ³  간격을 μ‘°μ ˆν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Flexbox의 μ‚¬μš©λ²•μ€ κ°„λ‹¨ν•©λ‹ˆλ‹€. μ»¨ν…Œμ΄λ„ˆμ— display: flex; 속성을 μΆ”κ°€ν•˜λ©΄ ν•΄λ‹Ή μ»¨ν…Œμ΄λ„ˆ μ•ˆμ˜ μš”μ†Œλ“€μ€ μžλ™μœΌλ‘œ Flexboxλ ˆμ΄μ•„μ›ƒμ„ μ‚¬μš©ν•˜κ²Œ λ©λ‹ˆλ‹€. λ˜ν•œ, flex-direction, justify-content, align-items λ“±μ˜ 속성을 μ΄μš©ν•˜μ—¬ μš”μ†Œλ“€μ˜ 배치 λ°©ν–₯κ³Ό 정렬을 μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

CSS Gridλ₯Ό μ΄μš©ν•œ λ ˆμ΄μ•„μ›ƒ μ œμž‘

CSS GridλŠ” κ·Έλ¦¬λ“œ μ‹œμŠ€ν…œμ„ μ‚¬μš©ν•˜μ—¬ μš”μ†Œλ“€μ„ 격자 ν˜•νƒœλ‘œ λ°°μΉ˜ν•  수 μžˆλŠ” κΈ°μˆ μž…λ‹ˆλ‹€. 이λ₯Ό 톡해 λ³΅μž‘ν•œ λ ˆμ΄μ•„μ›ƒμ„ κ΅¬μ„±ν•˜κ±°λ‚˜ μ›Ή νŽ˜μ΄μ§€λ₯Ό κ·Έλ¦¬λ“œ μ˜μ—­μœΌλ‘œ λΆ„ν• ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

CSS Grid의 μ‚¬μš©λ²•μ€ λ‹€μ†Œ λ³΅μž‘ν•  수 μžˆμ§€λ§Œ, κ°•λ ₯ν•œ κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€. grid-template-columns, grid-template-rows λ“±μ˜ 속성을 μ΄μš©ν•˜μ—¬ κ·Έλ¦¬λ“œμ˜ μ—΄κ³Ό ν–‰μ˜ 크기λ₯Ό μ‘°μ ˆν•˜κ³ , grid-column, grid-row λ“±μ˜ 속성을 μ΄μš©ν•˜μ—¬ μš”μ†Œλ“€μ„ κ·Έλ¦¬λ“œ λ‚΄λΆ€μ˜ μœ„μΉ˜μ— λ°°μΉ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ˜ν•œ, Flexbox와 CSS Gridλ₯Ό ν•¨κ»˜ μ‚¬μš©ν•˜μ—¬ 더 λ³΅μž‘ν•œ λ ˆμ΄μ•„μ›ƒμ„ ꡬ성할 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. Flexboxλ₯Ό μ΄μš©ν•˜μ—¬ νŽ˜μ΄μ§€ λ‚΄μ˜ μž‘μ€ μ»΄ν¬λ„ŒνŠΈλ“€μ„ μ •λ ¬ν•˜κ³ , CSS Gridλ₯Ό μ΄μš©ν•˜μ—¬ κ·Έλ¦¬λ“œλ‘œ 전체 νŽ˜μ΄μ§€μ˜ ꡬ쑰λ₯Ό μ„€μ •ν•˜λŠ” λ“±μ˜ ν™œμš©μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€.

μ •λ¦¬ν•˜μžλ©΄, Flexbox와 CSS GridλŠ” λ°˜μ‘ν˜• μ›Ή μ‚¬μ΄νŠΈλ₯Ό λ§Œλ“€κΈ° μœ„ν•œ λ ˆμ΄μ•„μ›ƒ μ œμž‘μ— 맀우 μœ μš©ν•œ λ„κ΅¬μž…λ‹ˆλ‹€. 각각의 νŠΉμ§•κ³Ό μ‚¬μš©λ²•μ„ 잘 μ΅ν˜€μ„œ 고객이 μ›ν•˜λŠ” λ””μžμΈμ— 맞게 μ›Ή νŽ˜μ΄μ§€λ₯Ό κ΅¬μ„±ν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€.

2. 미디어쿼리λ₯Ό ν™œμš©ν•œ ν™”λ©΄ 크기에 λ”°λ₯Έ μŠ€νƒ€μΌ μ‘°μ •

λ°˜μ‘ν˜• μ›Ή λ””μžμΈμ—μ„œλŠ” λ‹€μ–‘ν•œ λ””λ°”μ΄μŠ€μ˜ ν™”λ©΄ 크기에 λŒ€μ‘ν•˜μ—¬ μ›Ή νŽ˜μ΄μ§€μ˜ μŠ€νƒ€μΌμ„ μ‘°μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€. 이λ₯Ό μœ„ν•΄ μ‚¬μš©λ˜λŠ” 기술 쀑 ν•˜λ‚˜κ°€ 미디어쿼리(Media Query)μž…λ‹ˆλ‹€. λ―Έλ””μ–΄μΏΌλ¦¬λŠ” μ›Ή νŽ˜μ΄μ§€μ˜ μŠ€νƒ€μΌμ„ νŠΉμ •ν•œ 쑰건에 따라 λ³€κ²½ν•  수 μžˆλŠ” CSS3의 κΈ°λŠ₯μž…λ‹ˆλ‹€.

미디어쿼리λ₯Ό μ‚¬μš©ν•˜λ©΄ ν™”λ©΄μ˜ λ„ˆλΉ„, 높이, μž₯치의 μ’…λ₯˜ λ“±κ³Ό 같은 쑰건을 ν™•μΈν•˜μ—¬ ν•΄λ‹Ή 쑰건에 맞게 μŠ€νƒ€μΌμ„ μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, ν™”λ©΄ λ„ˆλΉ„κ°€ 768px μ΄ν•˜μΈ κ²½μš°μ—λŠ” λ„€λΉ„κ²Œμ΄μ…˜ 메뉴λ₯Ό 숨기고 햄버거 메뉴λ₯Ό λ³΄μ—¬μ£ΌλŠ” λ“±μ˜ 쑰정을 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ―Έλ””μ–΄μΏΌλ¦¬λŠ” @media κ·œμΉ™μ„ μ‚¬μš©ν•˜μ—¬ 적용될 μŠ€νƒ€μΌμ„ μ •μ˜ν•©λ‹ˆλ‹€. κ°„λ‹¨ν•œ μ˜ˆμ‹œλ‘œ, ν™”λ©΄ λ„ˆλΉ„κ°€ 768px μ΄ν•˜μΌ λ•Œ μŠ€νƒ€μΌμ„ λ³€κ²½ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

@media screen and (max-width: 768px) {
  /* ν™”λ©΄ λ„ˆλΉ„κ°€ 768px μ΄ν•˜μΈ κ²½μš°μ—λ§Œ μ μš©λ˜λŠ” μŠ€νƒ€μΌ */
  body {
    background-color: yellow;
  }

  .container {
    flex-direction: column;
  }
}

μœ„μ˜ μ½”λ“œμ—μ„œ @media screen and (max-width: 768px)은 ν™”λ©΄ λ„ˆλΉ„κ°€ 768px μ΄ν•˜μΌ λ•Œ μŠ€νƒ€μΌμ„ μ μš©ν•˜κ² λ‹€λŠ” μ˜λ―Έμž…λ‹ˆλ‹€. μ΄λŸ¬ν•œ λ°©μ‹μœΌλ‘œ 미디어쿼리λ₯Ό μ‚¬μš©ν•˜μ—¬ ν™”λ©΄ 크기에 λ”°λ₯Έ μŠ€νƒ€μΌ 쑰정을 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ―Έλ””μ–΄μΏΌλ¦¬λŠ” ν™”λ©΄μ˜ λ„ˆλΉ„ 뿐만 μ•„λ‹ˆλΌ λ‹€μ–‘ν•œ 쑰건에 λŒ€ν•΄ 적용될 수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, @media screen and (orientation: landscape)λŠ” κ°€λ‘œ λ°©ν–₯으둜 νŽ˜μ΄μ§€λ₯Ό 보고 μžˆμ„ λ•Œμ—λ§Œ μŠ€νƒ€μΌμ„ μ μš©ν•˜λ„λ‘ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ°˜μ‘ν˜• μ›Ή λ””μžμΈμ—μ„œλŠ” 미디어쿼리λ₯Ό 적절히 ν™œμš©ν•˜μ—¬ λ‹€μ–‘ν•œ λ””λ°”μ΄μŠ€μ— λŒ€μ‘ν•˜λŠ” μœ μ—°ν•œ μŠ€νƒ€μΌ 쑰정을 ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μƒˆλ‘œμš΄ 미디어쿼리λ₯Ό λ°°μ›Œκ°€λ©°, μ›Ή νŽ˜μ΄μ§€μ˜ μ‚¬μš©μž κ²½ν—˜μ„ ν–₯μƒμ‹œν‚€λŠ” μž‘μ—…μ„ ν•΄λ³΄μ„Έμš”.

3. μ΄λ―Έμ§€μ˜ 크기 μ‘°μ •κ³Ό λ‹€μ–‘ν•œ μž₯μΉ˜μ— λŒ€μ‘ν•˜λŠ” 처리 방법

λ°˜μ‘ν˜• μ›Ή λ””μžμΈμ—μ„œλŠ” λ‹€μ–‘ν•œ λ””λ°”μ΄μŠ€μ˜ ν™”λ©΄ 크기에 λ§žμΆ”μ–΄ μ΄λ―Έμ§€μ˜ 크기λ₯Ό μ‘°μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€. 이λ₯Ό μœ„ν•΄ CSS와 HTML을 ν™œμš©ν•˜μ—¬ μ΄λ―Έμ§€μ˜ 크기λ₯Ό μ‘°μ ˆν•˜λŠ” 방법과 λ‹€μ–‘ν•œ μž₯μΉ˜μ— λŒ€μ‘ν•˜λŠ” 처리 방법에 λŒ€ν•΄ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

3.1. CSSλ₯Ό μ΄μš©ν•œ 이미지 크기 μ‘°μ •

CSS의 max-width 속성을 μ‚¬μš©ν•˜λ©΄ 이미지가 νŠΉμ •ν•œ λ„ˆλΉ„ μ΄μƒμ˜ ν™”λ©΄μ—μ„œλ„ 원본 크기λ₯Ό μœ μ§€ν•˜λ‹€κ°€, 화면이 μž‘μ•„μ§ˆ λ•Œμ—λŠ” μ΄λ―Έμ§€μ˜ 크기가 μžλ™μœΌλ‘œ μ‘°μ •λ©λ‹ˆλ‹€.

img {
  max-width: 100%;
  height: auto;
}

μœ„μ˜ CSS μ½”λ“œλŠ” μ΄λ―Έμ§€μ˜ μ΅œλŒ€ λ„ˆλΉ„λ₯Ό λΆ€λͺ¨ μš”μ†Œμ˜ 100%둜 μ„€μ •ν•˜κ³ , height: auto;둜 μ΄λ―Έμ§€μ˜ μ„Έλ‘œ λΉ„μœ¨μ„ μœ μ§€ν•˜λ„λ‘ ν•©λ‹ˆλ‹€. μ΄λ ‡κ²Œ μ„€μ •ν•˜λ©΄ μ΄λ―Έμ§€λŠ” λ„ˆλΉ„μ— 따라 μžλ™μœΌλ‘œ 크기가 μ‘°μ •λ©λ‹ˆλ‹€.

3.2. <picture> μš”μ†Œλ₯Ό μ΄μš©ν•œ λ¦¬μ†ŒμŠ€ λŒ€μ‘

μ΄λ―Έμ§€μ˜ 크기 μ‘°μ •λΏλ§Œ μ•„λ‹ˆλΌ, λ‹€μ–‘ν•œ ν™”λ©΄ 해상도에 λŒ€μ‘ν•˜κΈ° μœ„ν•΄ <picture> μš”μ†Œλ₯Ό ν™œμš©ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. <picture> μš”μ†ŒλŠ” <img> μš”μ†Œμ˜ λŒ€μ²΄ μžμ›μ„ μ œκ³΅ν•˜λŠ” κΈ°λŠ₯을 ν•©λ‹ˆλ‹€.

<picture>
  <source media="(max-width: 768px)" srcset="small.jpg">
  <source media="(max-width: 1024px)" srcset="medium.jpg">
  <source media="(min-width: 1025px)" srcset="large.jpg">
  <img src="default.jpg" alt="">
</picture>

μœ„μ˜ μ½”λ“œμ—μ„œ <source> μš”μ†ŒλŠ” 미디어쿼리λ₯Ό μ‚¬μš©ν•˜μ—¬ 각각의 ν™”λ©΄ 크기에 따라 λ‹€λ₯Έ 이미지λ₯Ό 선택할 수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€. <img> μš”μ†ŒλŠ” <picture> μš”μ†Œκ°€ μ§€μ›λ˜μ§€ μ•ŠλŠ” ν™˜κ²½μ—μ„œ λŒ€λΉ„ 이미지λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

3.3. CSS 미디어쿼리λ₯Ό μ΄μš©ν•œ 이미지 처리

이미지에 λŒ€ν•œ μŠ€νƒ€μΌμ„ ν™”λ©΄ 크기에 따라 λ‹€λ₯΄κ²Œ μ‘°μ •ν•˜κ³  싢은 경우, CSS 미디어쿼리λ₯Ό μ‚¬μš©ν•˜μ—¬ λ‹€μ–‘ν•œ 처리λ₯Ό ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

@media screen and (max-width: 768px) {
  img {
    width: 100%;
    height: auto;
  }
}

@media screen and (min-width: 768px) and (max-width: 1024px) {
  img {
    width: 80%;
    height: auto;
  }
}

μœ„μ˜ μ½”λ“œλŠ” ν™”λ©΄ λ„ˆλΉ„μ— 따라 μ΄λ―Έμ§€μ˜ 크기λ₯Ό μ‘°μ •ν•˜λŠ” μ˜ˆμ‹œμž…λ‹ˆλ‹€. ν™”λ©΄ λ„ˆλΉ„κ°€ 768px μ΄ν•˜μΌ λ•Œμ—λŠ” μ΄λ―Έμ§€μ˜ λ„ˆλΉ„λ₯Ό 100%둜, 768px 이상 1024px μ΄ν•˜μΌ λ•Œμ—λŠ” μ΄λ―Έμ§€μ˜ λ„ˆλΉ„λ₯Ό 80%둜 μ„€μ •ν•©λ‹ˆλ‹€.

λ°˜μ‘ν˜• μ›Ή λ””μžμΈμ—μ„œλŠ” λ‹€μ–‘ν•œ ν™”λ©΄ 크기와 λ””λ°”μ΄μŠ€μ— λŒ€μ‘ν•˜μ—¬ μ΄λ―Έμ§€μ˜ 크기λ₯Ό μ‘°μ •ν•˜λŠ” μ²˜λ¦¬κ°€ ν•„μš”ν•©λ‹ˆλ‹€. μ μ ˆν•œ CSS와 HTML을 ν™œμš©ν•˜μ—¬ μ΄λ―Έμ§€μ˜ 크기λ₯Ό μœ μ—°ν•˜κ²Œ μ‘°μ •ν•˜κ³ , μ‚¬μš©μžμ—κ²Œ μ΅œμ ν™”λœ κ²½ν—˜μ„ μ œκ³΅ν•  수 μžˆλ„λ‘ λ…Έλ ₯ν•΄ λ³΄μ„Έμš”.

4. μ›Ή ν°νŠΈμ™€ μ•„μ΄μ½˜μ„ μ‚¬μš©ν•œ λ‹€μ–‘ν•œ λ””λ°”μ΄μŠ€ ν™˜κ²½μ— ν˜Έν™˜λ˜λŠ” ν…μŠ€νŠΈ 및 κ·Έλž˜ν”½ 처리

λ°˜μ‘ν˜• μ›Ή λ””μžμΈμ—μ„œλŠ” λ‹€μ–‘ν•œ λ””λ°”μ΄μŠ€μ˜ ν™”λ©΄ 크기와 해상도에 λ§žμΆ°μ„œ ν…μŠ€νŠΈμ™€ κ·Έλž˜ν”½ μš”μ†Œλ₯Ό μ²˜λ¦¬ν•΄μ•Ό ν•©λ‹ˆλ‹€. 이λ₯Ό μœ„ν•΄ μ›Ή ν°νŠΈμ™€ μ•„μ΄μ½˜μ„ μ‚¬μš©ν•˜μ—¬ λ‹€μ–‘ν•œ λ””λ°”μ΄μŠ€ ν™˜κ²½μ— ν˜Έν™˜λ˜λŠ” ν…μŠ€νŠΈ 및 κ·Έλž˜ν”½ 처리λ₯Ό ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이번 λ‹¨λ½μ—μ„œλŠ” μ›Ή ν°νŠΈμ™€ μ•„μ΄μ½˜μ΄ μ–΄λ–»κ²Œ ν™œμš©λ˜λŠ”μ§€μ— λŒ€ν•΄ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

4.1. μ›Ή 폰트 μ‚¬μš©ν•˜κΈ°

κΈ°λ³Έ μ‹œμŠ€ν…œ 폰트 λŒ€μ‹  μ›Ή 폰트λ₯Ό μ‚¬μš©ν•˜μ—¬ λ‹€μ–‘ν•œ λ””λ°”μ΄μŠ€μ—μ„œ ν…μŠ€νŠΈλ₯Ό λ”μš± μ„Έλ°€ν•˜κ²Œ μ œμ–΄ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ›Ή ν°νŠΈλŠ” 폰트 νŒŒμΌμ„ μ„œλ²„μ—μ„œ λ‹€μš΄λ‘œλ“œν•˜μ—¬ μ‚¬μš©μžμ˜ λΈŒλΌμš°μ €κ°€ λ Œλ”λ§ν•  수 μžˆλ„λ‘ ν•˜λŠ” κΈ°μˆ μž…λ‹ˆλ‹€.

4.1.1. Google Fonts와 같은 μ›Ή 폰트 μ„œλΉ„μŠ€ μ‚¬μš©ν•˜κΈ°

Google Fonts와 같은 μ›Ή 폰트 μ„œλΉ„μŠ€λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 κ°€μž₯ μΌλ°˜μ μž…λ‹ˆλ‹€. λ‹€μ–‘ν•œ 폰트 μ˜΅μ…˜ μ€‘μ—μ„œ μ›ν•˜λŠ” 폰트λ₯Ό μ„ νƒν•˜μ—¬ μ›Ή νŽ˜μ΄μ§€μ— μΆ”κ°€ν•©λ‹ˆλ‹€.

<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans">

μœ„μ˜ μ½”λ“œλŠ” "Open Sans" 폰트λ₯Ό μ›Ή νŽ˜μ΄μ§€μ— μΆ”κ°€ν•˜λŠ” μ˜ˆμ‹œμž…λ‹ˆλ‹€. 이후 CSSμ—μ„œ ν•΄λ‹Ή 폰트λ₯Ό μ„ νƒν•˜μ—¬ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

body {
  font-family: 'Open Sans', sans-serif;
}

4.1.2. μ„ ν˜Έν•˜λŠ” μ›Ή 폰트 νŒŒμΌμ„ 직접 μ‚¬μš©ν•˜κΈ°

λ§Œμ•½ μ„ ν˜Έν•˜λŠ” μ›Ή ν°νŠΈκ°€ μžˆλŠ” 경우, ν•΄λ‹Ή 폰트 νŒŒμΌμ„ 직접 μ‚¬μš©ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. 폰트 νŒŒμΌμ„ μ„œλ²„μ— μ—…λ‘œλ“œν•˜κ³ , CSSμ—μ„œ 폰트 νŒŒμΌμ„ λͺ…μ‹œν•˜μ—¬ μ‚¬μš©ν•©λ‹ˆλ‹€.

@font-face {
  font-family: 'Open Sans';
  src: url('open-sans.woff2') format('woff2'),
       url('open-sans.woff') format('woff');
}

body {
  font-family: 'Open Sans', sans-serif;
}

μœ„μ˜ μ½”λ“œλŠ” μ„œλ²„μ— μ—…λ‘œλ“œλœ "Open Sans" 폰트 νŒŒμΌμ„ μ‚¬μš©ν•˜λŠ” μ˜ˆμ‹œμž…λ‹ˆλ‹€. μ›Ή 폰트λ₯Ό μ‚¬μš©ν•˜λ©΄ ν…μŠ€νŠΈμ˜ λͺ¨μ–‘κ³Ό μŠ€νƒ€μΌμ„ μ„ νƒμ μœΌλ‘œ μ œμ–΄ν•  수 μžˆμ–΄, λ‹€μ–‘ν•œ λ””λ°”μ΄μŠ€μ— μ ν•©ν•œ 읽기 νŽΈν•œ ν…μŠ€νŠΈλ₯Ό μ œκ³΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

4.2. μ•„μ΄μ½˜ μ‚¬μš©ν•˜κΈ°

μ•„μ΄μ½˜μ€ κ·Έλž˜ν”½ μ²˜λ¦¬μ— μžˆμ–΄μ„œλ„ 맀우 μ€‘μš”ν•œ μš”μ†Œμž…λ‹ˆλ‹€. λ‹€μ–‘ν•œ μ•„μ΄μ½˜μ„ μ‚¬μš©ν•˜μ—¬ μ‚¬μš©μžμ—κ²Œ 직관적인 μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ œκ³΅ν•˜κ³ , λ‹€μ–‘ν•œ λ””λ°”μ΄μŠ€μ—μ„œλ„ 화면에 μ μ ˆν•˜κ²Œ 보이도둝 μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

4.2.1. Font Awesomeκ³Ό 같은 μ•„μ΄μ½˜ 라이브러리 μ‚¬μš©ν•˜κΈ°

Font Awesomeκ³Ό 같은 μ•„μ΄μ½˜ 라이브러리λ₯Ό μ‚¬μš©ν•˜λ©΄ λ‹€μ–‘ν•œ μ•„μ΄μ½˜μ„ μ›Ή νŽ˜μ΄μ§€μ— μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ•„μ΄μ½˜ 라이브러리λ₯Ό μ‚¬μš©ν•˜λ©΄ 폰트 νŒŒμΌμ„ 뢈러였고, ν•΄λ‹Ή μ•„μ΄μ½˜μ„ μ‰½κ²Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css" />

μœ„μ˜ μ½”λ“œλŠ” Font Awesome μ•„μ΄μ½˜ 라이브러리λ₯Ό μ›Ή νŽ˜μ΄μ§€μ— μΆ”κ°€ν•˜λŠ” μ˜ˆμ‹œμž…λ‹ˆλ‹€. 이후 μ•„μ΄μ½˜μ„ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

<i class="fas fa-envelope"></i>

4.2.2. SVG μ•„μ΄μ½˜ μ‚¬μš©ν•˜κΈ°

SVG(Scaleable Vector Graphics) μ•„μ΄μ½˜μ„ 직접 μ‚¬μš©ν•˜μ—¬ ν™”λ©΄ 해상도에 λ¬΄κ΄€ν•˜κ²Œ 화면에 고해상도 μ•„μ΄μ½˜μ„ μ œκ³΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€. SVG νŒŒμΌμ„ μ›Ή νŽ˜μ΄μ§€μ— μΆ”κ°€ν•˜κ³ , CSSλ₯Ό μ‚¬μš©ν•˜μ—¬ μ•„μ΄μ½˜μ„ μŠ€νƒ€μΌλ§ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

<svg class="icon" width="24" height="24" viewBox="0 0 24 24">
  <path fill="#000" d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zM12 6c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm0 6c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2z" />
</svg>

μœ„μ˜ μ½”λ“œλŠ” SVG μ•„μ΄μ½˜μ„ μΆ”κ°€ν•˜λŠ” μ˜ˆμ‹œμž…λ‹ˆλ‹€. CSSλ₯Ό μ‚¬μš©ν•˜μ—¬ μ•„μ΄μ½˜μ„ μŠ€νƒ€μΌλ§ν•˜κ±°λ‚˜, μƒνƒœμ— 따라 λ™μ μœΌλ‘œ λ³€κ²½ν•˜λŠ” λ“±μ˜ 처리λ₯Ό ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ›Ή ν°νŠΈμ™€ μ•„μ΄μ½˜μ€ λ°˜μ‘ν˜• μ›Ή λ””μžμΈμ—μ„œ ν…μŠ€νŠΈμ™€ κ·Έλž˜ν”½ μ²˜λ¦¬μ— 맀우 μ€‘μš”ν•œ 역할을 ν•©λ‹ˆλ‹€. μžμ‹ μ˜ μ›Ή νŽ˜μ΄μ§€μ— μ μ ˆν•œ μ›Ή ν°νŠΈμ™€ μ•„μ΄μ½˜μ„ μ„ νƒν•˜κ³ , λ‹€μ–‘ν•œ λ””λ°”μ΄μŠ€ ν™˜κ²½μ— ν˜Έν™˜λ˜λ„λ‘ ν…μŠ€νŠΈμ™€ κ·Έλž˜ν”½ μš”μ†Œλ₯Ό μ²˜λ¦¬ν•΄λ³΄μ„Έμš”. μ‚¬μš©μžμ—κ²Œ 더 쒋은 μ‚¬μš© κ²½ν—˜μ„ μ œκ³΅ν•  수 μžˆμ„ κ²ƒμž…λ‹ˆλ‹€.

5. JavaScript와 jQueryλ₯Ό ν™œμš©ν•œ 동적인 μš”μ†Œμ™€ μ‚¬μš©μž μΈν„°λž™μ…˜ μΆ”κ°€

λ°˜μ‘ν˜• μ›Ή λ””μžμΈμ—μ„œλŠ” 동적인 μš”μ†Œμ™€ μ‚¬μš©μž μΈν„°λž™μ…˜μ„ μΆ”κ°€ν•˜μ—¬ μ‚¬μš©μžμ—κ²Œ λ”μš± ν’λΆ€ν•œ κ²½ν—˜μ„ μ œκ³΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€. JavaScript와 jQueryλ₯Ό ν™œμš©ν•˜μ—¬ μ›Ή νŽ˜μ΄μ§€μ— 동적인 μš”μ†Œλ₯Ό μΆ”κ°€ν•˜κ³ , μ‚¬μš©μžμ™€μ˜ μΈν„°λž™μ…˜μ„ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이번 λ‹¨λ½μ—μ„œλŠ” JavaScript와 jQueryλ₯Ό μ‚¬μš©ν•˜μ—¬ 동적인 μš”μ†Œμ™€ μ‚¬μš©μž μΈν„°λž™μ…˜μ„ μΆ”κ°€ν•˜λŠ” 방법에 λŒ€ν•΄ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

5.1. JavaScriptλ₯Ό μ‚¬μš©ν•œ 동적인 μš”μ†Œ μΆ”κ°€

JavaScriptλŠ” μ›Ή νŽ˜μ΄μ§€μ— 동적인 μš”μ†Œλ₯Ό μΆ”κ°€ν•˜λŠ” 데 μ‚¬μš©ν•  수 μžˆλŠ” κ°•λ ₯ν•œ μ–Έμ–΄μž…λ‹ˆλ‹€. λ‹€μŒμ€ JavaScriptλ₯Ό μ‚¬μš©ν•˜μ—¬ λ™μ μœΌλ‘œ μš”μ†Œλ₯Ό μΆ”κ°€ν•˜λŠ” κ°„λ‹¨ν•œ μ˜ˆμ‹œμž…λ‹ˆλ‹€.

var button = document.createElement('button');
button.textContent = 'Click Me';
document.body.appendChild(button);

μœ„μ˜ μ½”λ“œλŠ” button μš”μ†Œλ₯Ό λ™μ μœΌλ‘œ μƒμ„±ν•˜κ³ , ν…μŠ€νŠΈλ₯Ό μΆ”κ°€ν•œ ν›„ document.body에 μΆ”κ°€ν•˜λŠ” μ˜ˆμ‹œμž…λ‹ˆλ‹€. JavaScriptλ₯Ό μ‚¬μš©ν•˜λ©΄ μ›Ή νŽ˜μ΄μ§€μ˜ μš”μ†Œλ₯Ό λ™μ μœΌλ‘œ μ‘°μž‘ν•  수 μžˆμ–΄, μ‚¬μš©μžμ—κ²Œ 보닀 동적이고 ν₯미둜운 κ²½ν—˜μ„ μ œκ³΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

5.2. jQueryλ₯Ό μ‚¬μš©ν•œ 동적인 μš”μ†Œμ™€ μΈν„°λž™μ…˜ μΆ”κ°€

jQueryλŠ” JavaScript의 λΌμ΄λΈŒλŸ¬λ¦¬λ‘œμ„œ, μ›Ή νŽ˜μ΄μ§€μ— 동적인 μš”μ†Œλ₯Ό μΆ”κ°€ν•˜κ±°λ‚˜ μΈν„°λž™μ…˜μ„ κ΅¬ν˜„ν•˜λŠ” 데 맀우 νŽΈλ¦¬ν•œ κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€. jQueryλ₯Ό μ‚¬μš©ν•˜λ©΄ κ°„κ²°ν•œ μ½”λ“œλ‘œ λ‹€μ–‘ν•œ νš¨κ³Όμ™€ λ™μž‘μ„ μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

$('#myButton').click(function() {
  $(this).toggleClass('active');
});

μœ„μ˜ μ½”λ“œλŠ” myButtonμ΄λΌλŠ” idλ₯Ό 가진 μš”μ†Œλ₯Ό ν΄λ¦­ν–ˆμ„ λ•Œ ν•΄λ‹Ή μš”μ†Œμ— active 클래슀λ₯Ό μΆ”κ°€ν•˜κ±°λ‚˜ μ œκ±°ν•˜λŠ” μ˜ˆμ‹œμž…λ‹ˆλ‹€. jQueryλŠ” CSS μ„ νƒμžμ™€ ν•¨κ»˜ μ‚¬μš©ν•˜μ—¬ μš”μ†Œλ₯Ό μ„ νƒν•˜κ³ , 이벀트λ₯Ό μ²˜λ¦¬ν•˜λŠ” λ“±μ˜ μž‘μ—…μ„ κ°„λ‹¨ν•˜κ²Œ μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

5.3. Ajaxλ₯Ό μ‚¬μš©ν•œ 동적인 데이터 λ‘œλ”©

AjaxλŠ” λΉ„λ™κΈ°μ μœΌλ‘œ μ„œλ²„μ™€ 데이터λ₯Ό κ΅ν™˜ν•˜λŠ” 기술둜, μ‚¬μš©μž μΈν„°λž™μ…˜μ— 따라 λ™μ μœΌλ‘œ 데이터λ₯Ό λ‘œλ”©ν•˜κ±°λ‚˜ μ—…λ°μ΄νŠΈν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€. Ajaxλ₯Ό ν™œμš©ν•˜μ—¬ μ›Ή νŽ˜μ΄μ§€μ— 동적인 데이터λ₯Ό λ‘œλ”©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

$.ajax({
  url: 'data.json',
  method: 'GET',
  success: function(data) {
    // 데이터 λ‘œλ”© ν›„ 처리
  }
});

μœ„μ˜ μ½”λ“œλŠ” data.json νŒŒμΌμ„ λΉ„λ™κΈ°μ μœΌλ‘œ κ°€μ Έμ˜€λŠ” Ajax μš”μ²­μ„ λ³΄λ‚΄λŠ” μ˜ˆμ‹œμž…λ‹ˆλ‹€. μ„œλ²„λ‘œλΆ€ν„° 데이터λ₯Ό μ„±κ³΅μ μœΌλ‘œ λ°›μ•„μ˜€λ©΄ success 콜백 ν•¨μˆ˜κ°€ μ‹€ν–‰λ˜λ©°, ν•΄λ‹Ή ν•¨μˆ˜μ—μ„œ 데이터λ₯Ό μ²˜λ¦¬ν•˜κ±°λ‚˜ 화면에 좜λ ₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

JavaScript와 jQueryλ₯Ό μ‚¬μš©ν•˜μ—¬ μ›Ή νŽ˜μ΄μ§€μ— 동적인 μš”μ†Œμ™€ μ‚¬μš©μž μΈν„°λž™μ…˜μ„ μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 동적인 μš”μ†Œμ™€ μ‚¬μš©μž μΈν„°λž™μ…˜μ„ 톡해 μ‚¬μš©μžμ—κ²Œ λ”μš± ν₯미둜운 κ²½ν—˜μ„ μ œκ³΅ν•˜κ³ , μ›Ή νŽ˜μ΄μ§€μ˜ κΈ°λŠ₯을 ν™•μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ μ ˆν•˜κ²Œ JavaScript와 jQueryλ₯Ό ν™œμš©ν•˜μ—¬ μ‚¬μš©μžμ™€μ˜ μƒν˜Έμž‘μš©μ„ κ°œμ„ ν•΄λ³΄μ„Έμš”.

λŒ“κΈ€