개발자

개발자 도구의 width와 getBoundingClientRect().width의 길이가 다른 이유...

2023년 10월 14일조회 135

안녕하세요 개인적으로 만들고 있는 프로젝트에서 getBoundingClient().width의 값과 개발자 도구 상의 width 값이 다른 문제가 나와서 원인을 찾고 있습니다. div의 css는 box-sizing:border-box; padding:5px 10px; border:2px solid white; display:inline-block 입니다. 부모 div는 width 값을 정해주지 않아서 useEffect 안에서 부모 div의 children을 순회하며 자식 노드의 width를 누적해서 width값을 구하려고 하는데 첨부한 사진처럼 js로 구한 width가 개발자도구와 맞지 않는 문제가 발생하고 있습니다. 일단은 임의로 보정값을 넣어서 원하는 결과물은 나왔지만 찝찝한 마음이 들어서요 이 문제의 원인을 찾고 싶습니다. 감사합니다!

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.

답변 1

인기 답변

김하림님의 프로필 사진

`getBoundingClientRect()`로 계산된 width가 약 `157px`이고, 개발자 도구에서 보는 width가 `132px`이므로 약 `25px`정도의 차이가 보입니다. 이 `25px`의 차이는 아마도 패딩과 보더를 포함했느냐의 차이로 추정되는데, `25px`의 차이는 패딩+보더 픽셀의 차이일 가능성이 있습니다. 혹은, 부모 컴포넌트에 마진이 적용된 것으로 보이는데, 해당 마진 값을 포함한 너비일 가능성도 있어 보이네요. 기재해주신 CSS에서 `padding: 5px 10px`과 `border: 2px solid white`를 계산해보면 패딩이 좌우로 `10px`씩 총 `20px`, `border`가 좌우로 `2px`씩 총 `4px`이 됩니다. 좌우 패딩 `20px` + 좌우 보더 `4px`을 더하면 `24px`로, 엇비슷한 값이 나옵니다. 이 때, `box-sizing`이 `border-box`로 적용되었으니 너비(width)는 보더와 패딩을 포함하여 계산됩니다. 여기서 미지수인 점은 `132px`이 보더와 패딩을 포함한 너비인가? 아니면 제외한 너비인가?에 대한 부분인데요. 크롬 개발자 도구에서 요소 검사를 했을 때 보여지는 값은 보더와 패딩을 포함한 값이 보여지므로 (첨부된 스크린샷 상에서도 패딩과 보더 부분을 포함한것으로 보이네요), `132px`이 보더와 패딩이 포함된 정확한 너비로 보여집니다. 그럼, `getBoundingClientRect().width`는 왜 `157px`이라고 출력이 되는가에 대한 원인을 찾아야 하는데요. 여기부터는 코드를 보면서 파악이 필요할 것 같습니다. 제 추측으로는, 순회를 돌 때 자식 대신에 마진이 포함된 부모 컴포넌트를 잘못 참조했거나, emotion등의 CSS-in-JS 라이브러리를 사용한 경우 렌더링 타이밍 이슈가 있거나, CSS 설정이 잘못 되었거나 등등의 원인이 있을 거 같습니다. 크롬 개발자 도구에서 엘리먼트를 선택하고 Computed가 어떻게 계산되었는지 확인해보고, 디버깅이 필요할 것 같아요. 저도 비슷한 환경을 구성해서 테스트 해봤는데 해당 문제가 재현되지 않네요 ㅠㅠ 디버깅을 좀 더 해보라는 말씀밖에 드릴 수 없을 것 같습니다.

오윤환님의 프로필 사진

오윤환

작성자

42서울 멤버2023년 10월 15일

정성 어린 답변 정말 감사드립니다! 커리어리 AI 봇이 답해준 내용인데요 1. **렌더링 시점**: `getBoundingClientRect()`는 페이지가 렌더링 될 때 실행되기 때문에, CSS 애니메이션이나 변환, 또는 다른 요소로 인해 요소의 크기나 위치가 변경될 경우 변경된 값을 반영하지 않을 수 있습니다. 그래서 useEffect 안에서 값을 언제 가져오느냐 하는 것이 중요한 포인트일 수 있습니다. 이 부분이 유력한 이유인 것 같습니다 어제 iMac에서 구현한 결과물이 맥북에서는 의도치 않게 나오는 현상이 있어 다시 확인해봐야 할 것 같습니다 문제 해결한 다음 다시 댓글 남기겠습니다 다시 한 번 감사드립니다!

김하림님의 프로필 사진

김하림

우아한형제들 프론트엔드 개발자2023년 10월 15일

네 성공하시면 댓글 남겨주세요! 저도 궁금하네요 ㅎㅎ

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

AI 답변
커리어리 AI 봇 프로필 이미지

커리어리 AI 봇

GPT가 달아주는 답변입니다.

2023년 10월 14일

여기에는 몇 가지 원인이 있을 수 있습니다. 1. **렌더링 시점**: `getBoundingClientRect()`는 페이지가 렌더링 될 때 실행되기 때문에, CSS 애니메이션이나 변환, 또는 다른 요소로 인해 요소의 크기나 위치가 변경될 경우 변경된 값을 반영하지 않을 수 있습니다. 그래서 useEffect 안에서 값을 언제 가져오느냐 하는 것이 중요한 포인트일 수 있습니다. 2. **반올림 문제**: `getBoundingClientRect().width` 값은 실제 픽셀 값으로 소수점까지 나타납니다. 그런데 CSS의 단위인 픽셀은 정수로만 존재하므로, 이러한 차이가 생길 수 있습니다. 3. **스타일 계산**: 브라우저에서 스타일을 계산하는 방식에 따라 값이 약간 다를 수 있습니다. 예를 들어, box-sizing 프로퍼티는 요소의 총 너비와 높이를 계산하는 방법에 영향을 주는데요, 'border-box'일 경우 패딩과 테두리가 너비에 포함됩니다. 이 점이 영향을 줄 수 있습니다. 4. **zoom 및 DPI 설정**: 화면의 zoom 및 DPI 설정 또한 getBoundingClientRect()의 값을 영향을 줄 수 있습니다. 그러므로, 위에서 언급된 이유들로 인해 `getBoundingClientRect().width` 와 개발자 도구의 width 값이 다를 수 있습니다. 개발자 도구는 최종 계산된 CSS 값을 보여주는 반면 `getBoundingClientRect()`는 실제 렌더링 시점의 값이라는 점을 기억하시면 좋을 것 같습니다.

목록으로

지금 가입하면 모든 질문의 답변을 볼 수 있어요!