Front-end

🌟 데이터 속성과 Attribute Selector: ν”„λ‘ νŠΈμ—”λ“œ 개발자λ₯Ό μœ„ν•œ μ™„λ²½ κ°€μ΄λ“œ 🌟

xeunnie 2025. 3. 13. 01:00
728x90
λ°˜μ‘ν˜•

🌟 데이터 속성과 Attribute Selector: ν”„λ‘ νŠΈμ—”λ“œ 개발자λ₯Ό μœ„ν•œ μ™„λ²½ κ°€μ΄λ“œ 🌟

 

μ›Ή κ°œλ°œμ„ ν•˜λ‹€ 보면 νŠΉμ • μš”μ†Œλ₯Ό μ„ νƒν•˜κ±°λ‚˜ λ™μ μœΌλ‘œ μŠ€νƒ€μΌμ„ μ μš©ν•΄μ•Ό ν•  λ•Œκ°€ λ§ŽμŠ΅λ‹ˆλ‹€. 이럴 λ•Œ **데이터 속성(data-attributes)**κ³Ό Attribute SelectorλŠ” κ°•λ ₯ν•œ 도ꡬ가 λ©λ‹ˆλ‹€. μ˜€λŠ˜μ€ 이 두 κ°€μ§€λ₯Ό 깊이 νŒŒν—€μΉ˜λ©°, μ‹€λ¬΄μ—μ„œ μ–΄λ–»κ²Œ ν™œμš©ν•  수 μžˆμ„μ§€ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

1️⃣ 데이터 속성(data-attributes)λž€?

 

데이터 속성은 HTML5μ—μ„œ λ„μž…λœ μ»€μŠ€ν…€ μ†μ„±μœΌλ‘œ, μš”μ†Œμ— 좔가적인 정보λ₯Ό μ €μž₯ν•  수 μžˆλ„λ‘ μ„€κ³„λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 이 속성은 data-둜 μ‹œμž‘ν•˜λ©°, JS와 CSSμ—μ„œ λ™μ μœΌλ‘œ 데이터λ₯Ό κ΄€λ¦¬ν•˜κ±°λ‚˜ μŠ€νƒ€μΌμ„ μ μš©ν•  λ•Œ 맀우 μœ μš©ν•©λ‹ˆλ‹€.

 

문법

 

<div data-key="12345" data-role="admin">User Info</div>

 

data-key="12345": keyλΌλŠ” 데이터 속성과 κ°’ 12345λ₯Ό κ°€μ§„λ‹€.

data-role="admin": roleμ΄λΌλŠ” 데이터 속성과 κ°’ admin을 κ°€μ§„λ‹€.

 

μ™œ 데이터 속성을 μ‚¬μš©ν• κΉŒ?

1. μ»€μŠ€ν…€ 데이터 μ €μž₯:

μ„œλ²„μ—μ„œ μ œκ³΅λ˜λŠ” 데이터 λ˜λŠ” μƒνƒœ 정보λ₯Ό HTML μš”μ†Œμ— μ €μž₯ν•  λ•Œ μœ μš©ν•©λ‹ˆλ‹€.

2. DOM μ‘°μž‘ 및 μ ‘κ·Ό:

JavaScript둜 μš”μ†Œμ— μ €μž₯된 데이터λ₯Ό μ‰½κ²Œ μ ‘κ·Όν•˜κ³  μ‘°μž‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

3. CSS μŠ€νƒ€μΌλ§:

νŠΉμ • 속성 값에 따라 μŠ€νƒ€μΌμ„ λ‹€λ₯΄κ²Œ μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

2️⃣ Attribute Selectorλž€?

 

CSSμ—μ„œ νŠΉμ • 속성을 κ°€μ§„ μš”μ†Œλ₯Ό μ„ νƒν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” μ„ νƒμžμž…λ‹ˆλ‹€. 데이터 속성과 ν•¨κ»˜ μ‚¬μš©ν•˜λ©΄ κ°•λ ₯ν•œ μŠ€νƒ€μΌλ§ 도ꡬ가 λ©λ‹ˆλ‹€.

 

문법

 

/* νŠΉμ • 속성을 κ°€μ§„ λͺ¨λ“  μš”μ†Œ 선택 */

[attribute] {

  /* μŠ€νƒ€μΌ μ •μ˜ */

}

 

/* νŠΉμ • 속성과 값을 κ°€μ§„ μš”μ†Œ 선택 */

[attribute="value"] {

  /* μŠ€νƒ€μΌ μ •μ˜ */

}

 

/* 속성 값이 νŠΉμ • λ¬Έμžμ—΄λ‘œ μ‹œμž‘ν•˜λŠ” 경우 */

[attribute^="prefix"] {

  /* μŠ€νƒ€μΌ μ •μ˜ */

}

 

/* 속성 값이 νŠΉμ • λ¬Έμžμ—΄λ‘œ λλ‚˜λŠ” 경우 */

[attribute$="suffix"] {

  /* μŠ€νƒ€μΌ μ •μ˜ */

}

 

/* 속성 값에 νŠΉμ • λ¬Έμžμ—΄μ΄ ν¬ν•¨λœ 경우 */

[attribute*="substring"] {

  /* μŠ€νƒ€μΌ μ •μ˜ */

}

 

3️⃣ 데이터 속성과 Attribute Selector의 ν™œμš© 예제

 

1. 동적 μŠ€νƒ€μΌλ§

 

데이터 속성을 기반으둜 μš”μ†Œμ˜ μƒνƒœμ— 따라 μŠ€νƒ€μΌμ„ λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

HTML

 

<button data-status="active">Active</button>

<button data-status="inactive">Inactive</button>

 

CSS

 

button[data-status="active"] {

  background-color: green;

  color: white;

}

 

button[data-status="inactive"] {

  background-color: gray;

  color: white;

}

 

2. JavaScript둜 데이터 속성 읽고 μ“°κΈ°

 

읽기

 

const button = document.querySelector('button[data-status="active"]');

console.log(button.dataset.status); // "active"

 

μ“°κΈ°

 

button.dataset.status = 'inactive';

console.log(button.dataset.status); // "inactive"

 

3. 필터링 κΈ°λŠ₯ κ΅¬ν˜„

 

μ‚¬μš©μžκ°€ μ„ νƒν•œ μ˜΅μ…˜μ— 따라 데이터 속성을 ν™œμš©ν•΄ 필터링을 κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

HTML

 

<div class="item" data-category="fruit">Apple</div>

<div class="item" data-category="fruit">Banana</div>

<div class="item" data-category="vegetable">Carrot</div>

<div class="item" data-category="vegetable">Broccoli</div>

 

JavaScript

 

const filterItems = (category) => {

  const items = document.querySelectorAll('.item');

  items.forEach((item) => {

    if (item.dataset.category === category) {

      item.style.display = 'block';

    } else {

      item.style.display = 'none';

    }

  });

};

 

// μ˜ˆμ‹œ: "fruit" μΉ΄ν…Œκ³ λ¦¬λ§Œ ν‘œμ‹œ

filterItems('fruit');

 

4️⃣ Attribute Selector κ³ κΈ‰ μ‚¬μš©λ²•

 

1. 속성 κ°’ λΆ€λΆ„ 일치

 

속성 κ°’μ˜ 일뢀가 νŠΉμ • 쑰건을 λ§Œμ‘±ν•  λ•Œ μŠ€νƒ€μΌλ§.

 

HTML

 

<div data-type="promo-banner">Promotional Banner</div>

<div data-type="promo-popup">Promotional Popup</div>

 

CSS

 

/* "promo-"둜 μ‹œμž‘ν•˜λŠ” λͺ¨λ“  μš”μ†Œ 선택 */

div[data-type^="promo-"] {

  border: 2px solid red;

}

 

2. μ‚¬μš©μž μ •μ˜ 속성을 μ΄μš©ν•œ ν…Œλ§ˆ 적용

 

νŠΉμ • ν…Œλ§ˆμ— 따라 μŠ€νƒ€μΌμ„ λ‹€λ₯΄κ²Œ 적용.

 

HTML

 

<div class="card" data-theme="light">Light Theme</div>

<div class="card" data-theme="dark">Dark Theme</div>

 

CSS

 

.card[data-theme="light"] {

  background-color: white;

  color: black;

}

 

.card[data-theme="dark"] {

  background-color: black;

  color: white;

}

 

5️⃣ 데이터 속성과 Attribute Selectorλ₯Ό μ‚¬μš©ν•  λ•Œ μ£Όμ˜ν•  점

1. μ˜λ―Έμ™€ λͺ©μ μ— 맞게 μ‚¬μš©ν•˜κΈ°:

데이터 속성은 HTML ꡬ쑰λ₯Ό κΉ¨λ—ν•˜κ²Œ μœ μ§€ν•˜λ©΄μ„œ, ν•„μš”ν•œ 데이터λ₯Ό μ €μž₯ν•˜λŠ” 데 μ ν•©ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ κ³Όλ„ν•˜κ²Œ μ‚¬μš©ν•˜λ©΄ μ½”λ“œ 가독성이 λ–¨μ–΄μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.

2. ν‘œμ€€ μ†μ„±κ³Όμ˜ 좩돌 λ°©μ§€:

데이터 속성은 data-둜 μ‹œμž‘ν•˜λ―€λ‘œ ν‘œμ€€ 속성과 μΆ©λŒν•  μœ„ν—˜μ΄ μ μ§€λ§Œ, μœ μ‚¬ν•œ 이름을 ν”Όν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

3. λ³΄μ•ˆ:

데이터 속성에 λ―Όκ°ν•œ 정보λ₯Ό μ €μž₯ν•˜μ§€ λ§ˆμ„Έμš”. ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ μ‰½κ²Œ 읽을 수 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€.

 

6️⃣ κ²°λ‘ : 데이터 속성과 Attribute Selector의 힘

 

데이터 속성과 Attribute SelectorλŠ” ν”„λ‘ νŠΈμ—”λ“œ κ°œλ°œμžμ—κ²Œ 맀우 κ°•λ ₯ν•œ λ„κ΅¬μž…λ‹ˆλ‹€.

데이터 속성은 HTML μš”μ†Œμ— μΆ”κ°€ 정보λ₯Ό μ €μž₯ν•˜κ³ ,

Attribute SelectorλŠ” CSS와 JavaScript둜 μš”μ†Œλ₯Ό λ™μ μœΌλ‘œ μ‘°μž‘ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.

 

이 두 κ°€μ§€λ₯Ό 잘 ν™œμš©ν•˜λ©΄, 더 κΉ”λ”ν•˜κ³  μœ μ§€λ³΄μˆ˜ν•˜κΈ° μ‰¬μš΄ μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이제 데이터 속성과 Attribute Selector둜 πŸŒ·μ „μ„€μ˜ κ°œλ°œμžκ°€ λ˜μ–΄λ΄…μ‹œλ‹Ή! 🌷

 

πŸ“š HTML5 Data Attributes: κ°œλ°œμžκ°€ μ•Œμ•„μ•Ό ν•  λͺ¨λ“  것!

 

HTML의 data-attributesλŠ” κ°„λ‹¨ν•˜λ©΄μ„œλ„ κ°•λ ₯ν•œ κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€. ν‘œμ€€ μ†μ„±μœΌλ‘œλŠ” λΆ€μ‘±ν•œ 경우, 데이터λ₯Ό μ €μž₯ν•˜κ³  JavaScriptμ—μ„œ μ ‘κ·Όν•˜κ±°λ‚˜ ν™œμš©ν•  수 있게 ν•΄μ£ΌλŠ” 만λŠ₯ 도ꡬ죠. data-둜 μ‹œμž‘ν•˜λŠ” 속성은 HTML μš”μ†Œμ— μž„μ˜μ˜ 데이터λ₯Ό μ €μž₯ν•˜κ³  JavaScript둜 μ†μ‰½κ²Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이번 κΈ€μ—μ„œλŠ” data-attributes의 κΈ°λ³Έ κ°œλ…, μ£Όμš” νŒ¨ν„΄, ν™œμš© μ˜ˆμ‹œ, 그리고 많이 μ“°μ΄λŠ” data-open, data-disabled, data-checked 같은 속성듀을 μ •λ¦¬ν•΄λ³Όκ²Œμš”! πŸš€

data-attributesλž€?

 

HTML5μ—μ„œ μΆ”κ°€λœ ν‘œμ€€ μ†μ„±μœΌλ‘œ, data-둜 μ‹œμž‘ν•˜λŠ” λͺ¨λ“  속성을 HTML μš”μ†Œμ— 자유둭게 μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

ν˜•μ‹

<div data-key="value"></div>

data-둜 μ‹œμž‘: 속성 이름은 항상 data-둜 μ‹œμž‘ν•΄μ•Ό ν•©λ‹ˆλ‹€.

이름 κ·œμΉ™: data- λ’€μ—λŠ” μ†Œλ¬Έμž, 숫자, λŒ€μ‹œ(-)λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

κ°’: λ¬Έμžμ—΄ ν˜•νƒœμ˜ 값을 μ €μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ™œ data-attributesλ₯Ό μ‚¬μš©ν• κΉŒ?

1. μž„μ‹œ 데이터 μ €μž₯

μ»΄ν¬λ„ŒνŠΈμ˜ μƒνƒœλ‚˜ νŠΉμ • 데이터λ₯Ό DOM μš”μ†Œμ— μ €μž₯ν•  수 μžˆμ–΄μš”.

2. JavaScriptμ™€μ˜ μƒν˜Έμž‘μš©

JavaScript둜 μ‰½κ²Œ 읽고 μˆ˜μ •ν•  수 μžˆμ–΄ 동적인 μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— μœ μš©ν•©λ‹ˆλ‹€.

3. μœ μ—°μ„±

HTML ν‘œμ€€ 속성 외에 데이터λ₯Ό μ €μž₯ν•΄μ•Ό ν•  λ•Œ μ ν•©ν•©λ‹ˆλ‹€.

4. CSSμ™€μ˜ 톡합

CSS의 속성 μ„ νƒμžμ™€ κ²°ν•©ν•΄ λ‹€μ–‘ν•œ μŠ€νƒ€μΌλ§μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€.

data-attributes μ‚¬μš©λ²•

 

1️⃣ HTMLμ—μ„œ μ •μ˜ν•˜κΈ°

<button data-state="open" data-index="3">Click Me</button>

2️⃣ JavaScriptμ—μ„œ μ ‘κ·Όν•˜κΈ°

 

dataset을 μ‚¬μš©

const button = document.querySelector('button');

// 데이터 읽기
console.log(button.dataset.state); // "open"
console.log(button.dataset.index); // "3"

// 데이터 μ„€μ •
button.dataset.state = "closed";
button.dataset.index = "5";

console.log(button.dataset.state); // "closed"
console.log(button.dataset.index); // "5"

data-attributes νŒ¨ν„΄ 총정리!

 

자주 μ‚¬μš©λ˜λŠ” data-attributes νŒ¨ν„΄κ³Ό κ·Έ 역할을 μ•Œμ•„λ΄…μ‹œλ‹€.

 

1. data-open

 

ν™œμš©: λͺ¨λ‹¬, λ“œλ‘­λ‹€μš΄, μ•„μ½”λ””μ–Έ μƒνƒœλ₯Ό λ‚˜νƒ€λ‚Ό λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.

<div class="modal" data-open="true">Modal Content</div>

CSS와 ν•¨κ»˜

.modal[data-open="true"] {
  display: block;
}

.modal[data-open="false"] {
  display: none;
}

JavaScript둜 μƒνƒœ λ³€κ²½

const modal = document.querySelector('.modal');
modal.dataset.open = "false"; // λͺ¨λ‹¬ λ‹«κΈ°

2. data-disabled

 

ν™œμš©: λ²„νŠΌμ΄λ‚˜ UI μš”μ†Œμ˜ λΉ„ν™œμ„±ν™” μƒνƒœλ₯Ό 관리할 λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.

<button class="btn" data-disabled="true">Submit</button>

CSS둜 μŠ€νƒ€μΌλ§

.btn[data-disabled="true"] {
  background-color: #ccc;
  cursor: not-allowed;
  pointer-events: none;
}

JavaScriptμ™€μ˜ μƒν˜Έμž‘μš©

const button = document.querySelector('.btn');
if (button.dataset.disabled === "true") {
  console.log("Button is disabled");
}

3. data-checked

 

ν™œμš©: μ²΄ν¬λ°•μŠ€, ν† κΈ€ μŠ€μœ„μΉ˜ λ“±μ˜ μƒνƒœλ₯Ό λ‚˜νƒ€λ‚Ό λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.

<label>
  <input type="checkbox" data-checked="false">
  Enable Notifications
</label>

CSS 적용

input[data-checked="true"] + label {
  color: green;
}

JavaScript둜 μƒνƒœ λ³€κ²½

const checkbox = document.querySelector('input');
checkbox.dataset.checked = checkbox.checked.toString();
console.log(checkbox.dataset.checked); // true λ˜λŠ” false

4. data-index

 

ν™œμš©: λ¦¬μŠ€νŠΈλ‚˜ 반볡 μš”μ†Œμ—μ„œ 각 μ•„μ΄ν…œμ˜ μˆœμ„œλ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

<ul>
  <li data-index="0">Item 1</li>
  <li data-index="1">Item 2</li>
  <li data-index="2">Item 3</li>
</ul>

JavaScriptμ—μ„œ ν™œμš©

const items = document.querySelectorAll('li');
items.forEach((item) => {
  console.log(item.dataset.index); // 0, 1, 2
});

5. data-role

 

ν™œμš©: μš”μ†Œμ˜ μ—­ν• μ΄λ‚˜ κΈ°λŠ₯을 λ‚˜νƒ€λ‚Ό λ•Œ μœ μš©ν•©λ‹ˆλ‹€.

<div data-role="admin">Admin Panel</div>
<div data-role="user">User Dashboard</div>

CSS μŠ€νƒ€μΌλ§

[data-role="admin"] {
  background-color: red;
}

[data-role="user"] {
  background-color: blue;
}

6. data-toggle

 

ν™œμš©: μš”μ†Œμ˜ ν† κΈ€ μƒνƒœλ₯Ό κ΄€λ¦¬ν•©λ‹ˆλ‹€.

<button data-toggle="false">Toggle Me</button>

JavaScriptμ—μ„œ μƒνƒœ μ „ν™˜

const toggleButton = document.querySelector('button');
toggleButton.addEventListener('click', () => {
  const currentState = toggleButton.dataset.toggle === "true";
  toggleButton.dataset.toggle = (!currentState).toString();
});

μ‹€μ œ ν”„λ‘œμ νŠΈμ—μ„œμ˜ ν™œμš© μ˜ˆμ‹œ

 

예제: νƒ­ μ»΄ν¬λ„ŒνŠΈ

<div class="tabs">
  <button class="tab" data-active="true">Tab 1</button>
  <button class="tab" data-active="false">Tab 2</button>
  <button class="tab" data-active="false">Tab 3</button>
</div>
<div class="panels">
  <div class="panel" data-visible="true">Content 1</div>
  <div class="panel" data-visible="false">Content 2</div>
  <div class="panel" data-visible="false">Content 3</div>
</div>

JavaScript둜 μƒνƒœ μ œμ–΄

const tabs = document.querySelectorAll('.tab');
const panels = document.querySelectorAll('.panel');

tabs.forEach((tab, index) => {
  tab.addEventListener('click', () => {
    tabs.forEach((t) => t.dataset.active = "false");
    panels.forEach((p) => p.dataset.visible = "false");

    tab.dataset.active = "true";
    panels[index].dataset.visible = "true";
  });
});

CSS둜 μŠ€νƒ€μΌλ§

.tab[data-active="true"] {
  font-weight: bold;
  border-bottom: 2px solid blue;
}

.panel[data-visible="false"] {
  display: none;
}

μž₯점과 ν•œκ³„

 

μž₯점

1. HTML에 데이터λ₯Ό λͺ…μ‹œμ μœΌλ‘œ ν‘œν˜„ κ°€λŠ₯.

2. JavaScript둜 μ‰½κ²Œ μ ‘κ·Ό κ°€λŠ₯.

3. CSS와 ν•¨κ»˜ 속성 μ„ νƒμžλ‘œ μƒνƒœ 관리 κ°€λŠ₯.

 

ν•œκ³„

1. 데이터 λ³΄μ•ˆ: ν΄λΌμ΄μ–ΈνŠΈ μΈ‘μ—μ„œ 데이터λ₯Ό μ‰½κ²Œ λ³Ό 수 있음.

2. λ³΅μž‘μ„± 증가: μ§€λ‚˜μΉ˜κ²Œ λ§Žμ€ data-attributesλŠ” μ½”λ“œ 가독성을 ν•΄μΉ  수 있음.

κ²°λ‘ : data-attributes, μ–Έμ œ μ‚¬μš©ν• κΉŒ?

 

data-attributesλŠ” 가볍고 μœ μ—°ν•œ 데이터 μ €μž₯ 및 μƒνƒœ 관리λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ 적절히 μ‚¬μš©ν•΄μ•Ό μ½”λ“œμ˜ 가독성과 μœ μ§€λ³΄μˆ˜μ„±μ΄ 보μž₯λ©λ‹ˆλ‹€.

ν•„μš”ν•œ λ°μ΄ν„°λ§Œ λ‹΄κ³ , μ§€λ‚˜μΉ˜κ²Œ λ³΅μž‘ν•œ μƒνƒœ κ΄€λ¦¬λŠ” JavaScript μƒνƒœ κ΄€λ¦¬λ‘œ λΆ„λ¦¬ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

 

πŸŒ·μ „μ„€μ˜ κ°œλ°œμžκ°€ λ˜μ–΄λ΄…μ‹œλ‹Ή! 🌷

728x90
λ°˜μ‘ν˜•