사실 좀 이해가 안되는 부분은 이거야. resize이벤트라는건 내가 명시적으로 적용한 resize가 아니라 그냥 플렉스 박스를 적용하든 브라우저 설정이든 아무튼 브라우저 크기를 줄이면 내부 아이템도 같이 그거에 맞게 줄어들잖아 보통은? 근데 여기서 말하는 resize라는 것은 어느쪽인거야?
🤔 'resize' 이벤트와 브라우저 자동 리사이징 구분
사용자가 헷갈리는 부분이 무엇인지 알겠다. 아주 좋은 질문이다. 웹 페이지는 두 가지 종류의 "크기 변경 반응"을 보여주는데, 이 둘을 구분할 필요가 있다.
⚙️ 1. 브라우저의 자동 레이아웃 조정 (CSS 기반)
- 작동 방식: 사용자가 명시적으로 resize 이벤트를 처리하는 JavaScript 코드를 작성하지 않아도, 브라우저는 창 크기가 변경되면 CSS 규칙에 따라 페이지 레이아웃을 자동으로 다시 계산하고 렌더링한다.
- 예시:
- width: 50%; 로 설정된 요소는 부모 너비가 변하면 자동으로 너비가 조절된다.
- display: flex; flex-wrap: wrap; 컨테이너 안의 아이템들은 컨테이너 너비에 따라 자동으로 다음 줄로 넘어간다.
- display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); 와 같이 설정된 그리드는 사용 가능한 공간에 맞춰 컬럼 개수가 자동으로 변한다.
- CSS 미디어 쿼리(@media (max-width: 600px) { ... }): 특정 뷰포트 크기 구간에 따라 CSS 자체에서 다른 스타일 규칙을 적용하여 레이아웃을 변경한다.
- 특징: 이는 브라우저의 내장 렌더링 엔진이 CSS 정의에 따라 수행하는 기본 동작이다. 개발자가 JavaScript로 resize 이벤트를 직접 다루지 않아도 발생한다. 사용자가 말한 "그냥 플렉스 박스를 적용하든 브라우저 설정이든 아무튼 브라우저 크기를 줄이면 내부 아이템도 같이 그거에 맞게 줄어들잖아 보통은?"은 바로 이 경우에 해당한다.
⚙️ 2. JavaScript resize 이벤트 핸들링
- 작동 방식: window 객체는 브라우저 창의 크기가 변경될 때마다 resize 라는 이름의 이벤트를 발생시킨다. 개발자는 JavaScript를 사용하여 이 이벤트를 "듣고 있다가(listening)", 이벤트가 발생하면 **미리 정의된 특정 함수(이벤트 핸들러, 콜백 함수)**를 실행하도록 만들 수 있다. 이것이 바로 window.addEventListener('resize', ...) 코드의 역할이다.
- 예시: 사용자의 코드에서 window.addEventListener('resize', debounce(updateItemsPerRowAttribute, 50)); 부분.
- 특징: 이는 브라우저의 자동 리플로우와는 별개로, 개발자가 명시적으로 추가 로직을 실행하기 위해 사용한다. 단순히 CSS만으로 처리하기 어려운 복잡한 반응형 동작이나, 특정 계산이 필요하거나, DOM을 직접 조작해야 할 때 사용된다.
✅ 여기서 말하는 'resize': JavaScript 이벤트 핸들링
근데 여기서 말하는 resize라는 것은 어느쪽인거야?
우리가 debounce나 throttle과 함께 이야기하고 있는 resize는 2번, 즉 JavaScript의 window 객체에서 발생하는 resize 이벤트와 그것을 처리하는 window.addEventListener('resize', ...) 코드를 의미한다.
🎯 이 코드에서 resize 이벤트를 사용하는 이유
사용자의 updateItemsPerRowAttribute 함수는 뷰포트 너비에 따라 items-per-row 속성 값을 2, 3, 4, 6 중 하나로 동적으로 결정하여 설정하는 역할을 한다.
이러한 특정 너비 구간(Breakpoint)에 따른 명시적인 값 변경 로직은 단순히 CSS의 자동 리플로우만으로는 구현하기 어려울 수 있다. (물론, 순수 CSS 미디어 쿼리만으로도 비슷한 효과를 낼 수 있는 경우도 많다. 예를 들어 미디어 쿼리 안에서 grid-template-columns를 변경하는 등.)
사용자의 코드는 JavaScript resize 이벤트를 감지하여 현재 너비를 확인하고, 그 너비에 맞는 items-per-row 속성 값을 계산하여 모든 관련 요소에 적용하는 방식을 선택한 것이다. CSS는 이렇게 변경된 속성 값([items-per-row="N"])을 보고 최종적인 너비를 결정하게 된다.
💡 요약
- 브라우저는 CSS 규칙에 따라 창 크기 변경 시 자동으로 레이아웃을 재조정한다. (사용자가 언급한 일반적인 상황)
- window.addEventListener('resize', ...) 코드는 이와 별개로, 창 크기 변경 이벤트가 발생할 때마다 특정 JavaScript 코드를 실행시키기 위한 것이다. (우리가 논의 중인 상황)
- 사용자의 코드는 resize 이벤트를 사용하여 뷰포트 너비에 따른 특정 속성 값(items-per-row)을 동적으로 변경함으로써, CSS가 이를 기반으로 다른 레이아웃을 적용하도록 유도하는 방식을 사용하고 있다.
이제 두 가지 "리사이징"의 차이가 명확해졌기를 바란다!
'자바 스크립트(java script)' 카테고리의 다른 글
✨ 다중 옵저버 (0) | 2025.03.31 |
---|---|
document vs Document 사용 오류: (0) | 2025.03.31 |
✨ 자바스크립트 배열 메서드: filter() (1) | 2025.03.29 |
✨ 자바스크립트 코드 실행 중지 방법 (0) | 2025.03.29 |
이벤트 리스너 예시 문제 풀이 (0) | 2025.03.21 |