parentElement, children, siblings
parentElement,children,nextElementSiblingиpreviousElementSibling— свойства интерфейсаElementдля навигации по DOM-дереву, возвращающие только узлы-элементы (в отличие от аналоговNode, которые возвращают текстовые узлы тоже).
Зачем нужно
Навигация по дереву — фундаментальная операция при работе с DOM. Свойства Element удобнее низкоуровневых аналогов Node (parentNode, childNodes), так как игнорируют пробельные текстовые узлы и работают только с HTML-элементами.
Где используется
- Переход к родительскому контейнеру для изменения стиля или данных
- Итерация по дочерним элементам (вкладки, список, таблица)
- Навигация по соседним элементам (предыдущий/следующий слайд, пункт меню)
Свойства
const el = document.querySelector('.item');
// Родитель (Element или null)
el.parentElement;
// Все дочерние элементы (живая HTMLCollection, без текстовых узлов)
el.children;
el.children[0]; // первый дочерний элемент
el.children.length; // количество дочерних
// Первый и последний дочерние элементы
el.firstElementChild;
el.lastElementChild;
// Соседние элементы
el.nextElementSibling;
el.previousElementSibling;
Примеры
Переход к родителю
const btn = document.querySelector('.card__btn');
// Подняться до .card и удалить
const card = btn.parentElement;
card.remove();
// Несколько уровней вверх
const section = btn.parentElement.parentElement;
Итерация по children
const tabs = document.querySelector('.tabs');
[...tabs.children].forEach((tab, index) => {
tab.addEventListener('click', () => {
// Убрать active у всех
[...tabs.children].forEach(t => t.classList.remove('active'));
// Добавить active текущему
tab.classList.add('active');
showPanel(index);
});
});
Навигация по соседям (карусель)
const slider = document.querySelector('.slider');
let current = slider.firstElementChild;
current.classList.add('active');
document.getElementById('next').addEventListener('click', () => {
current.classList.remove('active');
current = current.nextElementSibling || slider.firstElementChild;
current.classList.add('active');
});
document.getElementById('prev').addEventListener('click', () => {
current.classList.remove('active');
current = current.previousElementSibling || slider.lastElementChild;
current.classList.add('active');
});
Индекс элемента среди соседей
function getIndex(el) {
let index = 0;
let prev = el.previousElementSibling;
while (prev) {
index++;
prev = prev.previousElementSibling;
}
return index;
}
// Современный способ через children
function getIndexModern(el) {
return [...el.parentElement.children].indexOf(el);
}
Частые ошибки
childrenvschildNodes—childrenвозвращает только Element-узлы (HTMLCollection),childNodes— все узлы включая текстовые; в большинстве случаев нуженchildren.HTMLCollectionне является массивом — нельзя применять методы массивов напрямую; используйтеArray.from(el.children)или[...el.children].parentElementуdocument— у элемента<html>parentElementравенnull; уdocumentнетparentElementвовсе.
Связанные темы
- _MOC DOM
- _MOC JavaScript
- firstChild, lastChild, nextSibling
- closest -- поиск родителя
- createElement и createTextNode