3 min read

당신이 λͺ°λžλ˜ νŠΉμ΄ν•œ HTML νƒœκ·Έμ™€ 속성듀

λ‚˜λ§Œ λͺ°λžλ˜ κ±Έ μˆ˜λ„ 있고...

Table of Contents

μˆ¨κ²¨μ§„? λͺ°λžλ˜ 보석듀

접근성에 관심을 두지 μ•Šκ³  λͺ¨λ˜ μ›Ή ν”„λ ˆμž„μ›Œν¬λ₯Ό λ§ˆν¬μ—… ν•˜λ‹€ 보면 <div>λ‚˜ <span> μ΄μ™Έμ˜ νƒœκ·ΈλŠ” 많이 μ‚¬μš©ν•  일이 μ—†λŠ”λ°μš”,
mdn을 뒀적이닀 보면 λͺ°λžλ˜ νŠΉμ΄ν•œ νƒœκ·Έμ™€ 속성듀이 μžˆμŠ΅λ‹ˆλ‹€.

이번 κΈ€μ—μ„œλŠ” νŠΉμ • μƒν™©μ—μ„œ 맀우 μœ μš©ν•˜κ²Œ 쓰일 수 μžˆμ§€λ§Œ, 잘 μ•Œλ €μ§€μ§€ μ•Šμ€ νƒœκ·Έμ™€ 속성듀을 μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

1. <details>와 <summary>: JS 없이 μ•„μ½”λ””μ–Έ UI λ§Œλ“€κΈ°

μ•„μ½”λ””μ–Έ UIλ₯Ό λ§Œλ“€ λ•Œ, 보톡은 JavaScriptλ₯Ό μ‚¬μš©ν•΄ κ΅¬ν˜„ν•˜κ³€ ν•©λ‹ˆλ‹€.
ν•˜μ§€λ§Œ HTMLλ§ŒμœΌλ‘œλ„ μ•„μ½”λ””μ–Έ UIλ₯Ό λ§Œλ“€ 수 μžˆλ‹€λŠ” 사싀, μ•Œκ³  κ³„μ…¨λ‚˜μš”?

<details>
  <summary>더 보기</summary>
  <p>이 λ‚΄μš©μ€ μ ‘ν˜”λ‹€κ°€ 펼쳐질 수 μžˆμŠ΅λ‹ˆλ‹€.</p>
</details>
μš”λ ‡κ²Œ

이 λ‚΄μš©μ€ μ ‘ν˜”λ‹€κ°€ 펼쳐질 수 μžˆμŠ΅λ‹ˆλ‹€.

  • <details>: μ‚¬μš©μžκ°€ ν΄λ¦­ν•˜λ©΄ λ‚΄μš©μ„ λ³΄μ—¬μ£Όκ±°λ‚˜ 숨길 수 μžˆλŠ” μ»¨ν…Œμ΄λ„ˆμž…λ‹ˆλ‹€.
  • <summary>: <details>의 제λͺ© 역할을 ν•©λ‹ˆλ‹€.

CSS둜 μŠ€νƒ€μΌλ§λ„ κ°€λŠ₯ν•©λ‹ˆλ‹€.

details[open] {
  background-color: #f0f0f0;
}

2. <datalist>: μž…λ ₯ ν•„λ“œμ— μžλ™ μ™„μ„± κΈ°λŠ₯ μΆ”κ°€

<input> νƒœκ·Έμ— μžλ™ μ™„μ„± κΈ°λŠ₯을 μΆ”κ°€ν•˜κ³  싢을 λ•Œ, 보톡은 JavaScriptλ‚˜ 라이브러리λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
ν•˜μ§€λ§Œ <datalist>λ₯Ό μ‚¬μš©ν•˜λ©΄ μ•„μ£Ό κ°„λ‹¨ν•˜κ²Œ μžλ™ μ™„μ„± κΈ°λŠ₯을 κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

<input type="text" list="suggestions" />
<datalist id="suggestions">
  <option value="Apple">
  <option value="Banana">
  <option value="Cherry">
</datalist>

μš”λ ‡κ²Œ

  • <datalist>: μž…λ ₯ ν•„λ“œμ— μ œμ•ˆ λͺ©λ‘μ„ μ œκ³΅ν•©λ‹ˆλ‹€.
  • <option>: μ œμ•ˆν•  ν•­λͺ©λ“€μ„ μ •μ˜ν•©λ‹ˆλ‹€.

3. <meter>와 <progress>: 진행 μƒνƒœλ₯Ό μ‹œκ°μ μœΌλ‘œ ν‘œν˜„

진행 μƒνƒœλ₯Ό ν‘œμ‹œν•  λ•Œ, 보톡은 <div>λ₯Ό μ‚¬μš©ν•΄ 직접 μŠ€νƒ€μΌλ§ν•˜κ±°λ‚˜ 라이브러리λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ HTMLμ—λŠ” 이미 <meter>와 <progress>λΌλŠ” νƒœκ·Έκ°€ μžˆμŠ΅λ‹ˆλ‹€.

<label for="disk-usage">λ””μŠ€ν¬ μ‚¬μš©λŸ‰:</label>
<meter id="disk-usage" value="0.7">70%</meter>

<label for="file-upload">파일 μ—…λ‘œλ“œ 진행λ₯ :</label>
<progress id="file-upload" value="50" max="100">50%</progress>

μš”λ ‡κ²Œ

70%

50%

  • <meter>: νŠΉμ • λ²”μœ„ λ‚΄μ˜ 값을 ν‘œμ‹œν•©λ‹ˆλ‹€. (예: λ””μŠ€ν¬ μ‚¬μš©λŸ‰)
  • <progress>: μž‘μ—…μ˜ 진행 μƒνƒœλ₯Ό ν‘œμ‹œν•©λ‹ˆλ‹€.

HTML둜만 λ§Œλ“  μ›Ήμ‚¬μ΄νŠΈμ—μ„œλ‚˜ λ³Ό λ²•ν•œ μŠ€νƒ€μΌλ§μ΄λΌ μž¬λ°ŒμŠ΅λ‹ˆλ‹€.

4. <output>: 계산 κ²°κ³Όλ₯Ό μ‹€μ‹œκ°„μœΌλ‘œ ν‘œμ‹œ

폼 μž…λ ₯값을 기반으둜 계산 κ²°κ³Όλ₯Ό ν‘œμ‹œν•  λ•Œ, 보톡은 JavaScriptλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
ν•˜μ§€λ§Œ <output> νƒœκ·Έλ₯Ό μ‚¬μš©ν•˜λ©΄ 더 μ§κ΄€μ μœΌλ‘œ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

<form oninput="result.value = parseInt(a.value) + parseInt(b.value)">
  <input type="number" id="a" value="10"> +
  <input type="number" id="b" value="20"> =
  <output name="result" for="a b">30</output>
</form>

μš”λ ‡κ²Œ

+ = 30
  • <output>: 계산 κ²°κ³Όλ‚˜ μ‚¬μš©μž μž…λ ₯에 λŒ€ν•œ ν”Όλ“œλ°±μ„ ν‘œμ‹œν•©λ‹ˆλ‹€.
  • for 속성: μ–΄λ–€ μž…λ ₯ ν•„λ“œμ™€ μ—°κ²°λ˜μ–΄ μžˆλŠ”μ§€ μ§€μ •ν•©λ‹ˆλ‹€.

5. <dialog>: JavaScript 없이 λͺ¨λ‹¬ μ°½ λ§Œλ“€κΈ°

λͺ¨λ‹¬ 창을 λ§Œλ“€ λ•Œ, 보톡은 <div>λ₯Ό μ‚¬μš©ν•΄ 직접 μŠ€νƒ€μΌλ§ν•˜κ³  JavaScript둜 μ—΄κ³  λ‹«λŠ” λ‘œμ§μ„ κ΅¬ν˜„ν•©λ‹ˆλ‹€.
ν•˜μ§€λ§Œ HTML5의 <dialog> νƒœκ·Έλ₯Ό μ‚¬μš©ν•˜λ©΄ μ•„μ£Ό κ°„λ‹¨ν•˜κ²Œ λͺ¨λ‹¬ 창을 λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

<dialog id="modal">
  <p>λͺ¨λ‹¬μž…λ‹ˆλ‹€.</p>
  <button onclick="document.getElementById('modal').close()">λ‹«κΈ°</button>
</dialog>

<button onclick="document.getElementById('modal').showModal()"><i>λͺ¨λ‹¬ μ—΄κΈ° λ²„νŠΌ</i></button>

λͺ¨λ‹¬μž…λ‹ˆλ‹€.

  • <dialog>: λͺ¨λ‹¬ 창을 μ •μ˜ν•©λ‹ˆλ‹€.
  • showModal(): λͺ¨λ‹¬ 창을 μ—½λ‹ˆλ‹€.
  • close(): λͺ¨λ‹¬ 창을 λ‹«μŠ΅λ‹ˆλ‹€.

이 νƒœκ·ΈλŠ” 기본적으둜 μŠ€νƒ€μΌλ§μ΄ 제곡되며, ::backdrop 가상 μš”μ†Œλ₯Ό μ‚¬μš©ν•΄ 배경을 μ»€μŠ€ν„°λ§ˆμ΄μ§•ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

마무리

μ˜€λŠ˜μ€ ν‰μ†Œμ— 잘 쓰지 μ•Šμ•˜λ˜ HTML νƒœκ·Έμ™€ 속성듀을 μ‚΄νŽ΄λ΄€μŠ΅λ‹ˆλ‹€.
μ‹€μ œλ‘œ μ‚¬μš©ν•  일은 거의 μ—†κ² μ§€λ§Œμš”β€¦

ν•˜μ§€λ§Œ 이런 νƒœκ·Έλ“€μ„ 잘 ν™œμš©ν•˜λ©΄,
JavaScript μ˜μ‘΄λ„λ₯Ό 쀄일 수 있고,
μ½”λ“œλ₯Ό 더 κ°„κ²°ν•˜κ²Œ μž‘μ„±ν•  수 있으며,
μ‚¬μš©μž κ²½ν—˜μ„ ν–₯μƒμ‹œν‚¬ 수 μžˆμ„ 것 κ°™μ•„μš”.

λ‹€μŒ 번 ν”„λ‘œμ νŠΈμ—μ„œ ν•œλ²ˆ ν™œμš©ν•΄λ³΄λŠ” 건 μ–΄λ–¨κΉŒμš”?