브라우저는 IP주소를 사용한다고 들었는데, 도메인 주소를 어떻게 IP주소로 바꿀까?
DNS란? (Domain Name System)
- 도메인 이름('naver.com')을 IP주소로 바꿔주는 역할을 하는 시스템 계층
- 일종의 전화번호부 같은 역할
- 이로 인해 숫자로 되어 있는 IP주소를 기억하지 않고 해당 주소의 웹사이트에 접근할 수 있다.
도메인주소를 주면 도메인주소에 해당하는 IP주소를 찾아 리소스를 요청하는 방식
그렇다면 응답으로 온 리소스(HTML)은 어떻게 화면에 그려줄까?
- DOM은 XML, HTML문서에 접근하기 위한 인터페이지
- DOM은 자바스크립트로 접근하여 수정될 수 있다
- CSSOM은 CSS객체 모델로 자바스크립트가 CSS를 동적으로 조작할 수 있게 해준다
- CSSOM은 HTML대신 CSS가 타겟인 DOM이라고 할 수 있다
Layout
이라고 한다Paint
과정을 거친다reflow
, repaint
를 알기위해, Layout
, Paint
부분이 중요Layout
은 앞서 설명했듯이 요소의 위치, 크기를 계산하여 화면에 그리는 과정인데, reflow
와 관련있다Paint
는 배치된 요소에 스타일(색상, 굵기 등)을 적용하는 과정으로 repaint
와 관련있다우선 reflow
는 말 그대로, flow
과정을 다시 하는 것
flow
작업은 곳 layout
이며, reflow
가 된다는 건, 요소의 위치, 크기계산을 다시 한다는 의미
repaint
는 paint
를 다시 하는 것
paint
는 요소에 스타일을 적용하는 과정, repaint
는 요소의 스타일을 재적용하는걸 의미
relow
, repaint
는 브라우저 렌더링의 일부 과정을 다시하는걸 의미el.offsetLeft/offsetTop
el.offsetTop
el.offsetWidth/offsetHeight
el.getClientRects()
el.getBoundingClientRect()
window.scrollX/scrollY
window.innerWidth/innerHeight
window.getComputedStyle()
💡 visibility가 변경되는게 repaint라면, display:none도 repaint일까?
- visibility, display: none 둘 다 요소를 화면에서 숨기는건 유사하다
- 하지만 visibility는 공간을 차지하면서 보이지 않고, display:none은 영역도 차지하지 않는다
- 영역이 없다는건 "렌더트리에서 제외"된다는 의미이기에
- display가 변경되면 주변 요소의 위치, 크기에도 영향을 주어 reflow, repaint가 발생한다
position: absolute
를 적용하자// BAD - reflow 3회 발생
const el1 = document.querySelector('.target-first');
el1.style.width = '10px';
const el2 = document.querySelector('.target-second');
el2.style.width = '10px';
const el3 = document.querySelector('.target-third');
el3.style.width = '10px';
// GOOD - reflow 1회 발생
const el1 = document.querySelector('.target-first');
const el2 = document.querySelector('.target-second');
const el3 = document.querySelector('.target-third');
// dom의 스타일 변경 코드를 한 곳으로 모아둠
el1.style.width = '10px';
el2.style.width = '10px';
el3.style.width = '10px';
// BAD
for (let i = 0; i< 10; i++) {
el.style.width = target.offsetWidth + 10; // 반복문이 돌 때 매번 호출
}
// GOOD
const { offsetWidth } = target; // 한 번 호출해서 변수에 저장
for (let i = 0; i< 10; i++) {
el.style.width = offsetWidth + 10;
}
// BAD
el.style.width = "10px";
el.style.height = "10px";
el.style.borderRadius = "5px";
el.style.backgroundColor = "red";
el.style.left = "20px";
// GOOD
<body>
<script>
el.className = 'small';
</script>
</body>
<style>
.small {
width: 10px;
height: 10px;
border-radius: 5px;
background-color: red;
left: 20px;
}
</style>