Це досить об’ємна тема, проте робить простішим її вивчення те, що тут ми багато працюєм і бачим результат на фронтенді. Тобто ми можем додавати і видаляти елементи на сторінці, міняти css стилі за домомогою DOM маніпуляції, змінювати різноманітні властивості елементів залежно від зміни розмірів екрану і ще багато всього. Почнемо з простих основ і прикладів і в кінцв статті буде великий список у форматі: питання – відповідь щоб легше було повторяти цю тему потім і освіжати знання.
Що таке DOM?
DOM (Document Object Model) – це об’єктна модель документа, яка представляє HTML-сторінку у вигляді дерева вузлів. DOM є частиною стандарту, який дозволяє програмно змінювати структуру, стиль і вміст веб-сторінки за допомогою JavaScript. У цій ієрархії є кореневий вузол document, який містить html, а той у свою чергу – head і body, всередині яких знаходяться інші елементи. DOM включає різні типи вузлів: елементи, текст, атрибути та коментарі. За допомогою DOM API можна динамічно змінювати веб-сторінку: додавати і видаляти елементи, змінювати стилі та взаємодіяти з подіями через Event API.

DOM включає різні типи вузлів:
- Element nodes – це самі HTML-елементи (
<div>,<p>,<a>і т.д.). - Text nodes – це текстові вузли, які знаходяться всередині елементів.
- Attribute nodes – це вузли, які представляють атрибути HTML-елементів.
- Comment nodes – це вузли, які містять коментарі в коді (
<!-- коментар -->).
DOM дозволяє динамічно змінювати структуру та стиль веб-сторінки.
Що ми можемо робити з DOM

Додавати та видаляти HTML-елементи, заміняти одні елементи іншими.

Змінювати вміст та атрибути елементів. Додавати слухачі подіій щоб реагувати як нам потрібно на будь які зміни на сторінці.

Маніпулювати CSS-стилями, додаючи стилі напряму як інлайн стилі або змінювати клас елемента, що впливає на його стидізацію.
Як вибирати елементи в DOM
Щоб щось зробити з елементами DOM, вам спочатку потрібно вибрати або отримати доступ до відповідного елемента. У цьому розділі ви дізнаєтесь про деякі поширені методи вибору елементів DOM.
document.getElementById(id)
Повертає лише один елемент, оскільки id має бути унікальним у межах сторінки. Якщо елемент з таким id не знайдено, повертає null.
let element = document.getElementById('myId');
document.getElementsByClassName(className)
Вибирає всі елементи, які мають вказаний клас. Повертає HTMLCollection (живу колекцію), яка автоматично оновлюється при зміні DOM. Якщо елементів не знайдено, повертає порожню колекцію.
let elements = document.getElementsByClassName('myClass');
document.getElementsByTagName(tagName)
Вибирає всі елементи з вказаним тегом (наприклад, div, p, a).Повертає HTMLCollection (живу колекцію), яка автоматично оновлюється при зміні DOM. Якщо елементів не знайдено, повертає порожню колекцію.
let element = document.getElementById('myId');
document.querySelector(selector)
Вибирає перший елемент, який відповідає вказаному CSS-селектору. Повертає лише один елемент. Якщо елемент не знайдено, повертає null. Може використовувати будь-який CSS-селектор.
let element = document.querySelector('.myClass');
document.querySelectorAll(selector)
Вибирає всі елементи, які відповідають вказаному CSS-селектору. Повертає NodeList (статичну колекцію), яка не оновлюється автоматично при зміні DOM. Якщо елементів не знайдено, повертає порожню колекцію. Може використовувати будь-який CSS-селектор.
let elements = document.querySelectorAll('.myClass');
document.getElementsByName(name)
Вибирає всі елементи з вказаним значенням атрибута name. Повертає NodeList (статичну колекцію), яка не оновлюється автоматично при зміні DOM.
let elements = document.getElementsByName('myName');
Як змінити вміст елементів DOM
innerHTML
innerHTML дозволяє змінювати або отримувати HTML-вміст елемента.
let content = document.getElementById("myElement").innerHTML;
console.log(content); // Виведе поточний HTML-код всередині елемента
📌 Коли варто використовувати?
- ✅Якщо потрібно додати HTML-код.
- ✅Якщо треба вставити багато тегів.
⚠️ Мінуси:
- ⛔️Може спричинити проблеми з безпекою (XSS-атаки, якщо вставляти користувацький ввід).
- ⛔️Повністю перезаписує вміст (може видалити вкладені обробники подій).
innerText
innerText дозволяє змінювати або отримувати текстовий вміст елемента, без тегів.
document.getElementById("myElement").innerText = "Привіт, світ!";
📌 Яка Відмінність від innerHTML?
innerText не інтерпретує HTML-теги, а просто вставляє текст.
textContent
innerHTML дозволяє змінювати або отримувати HTML-вміст елемента.
<div id="myElement" style="display: none;">Прихований текст</div>
console.log(document.getElementById("myElement").textContent); // "Прихований текст"
📌 Коли варто використовувати textContent замість innerText?
textContent повертає ВЕСЬ текст елемента, навіть прихований за CSS (display: none). innerText не повертає прихований текст.
value
Якщо потрібно змінити текст в полях введення (<input> або <textarea>), то використовуйте value:
<input type="text" id="myInput" value="Старий текст">
document.getElementById("myInput").value = "Новий текст";
📌 Коли варто використовувати?
Для зміни вмісту полів введення (<input>, <textarea>).
createTextNode
Якщо треба додати текст без ризику вставки HTML, можна використовувати createTextNode().
let newText = document.createTextNode("Привіт, світ!");
document.getElementById("myElement").appendChild(newText);
📌 Перевага: не дозволяє вставку HTML, тому безпечніше.
insertAdjacentHTML
Якщо потрібно вставити HTML без перезапису всього вмісту елемента:
document.getElementById("myElement").insertAdjacentHTML("beforeend", "<b>Додатковий текст</b>");
📌 Режими вставки:
"beforebegin"– перед елементом."afterbegin"– всередині, перед наявним вмістом."beforeend"– всередині, після наявного вмісту."afterend"– після елемента.
Отже, використовуєм:
innerHTML– якщо треба вставити HTML.innerTextабоtextContent– якщо тільки текст.-
value– якщо змінюєш текст в<input>або<textarea>. -
createTextNode()– якщо треба безпечна вставка тексту. -
insertAdjacentHTML()– якщо треба вставити HTML у конкретне місце.
Робота зі стилями елементів в DOM
Всього є 5 основних способів зміни стилів через DOM:
1. Властивість style (inline-стилі)
Цей метод дозволяє змінювати стилі елемента безпосередньо через JavaScript.
Синтаксис:
element.style.property = "значення";
❗️Стилі змінюються лише для конкретного елемента, а не для всіх подібних.
🔅 Важливі моменти:
- ✅Використовуємо camelCase (без
-між словами). Наприклад,background-color→backgroundColor. - ✅Працює тільки для inline-стилів (ті, що безпосередньо додаються до елемента).
const box = document.getElementById("box"); // Отримуємо елемент
box.style.backgroundColor = "red"; // Змінюємо колір фону
box.style.width = "200px"; // Встановлюємо ширину
box.style.height = "100px"; // Встановлюємо висоту
2. CSS-класи classList
Зручніший метод для додавання, видалення або перемикання CSS-класів. Методи classList:
- element.classList.add(“class-name”) – додає клас.
- element.classList.remove(“class-name”) – видаляє клас.
- element.classList.toggle(“class-name”) – додає клас, якщо його немає, або видаляє, якщо є.
- element.classList.contains(“class-name”) – перевіряє, чи є клас.
- element.classList.replace(“old-class”, “new-class”);
✅Можна легко застосовувати стилі з CSS, а не вручну прописувати кожне значення.
const box = document.getElementById("box");
box.classList.add("active"); // Додає клас "active"
box.classList.remove("hidden"); // Видаляє клас "hidden"
box.classList.toggle("selected"); // Якщо "selected" є - видаляє, якщо немає - додає
element.classList.replace("old-class", "new-class");// Якщо "old-class" є, він змінюється на "new-class".
3. getComputedStyle – отримання поточних стилів
Якщо треба дізнатися, який стиль зараз застосований до елемента.
✅Показує реальний стиль, навіть якщо він заданий через CSS, а не style
const box = document.getElementById("box");
const styles = getComputedStyle(box);
console.log(styles.backgroundColor); // Виведе, наприклад, "rgb(255, 0, 0)"
//Синтаксис:
getComputedStyle(element)
getComputedStyle(element, pseudoElt)
4. Додавання стилів через setAttribute
Недолік: Перезаписує всі попередні inline-стилі.
const box = document.getElementById("box");
box.setAttribute("style", "background-color: blue; width: 150px;");
5. Створення та додавання стилів через Style
Якщо потрібно додати стилі через JavaScript в <style>.
✅Показує реальний стиль, навіть якщо він заданий через CSS, а не style
const style = document.createElement("style");
style.textContent = `
.dynamic-style {
color: white;
background-color: black;
padding: 10px;
}
`;
document.head.appendChild(style); // Додаємо стиль у <head>
const box = document.getElementById("box");
box.classList.add("dynamic-style"); // Додаємо клас до елемента
element - це елемент, для якого потрібно отримати обчислений стиль.
pseudoElt - не обовязковий параметр, цеядок, що вказує псевдоелемент для збігу.Що обрати?
| Метод | Переваги | Недоліки |
|---|---|---|
| .style | Простий у використанні | Перезаписує inline-стилі, погано для масштабування |
| .classList | Використовує CSS-класи, легко змінювати | Не можна отримати конкретний стиль |
| getComputedStyle(element) або getComputedStyle(element, pseudoElt) | Дозволяє дізнатися реальні стилі елемента | Тільки для читання |
| setAttribute(“element”, “…”) | Можна встановити багато стилів одночасно | Перезаписує всі inline-стилі |
| Додавання в <style> | Дозволяє глобальні зміни | Трохи складніше, ніж .classList |
🔹 Рекомендація: Якщо стилі часто змінюються, краще працювати через classList. Якщо треба змінити щось разово – можна через style.
Робота з атрибутами елементів в DOM
Робота з атрибутами елементів у DOM в JavaScript дозволяє змінювати поведінку та вигляд HTML-елементів, додавати їм додаткові властивості або отримувати значення вже встановлених атрибутів.
Що таке атрибути елементів?
Атрибути — це додаткові властивості елементів HTML, які визначають їх поведінку або зовнішній вигляд.
У JavaScript ми можемо:
Отримувати значення атрибутів, змінювати їх, додавати нові, видаляти. Наприклади атрибутів:
id— унікальний ідентифікатор елементаclass— клас для застосування стилівsrc— шлях до зображення для тегу<img>href— посилання для тегу<a>alt— альтернативний текст для зображення (якщо зображення не завантажиться)type— визначає тип елемента форми (наприклад, текст, пароль, кнопка)value— значення елемента форми (наприклад, текст у полі вводу)placeholder— текст-підказка для поля вводуdisabled— робить елемент форми неактивнимcontrols— додає елементам відео чи аудіо кнопки управління (відтворення, пауза тощо)autoplay— автоматичне відтворення відео чи аудіоloop— повторне відтворення мультимедіаcolspan— об’єднує кілька стовпців у таблиціrowspan— об’єднує кілька рядків у таблиціdata-*— користувацькі атрибути, які можна використовувати для зберігання додаткової інформаціїaria-*— атрибути для покращення доступності веб-сторінокtitle— текст, який з’являється при наведенні на елементstyle— додає вбудовані стилі до елемента
Основні методи для роботи з атрибутами
| Метод | Опис |
|---|---|
getAttribute(name) | отримати значення атрибута |
setAttribute(name, value) | додати або змінити атрибут |
hasAttribute(name) | перевірити, чи є атрибут |
removeAttribute(name) | видалити атрибут |
//Приклад HTML: <img id="myImg" src="cat.jpg" alt="Коте-муркоте, коте - красоте">
const srcValue = img.getAttribute('src');
console.log(srcValue); // ➡️ "cat.jpg"
img.setAttribute('src', 'dog.jpg');
//setAttribute має 2 аргументи:
//перший — назва атрибута, "src"
//другий — нове значення, "dog.jpg"
//Якщо src вже був — він зміниться.
//Якщо src не було — він додасться.
if (img.hasAttribute('alt')) {
console.log('Є опис картинки!');
}//hasAttribute('alt') повертає true, якщо атрибут є, і false — якщо немає.
img.removeAttribute('alt');//Видаляє атрибут alt. Після цього опис картинки зникне.
//Ще приклад: робота з data-* атрибутами
//<button id="buyBtn" data-product-id="12345">Купити</button>
const btn = document.getElementById('buyBtn');
const productId = btn.getAttribute('data-product-id');
console.log(productId); // ➡️ "12345"
//Атрибути, які починаються з data-, ми часто використовуємо для зберігання додаткових даних.
//Альтернатива: dataset
console.log(btn.dataset.productId); // ➡️ "12345"
// Тут:
//dataset — спеціальний об'єкт у JS
//productId — назва частини після data-, але без дефісівЯк переміщатись серед елементів в DOM
У DOM є цілий набір властивостей, які дозволяють нам переходити:
- від батьківського елемента до дочірнього
- від дочірнього до батьківського
- між сусідніми елементами (братами/сестрами)
- або отримати список усіх дітей
| Властивість | Пояснення |
|---|---|
parentNode | Повертає батьківський вузол |
childNodes | Повертає всі дочірні вузли (включно з текстовими, пробілами) |
children | Повертає тільки дочірні елементи (без тексту і коментарів) |
firstChild | Повертає першу дитину (може бути текстовим вузлом) |
firstElementChild | Повертає перший дочірній елемент батьківського |
lastChild | Повертає останню дитину – нод, батьківського елемента |
lastElementChild | Повертає останній дочірній елемент |
nextSibling | Повертає наступного сусіднього вузла в межах того ж батьківського елемента |
nextElementSibling | Повертає наступний елемент (тег) та ігнорує ноди які е є елементами |
previousSibling | Повертає попереднього сусіда (може бути текстом) який знаходиться в межах тго ж батьківського елемента |
previousElementSibling | Повертає попередній елемент та ігнорує ноди які не є елементами (текст, коментар, перенос рядка – це все ноди які не є елементами) |
const container = document.getElementById("container");
// 1. Діти (всі вузли, включаючи пробіли)
console.log(container.childNodes); // NodeList(5): текст, <p>, текст, <p>, текст
// 2. Тільки елементи
console.log(container.children); // HTMLCollection(2): <p>, <p>
// 3. Перший і останній елемент
console.log(container.firstElementChild); // <p>Перший абзац</p>
console.log(container.lastElementChild); // <p>Другий абзац</p>
// 4. Батьківський елемент
console.log(container.parentNode); // <body> або інший батько
// 5. Сусіди
const firstP = container.firstElementChild;
console.log(firstP.nextElementSibling); // <p>Другий абзац</p>
console.log(firstP.previousElementSibling); // null (бо це перший)
const secondP = firstP.nextElementSibling;
console.log(secondP.previousElementSibling); // <p>Перший абзац</p>
💡 Дуже важливо пам’ятати:
childNodesвключає всі вузли, навіть пробіли і перенос рядка, бо вони — це теж текстові вузли.- Якщо хочете працювати тільки з тегами (елементами) — використовуйте
children,firstElementChild,nextElementSiblingі подібні.
Різниця між вузлом та елементом
Розібратися в різниці між вузлом (node) і елементом (element) — це ключ до глибшого розуміння DOM.
Що таке Node (вузол)?
У DOM все, що є частиною HTML-документа, є вузлом (node):
- HTML-теги — це елементи (element nodes)
- Текст між тегами — це текстові вузли (text nodes)
- Коментарі — це comment nodes
- Навіть сам
<document>— це теж вузол
Тобто:
“Усі елементи — це вузли, але не всі вузли — це елементи.”
Наочний приклад:
<div id="myDiv">
<p>Привіт</p>
<span>Світ</span>
</div>
div (element node)
├── текстовий вузол ("\n ")
├── p (element node)
│ └── текстовий вузол ("Привіт")
├── текстовий вузол ("\n ")
├── span (element node)
│ └── текстовий вузол ("Світ")
└── текстовий вузол ("\n")
🧪 КОД: Порівняння childNodes vs children
const div = document.querySelector('#myDiv');
console.log('childNodes:', div.childNodes);
console.log('children:', div.children);
🔸 div.childNodes — це всі вузли, включно з пробілами, переносами рядків, текстом і тегами
NodeList(5) [
#text, // перенос рядка або пробіл перед <p>
<p>, // тег <p>
#text, // перенос після </p>
<span>, // тег <span>
#text // перенос після </span>
]
🔸 div.children — це тільки елементи, тобто теги (HTML елементи):
HTMLCollection(2) [
<p>Привіт</p>,
<span>Світ</span>
]
✅ Перенос рядка (\n), пробіли і текст типу "Привіт" — це всі text node (текстові вузли).
Незалежно від того:
- чи це просто “видимий текст” для користувача (
Привіт) - чи це “невидимий пробіл або перенос рядка” (наприклад, між тегами в HTML)
👉 В обох випадках — це Text Node, тобто вузол з типом nodeType === 3.
🧠 Вам в допомогу — шпаргалка:
| Тип | Вузол? | Елемент? |
|---|---|---|
<div> | ✅ | ✅ |
<p> | ✅ | ✅ |
"Привіт" (текст) | ✅ | ❌ |
Коментар <!-- Hello --> | ✅ | ❌ |
\n (перенос рядка або пробіл у HTML) | ✅ | ❌ |
✨ Як перевірити тип вузла?
const p = document.querySelector('p');
console.log(p.nodeType); // 1 — це ELEMENT_NODE
const textNode = p.firstChild;
console.log(textNode.nodeType); // 3 — це TEXT_NODE
Типи вузлів:
| nodeType (.nodeType) | Значення (.nodeValue) |
|---|---|
1 | Елемент (element) |
3 | Текст (text) |
8 | Коментар (comment) |
💡 Порада:
🔸 Якщо хочете тільки HTML-теги — використовуйте:
childrenfirstElementChildnextElementSibling
🔸 Якщо потрібно бачити все (включно з пробілами/текстом) — використовуйте:
childNodesfirstChildnextSibling
Події та слухачі подій в DOM
Події та слухачі подій (Event Listeners) є важливими аспектами роботи з Document Object Model (DOM) у JavaScript.
DOM-події – це дії, які відбуваються в браузері. Саме ці події дозволяють робити веб-сайти інтерактивними.
Деякі DOM-події ініціюються користувачем, наприклад, клацання, переміщення миші або введення тексту на клавіатурі. Інші ініціюються браузером, наприклад, коли сторінка завершує завантаження.
Що таке події (Events)?
Події — це дії, що відбуваються на веб-сторінці і можуть бути сприйняті браузером. Події можуть бути різного типу, наприклад декілька з них:
- Користувач клікнув мишкою на кнопку →
click - Навів курсор →
mouseover - Вивів курсор →
mouseout - Натиснув клавішу на клавіатурі →
keydown,keyup - Заповнив інпут →
input,change - Завантажилась сторінка →
load
🧭 Таблиці подій в JavaScript (DOM Events)
| 📌 Назва події | 🧠 Тип події | 📝 Коли спрацьовує |
|---|---|---|
click | Мишка | Коли користувач натискає ліву кнопку миші |
dblclick | Мишка | Коли користувач двічі клацає мишею |
mousedown | Мишка | Коли кнопка миші натискається вниз |
mouseup | Мишка | Коли кнопка миші відпускається |
mousemove | Мишка | Коли курсор миші рухається над елементом |
mouseenter | Мишка | Коли курсор заходить в межі елемента |
mouseleave | Мишка | Коли курсор виходить за межі елемента |
mouseover | Мишка | Коли курсор заходить на елемент (спрацьовує включно з внутрішніми елементами) |
mouseout | Мишка | Коли курсор виходить з елемента (включно з внутрішніми) |
| 📌 Назва події | 🧠 Тип події | 📝 Коли спрацьовує |
|---|---|---|
keydown | Клавіатура | Коли натискається клавіша (спрацьовує одразу) |
keypress | Клавіатура | Коли натискається клавіша, яка друкує символ (застаріле, краще не використовувати) |
keyup | Клавіатура | Коли відпускається клавіша |
| 📌 Назва події | 🧠 Тип події | 📝 Коли спрацьовує |
|---|---|---|
input | Форми / інпут | Коли користувач вводить або змінює значення в <input>, <textarea> |
change | Форми / інпут | Коли значення змінилося і фокус пішов з поля (напр., після натискання Tab) |
submit | Форми | Коли користувач відправляє форму |
focus | Форми | Коли елемент отримує фокус (наприклад, курсор в полі вводу) |
blur | Форми | Коли елемент втрачає фокус |
| 📌 Назва події | 🧠 Тип події | 📝 Коли спрацьовує |
|---|---|---|
load | Вікно / зображення | Коли повністю завантажилась сторінка або зображення |
DOMContentLoaded | Документ | Коли HTML повністю завантажений, без очікування на картинки |
resize | Вікно | Коли змінюється розмір вікна браузера |
scroll | Вікно або блок | Коли користувач скролить сторінку або блок |
unload | Вікно | Коли сторінка закривається (застаріла, краще не використовувати) |
| 📌 Назва події | 🧠 Тип події | 📝 Коли спрацьовує |
|---|---|---|
dragstart | Drag & Drop | Початок перетягування |
drag | Drag & Drop | Під час перетягування |
dragend | Drag & Drop | Коли завершилось перетягування |
dragenter | Drag & Drop | Коли перетягуваний елемент заходить в зону приймача |
dragover | Drag & Drop | Коли перетягуваний елемент знаходиться над зоною приймача |
dragleave | Drag & Drop | Коли елемент залишає зону |
drop | Drag & Drop | Коли елемент “відпускають” |
| 📌 Назва події | 🧠 Тип події | 📝 Коли спрацьовує |
|---|---|---|
contextmenu | Інше | Коли натискається права кнопка миші |
copy | Кліпборд | Коли виконується дія “копіювати” |
cut | Кліпборд | Коли виконується дія “вирізати” |
paste | Кліпборд | Коли щось вставляється |
touchstart | Мобільні пристрої | Коли палець торкається екрана |
touchmove | Мобільні пристрої | Коли палець рухається по екрану |
touchend | Мобільні пристрої | Коли палець відривається від екрана |
Додаткові матеріали до теми JavaScript DOM
Базова інформація для початківців, простою мовою пояснена тема: https://www.freecodecamp.org/news/how-to-manipulate-the-dom-beginners-guide/
Добре структуване і спрощене вивчення матеріалу – мені подобається меню справа сторінки, де прописана вся тема по підтемах, тому одразу видно що де шукати і як багато вчити (також є міні-тести що також круто): https://www.w3schools.com/js/js_htmldom.asp
Хороший сайт, де можна детально почитати про цю тему і в кінці статтей є тести, тому разом з ними краще все прочитане запамятовується: https://www.javascripttutorial.net/javascript-dom/
Ще одна стаття на моєму сайті, я розбила тему DOM на список питань – відповідей, такий формат допомагає швидко повторити вивчене: https://victoriaweb.me/javascript-dom-questions-and-answers/