[ CSS ] fixed, absolute 지정 시 왼쪽에 여백이 생기는 경우 해결방법

방충림·2023년 4월 8일
5

Catch the error

목록 보기
5/7
post-thumbnail

바야흐로 코딩 짬찌시절, nav바를 position fixed로 고정하다가 만났던 문제를 또 만났다.
그때 당시에는 이유를 알지 못했는데, 지금은 너무 쉽게 알아버려 허무하지만 해결방법을 남겨놓고자 한다.


현상

다음 화면에서 닫기버튼은 position: "absolute" 가 적용되어있다. 이 버튼의 포지션에 기준점이 되는 요소는 뷰포인트(화면전체)다.

그 외에 나머지 요소들은 따로 position설정을 하지 않아 순차적으로 쌓여있는 형태이다.

코드는 아래와 같다.

해당 코드는 MUI로 규칙을 준수하고 있습니다.  css코드 형태는 크게 다르지 않습니다.

     <Button
        onClick={() => {
          window.close();
        }}
        fullWidth
        variant='contained'
        sx={{ position: "absolute", bottom: "20px" }}
      >
        닫기
      </Button>

근데 한가지 문제점이 보인다.
버튼을 분명 absolute로 위치시켰는데, 상위 컴포넌트의 패딩을 적용받아버렸다.
뷰포인트를 기준으로 잡았으니까 그럴 수 있....나? 라고 처음에 생각했다.
그런데 보면 우측은 또 패딩을 적용받지 않아 벽에 딱 붙어있다. ...?
패딩을 먹을거면 양쪽다 먹어야지 한쪽만 먹는건 뭘까. 이게 가장 의문의었다.

결론은 아래와 같다.


원인

position: "absolute"요소에 top 또는 bottm만 적용하고 right나 left를 적용하지 않을 경우!
상하 정렬은 top 또는 bottom으로 지정한 곳에 잘 위치하지만, 좌우 정렬에 한해서는 relative가 적용돼서 기준으로 잡은 요소의 패딩을 적용받는 것이다.

반면 해상 요소의 너비는 또 상위 요소 너비를 따라간다.
fullwidth (== width=100%) 설정해두었으니, 뷰포인트의 넓이만큼의 크기를 가지겠고,
그 상태에서 왼쪽에 패딩이 들어오니, 우측은 패딩은 당연히 들어갈 자리가 없고, 오히려 초과할 수 밖에 없는 것이다.


해결방안

left 값을 추가한다.

     <Button
        onClick={() => {
          window.close();
        }}
        fullWidth
        variant='contained'
        sx={{ position: "absolute", bottom: "20px", left: "0" }}
      >
        닫기
      </Button>

짠, 이제 딱 맞는다. 이 쉬운것을.

교훈 : fixed나 absolute를 지정할 땐, top,bottom 뿐만 아니라 left랑 right도 꼭 주자.

profile
최선이 반복되면 최고가 된다.

0개의 댓글