π λ°μ΄ν° μμ±κ³Ό 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 μν κ΄λ¦¬λ‘ λΆλ¦¬νλ κ²μ΄ μ’μ΅λλ€.
π·μ μ€μ κ°λ°μκ° λμ΄λ΄ μλΉ! π·
'Front-end' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
HMR(Hot Module Replacement): Vite vs Webpack λΉκ΅ π (0) | 2025.02.05 |
---|---|
[WEB] History API: νλ μΉμ λ€λ μ΄μΌκΈ° π (1) | 2024.12.28 |
κ°λ°μλ₯Ό μν SEO: νλ‘ νΈμλ κ°λ°μκ° μμμΌ ν λͺ¨λ κ² π (0) | 2024.11.22 |
[Web Pack] μΉν©, νλ μΉ κ°λ°μ νμ λꡬ! π (3) | 2024.10.28 |
Reactμ Vueμ λΌμ΄νμ¬μ΄ν΄ νΊμ΄λ³΄κΈ° (1) | 2024.10.07 |