DOM (Document Object Model) 이란 ?
DOM
이란 HTML
문서를 객체로 표현한 것으로, JS
에서 HTML
을 제어할 수 있게 해줍니다.DOM API
라고 합니다.const element = document.querySelector("h1");
console.log(element.textContent);
Node
: HTML
요소, 텍스트, 주석 등 모든 것을 의미합니다.Element
: HTML
요소를 의미합니다.<body>
<div class="parent">
<!-- 주석 -->
<div class="child">1</div>
텍스트1
<div class="child">2</div>
텍스트2
</div>
</body>
const parent = document.querySelector(".parent");
// 부모 요소의 모든 자식 노드 확인 !
console.log(parent.childNodes);
// 부모 요소의 모든 자식 요소 확인 !
console.log(parent.children);
HTML
id
속성(Attributes) 값으로 검색한 요소를 반환합니다.null
을 반환합니다.html
<body>
<div class="parent">
<!-- 주석 -->
<div class="child">1</div>
텍스트1
<div id="child2" class="child">2</div>
텍스트2
</div>
</body>
main.js
const el = document.getElementById('child2')
console.log(el) // <div id="child2" class="child">2</div>
const el = document.getElementById('child')
console.log(el) // null
null
을 반환합니다.const el = document.querySelector(".child:first-child");
console.log(el); // <div class="child">1</div>
NodeList
로 반환합니다.NodeList
객체는 forEach()
를 사용할 수 있습니다.const nodeList = document.querySelectorAll(".child");
console.log(nodeList);
nodeList.forEach((el) => console.log(el.textContent)); // 1 2
// Array.from메소드를 통해 유사배열을 배열로 바꿀 수 있습니다.
console.log(Array.from(nodeList).reverse());
const el = document.querySelector(".child");
console.log(el.parentElement); // <div class="parent">…</div>
null
을 반환합니다.const el = document.querySelector(".child");
console.log(el.closest("div")); // <div class="child">1</div>
console.log(el.closest("body")); // <body>...</body>
console.log(el.closest(".hello")); // null
const el = document.querySelector(".child");
console.log(el.previousSibling); // #text
console.log(el.nextSibling); // 텍스트1
const el = document.querySelector(".child");
console.log(el.previousElementSibling); // null
console.log(el.nextElementSibling); // <div id="child2" class="child">2</div>
const el = document.querySelector(".parent");
// 유사 배열(HTMLCollection)
console.log(el.children);
// 배열
console.log(Array.from(el.children));
const el = document.querySelector(".parent");
console.log(el.firstElementChild);
console.log(el.lastElementChild);
html
<body>
<div class="parent">
<div class="child">1</div>
<div class="child">2</div>
</div>
</body>
const divEl = document.createElement("div");
console.log(divEl);
const inputEl = document.createElement("input");
console.log(inputEl);
const parentEl = document.querySelector(".parent");
const el = document.createElement("div");
el.textContent = "Hello~";
parentEl.prepend(new Comment(" 주석 "));
// append메소드는 여러 번 호출할 필요 없이 인수의 순서대로 동작합니다.
parentEl.append(el, "Text!");
html 결과
<body>
<div class="parent">
<!-- 주석 -->
<div class="child">1</div>
<div class="child">2</div>
<div>Hello~</div>
"Text!"
</div>
</body>
const el = document.querySelector(".child");
el.remove();
html 결과
<body>
<div class="parent">
<div class="child">2</div>
</div>
</body>
대상_요소.insertAdjacentElement(위치, 새로운_요소)
html에서 위치 확인
<body>
<div class="parent">
<!-- 'beforebegin' -->
<div class="child">
<!-- 'afterbegin' -->
1
<!-- 'beforeend' -->
</div>
<!-- 'afterend' -->
<div class="child">2</div>
</div>
</body>
const childEl = document.querySelector(".child");
const newEl = document.createElement("span");
newEl.textContent = "Hello~";
childEl.insertAdjacentElement("beforebegin", newEl);
부모_노드.insertBefore(노드, 참조_노드)
const parentEl = document.querySelector(".parent");
const childEl = document.querySelector(".child");
const newEl = document.createElement("span");
newEl.textContent = "Hello~";
parentEl.insertBefore(newEl, childEl);
HTML 결과
<body>
<div class="parent">
<span>Hello~</span>
<div class="child">1</div>
<div class="child">2</div>
</div>
</body>
const parentEl = document.querySelector(".parent");
const childEl = document.querySelector(".child");
console.log(parentEl.contains(childEl)); // true
console.log(document.body.contains(parentEl)); // true
console.log(document.body.contains(childEl)); // true
console.log(document.body.contains(document.body)); // true
console.log(parentEl.contains(parentEl)); // true
console.log(parentEl.contains(document.body)); // false
console.log(childEl.contains(document.body)); // false
const el = document.querySelector(".child");
console.log(el.textContent); // 1
el.textContent = 7;
console.log(el.textContent); // 7
html
<body>
<div class="parent">
<div class="child">1</div>
<div class="child">2</div>
</div>
</body>
const el = document.querySelector(".parent");
console.log(el.innerHTML);
// <div class="child">1</div>
// <div class="child">2</div>
const el = document.querySelector(".parent");
el.innerHTML = /* html */ `
<div style="border: 4px solid;">
<span style='color: red;'>hello</span>
<span style='color: red;'>hello</span>
</div>
`;
data-
속성 값을 얻거나 지정합니다.const el = document.querySelector(".child");
const str = "Hello world!";
const obj = { a: 1, b: 2 };
el.dataset.helloWorld = str;
el.dataset.object = JSON.stringify(obj);
console.log(el.dataset.helloWorld);
console.log(el.dataset.object);
console.log(JSON.parse(el.dataset.object));
const parentEl = document.querySelector(".parent");
const childEl = document.querySelector(".child");
const el = document.createElement("span");
console.log(parentEl.tagName); // DIV
console.log(childEl.tagName); // DIV
console.log(el.tagName); // SPAN
console.log(document.body.tagName); // BODY
id
속성 값을 얻거나 지정합니다.const el = document.querySelector(".child");
console.log(el.id); // ""
el.id = "child1";
console.log(el.id); // child1
console.log(el); // <div class="child" id="child1">1</div>
class
속성 값을 얻거나 지정합니다.const el = document.querySelector(".child");
console.log(el.className); // child
el.className += " child1 active";
console.log(el.className); // child child1 active
console.log(el); // <div class="child child1 active">1</div>
class
속성 값을 제어합니다..add()
: 새로운 값을 추가합니다..remove()
: 기존 값을 제거합니다..toggle()
: 값을 토글합니다..contains()
: 값을 확인합니다.const el = document.querySelector(".child");
el.classList.add("active");
console.log(el.classList.contains("active")); // true
el.classList.remove("active");
console.log(el.classList.contains("active")); // false
el.addEventListener("click", () => {
el.classList.toggle("active");
console.log(el.classList.contains("active"));
});
style
속성(인라인 스타일)의 CSS 속성 값을 얻거나 지정합니다.const el = document.querySelector(".child");
// 개별 지정 !
// el.style.width = "100px";
// el.style.fontSize = "20px";
// el.style.backgroundColor = "green";
// el.style.position = "absolute";
// 한 번에 지정 !
Object.assign(el.style, {
width: "100px",
fontSize: "20px",
backgroundColor: "green",
position: "absolute",
});
console.log(el.style);
console.log(el.style.width); // 100px
console.log(el.style.fontSize); // 20px
console.log(el.style.backgroundColor); // green
console.log(el.style.position); // absolute
E.style
은 인라인 작성방식으로 적용된 내용만 반환하는데 반해, window.getComputedStyle()
은 실제로 요소에 적용된 CSS 내용을 반환합니다.const el = document.querySelector(".child");
const styles = window.getComputedStyle(el);
console.log(styles.width);
console.log(styles.fontSize);
console.log(styles.backgroundColor);
console.log(styles.position);
const el = document.querySelector(".child");
el.setAttribute("title", "Hello World!");
console.log(el); // <div class="child" title="Hello World!">1</div>
console.log(el.getAttribute("title")); // Hello World!
const el = document.querySelector(".child");
console.log(el.hasAttribute("class")); // true
el.removeAttribute("class");
console.log(el.hasAttribute("class")); // false
console.log(el); // <div>1</div>
<body>
<div class="parent">
<div class="child">1</div>
<div class="child">2</div>
</div>
</body>
body {
height: 1000px;
padding: 500px 0;
}
.parent {
width: 300px;
height: 200px;
margin-top: 1000px;
padding: 20px;
overflow: auto;
border: 10px solid;
}
.child {
height: 100px;
margin-top: 100px;
border: 10px solid red;
}
console.log(window.innerWidth);
console.log(window.innerHeight);
console.log(window.scrollX, window.scrollY);
대상.scrollTo(X좌표, Y좌표)
대상.scrollTo({ top: Y, left: X, behavior: 'smooth'})
setTimeout(() => {
window.scrollTo(0, 500);
}, 1000);
// 작성한 좌표로의 이동이 부드럽게 작동합니다.
setTimeout(() => {
window.scrollTo({ top: 1000, left: 0, behavior: "smooth" });
}, 2000);
const parentEl = document.querySelector(".parent");
setTimeout(() => {
parentEl.scrollTo({ top: 200, left: 0, behavior: "smooth" });
}, 1000);
const parentEl = document.querySelector(".parent");
const childEl = document.querySelector(".child");
console.log(parentEl.clientWidth, parentEl.clientHeight); // 340 200
console.log(childEl.clientWidth, childEl.clientHeight); // 280 100
const parentEl = document.querySelector(".parent");
const childEl = document.querySelector(".child");
console.log(parentEl.offsetWidth, parentEl.offsetHeight); // 360 260
console.log(childEl.offsetWidth, childEl.offsetHeight); // 300 120
window.parentEl = document.querySelector(".parent");
console.log(parentEl.scrollLeft, parentEl.scrollTop);
const parentEl = document.querySelector(".parent");
const childEl = document.querySelector(".child");
console.log(parentEl.offsetLeft, parentEl.offsetTop);
console.log(childEl.offsetLeft, childEl.offsetTop);
const parentEl = document.querySelector(".parent");
const childEl = document.querySelector(".child");
console.log(parentEl.getBoundingClientRect());
console.log(childEl.getBoundingClientRect());