Це досить об’ємна тема, проте робить простішим її вивчення те, що тут ми багато працюєм і бачим результат на фронтенді. Тобто ми можем додавати і видаляти елементи на сторінці, міняти 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-теги — використовуйте:
children
firstElementChild
nextElementSibling
🔸 Якщо потрібно бачити все (включно з пробілами/текстом) — використовуйте:
childNodes
firstChild
nextSibling
Події та слухачі подій в 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/