📚 What is TIL?

오늘 배운 내용의 핵심

✅ Negative Margins
✅ Margin auto 키워드의 사용
✅ 레이아웃의 핵심, position
✅ transform 이해하기
✅ relative와 absolute
✅ relative + absolute의 조합형태
✅ absolute로 가운데 정렬하기
✅ absolute로 확장 레이아웃 구현
✅ 레이아웃의 핵심, flexbox
✅ FlexBox의 동작 방식 이해하기
✅ Main Axis와 Cross Axis
✅ flex-grow, flex-shrink, flex-basis
✅ min-width
✅ justify-content와 align-items

알고가자 initial value

.initial-value {
  box-sizing: content-box;
  width: auto;
  position: static;
  left: auto;
  top: auto;
  flex-basis: auto;
  flex-grow: 0;
  flex-shrink: 1;
  justify-content: flex-start;
  min-width: auto;
}

Negative Margins

  • margin은 - 로도 값이 사용이가능하다
  • 차지하는공간이 달라진것이다
  • 차지하는 공간보여지는 디자인을 다르게 가져갈 수 있는 프로퍼티이다
    즉, 차지하는공간과 보여지는공간을 별개로 가져갈수있다
  • 브라우저에게 요소의 기준점을 속이는 원리이다

⚠️ 차지하는 공간이 달라지는 것이지, 시각적으로 보여지는 것은 달라지지 않는다

💡 하지만 이렇게 쓰는 것은 이슈가 많지 않을지.. 그럼 padding을 쓰는 것이 더 좋지 않을까?

🔎 실제로 이 기법을 많이 쓴다고한다, 버그가 아니다
🔎 position 주기에 앞서 margin을 쓰는 것도 방법이다


block-level element 를 짚고 넘어가기

  • block-level element는 사용가능한 공간의 크기를 모두 차지하게 된다
  • 즉 block-level element는 width 를 명시적으로 설정하지 않으면 바로 width: auto 와 같은 동작을 한다
  • 그렇다면 어떻게? User-agent stylesheet에 의해 width: auto 가 되는 것이다

block-level element 에 Negative Margins 을 준다면?

순차적으로 생각해보자 div는 block-level element 이다
div태그를 넣었다면 사용가능한 공간의 크기를 모두 차지하게 된다
이제 여기서 Negative Margins를 준다면?

🔎 width가 지정되지않은 상태에서 요소의 좌우를 negative margin값을 준다면
 차지하는 공간은 그대로인상태에서 시각적으로 가득차보인다

 {
  padding: 10px;
  margin-left: -10px;
  margin-right: -10px;
}

See the Pen Untitled by tjqehd23 (@tjqehd23) on CodePen.

만약 위의 코드에서 Negative margin 없다고 상상해본다면 ..?

✔️ I’m Title 이라고 적힌 요소와 자식의 컨텐츠의 왼쪽에서 시작되는 기준점이 일직선상으로 일치하지 않을 것이다
 이것을 일치시키기 위해 Negative Margins을 줄 수 있다

✔️ 이러한 개념은 트릭개념이 아닌 grid를 만들때도 사용이 된다

텍스트가 있는 요소가 네거티브 마진으로 튀어나가게 되면 스크린리더가 읽을까?

이슈가 존재한다고 한다 찾아봐야지..!


마크업이 시각적인 영향을 끼치는 경우

  • 마크업에서 나중에 오는 요소는 앞에 오는 요소의 위에 있다

💡 그렇다면 이것의 해결방법은?

🔎 z-index 주기에 앞서 생각해봤을때 마크업 순서와 관계없이 position이 static 이 아닌 값이 들어가면 앞으로 튀어나오게 된다

⚠️ 그렇다고 position: absolute 주지말자
⚠️ absolute 를 주는 순간 컨텐츠를 뒤로 보내기때문에 적절치않다


position

relative

  • 자기자신의 절대적인 위치가 있는것이 아니고 일반적인 문서의 흐름, 주위의 위치에따라 상대적으로 달라진다
  • 결정된 위치기준에서 top:0 left:0 이란 움직이지 않겠다는 뜻이다

absolute

  • 일반적인 문서 흐름에서 제거하고, 페이지 레이아웃에 공간도 배정하지 않는다
  • containing block을 내가 원하는 요소로 바꿔줄 수 있다
  • 직계부모에게 position static이 아닌 값을 넣어주면 absolute 된 요소의 부모가 새로운 containing block 이 된다
  • top:auto left:auto 이란 현재위치에서 붕💨 뜨겠다는 뜻이다

💡 부모 중 position static 이 아닌 값이 없다면?

🔎 더 상위로 올라가 결국 containing block 이 부모의 Content영역이 아닌 뷰포트 로 역할이 바뀐다
🔎 relative는 absolute 의 새로운 containing block이 되도록 많이 쓰인다 (특정스크롤에 고정시키고 싶지 않다면 position: fixed)

💡 부모에게 position:absolute 주면 어떤 차이가 있을까?

🔎 그 부모 안에서 absolute가 된다 하지만 부모자체도 위치이동이 될테니 곤란하다
🔎 relative는 변화를 일으키지 않기때문에 사용한다


containing block을 기준으로 중앙정렬 하는 두가지 방법

{
position: absolute;
top:50%
left:50%
transform:translate(-50%,-50%)
}

✔️ top과 left로 각각 기준에서 50% 씩 이동하고 transform(-50%,-50%) 요소크기의 절반정도를 이동하여 가운데 정렬한다
✔️ transform는 차지하고있는 공간은 그대로 있고 시각적인 결과만 움직이는 것이다

{
position: absolute;
top:50%
left:50%
margin-left: -50px;
margin-top: -50px;
}

✔️ 과거 transform이 없을 때는 Negative Margins 으로 이것을 해결했다고 한다
✔️ Negative Margins 을 쓰면 일일히 계산해줘야하는 단점이 있다


inset(단축속성) + margin으로 중앙정렬 하는방법

 {
  position: absolute;
  left: 0;
  right: 0;
  top: 0;
  bottom: 0;
  width: 100px;
  height: 100px;
  margin: auto;
}

✔️ inset: 0 을 통해 containing block의 높이와 너비만큼 가득차게 된다
✔️ 그 상태에서 margin: auto 를 주면 가운데 정렬이된다

💡 inset: 0 을 주기 전 absolute가 되는 순간 너비가 갑자기 줄어드는 현상은 inline이 되었기 때문일까?

⚠️ 아니다 컨테이닝 블럭이 제공하던 너비를 최대로 쓰지 않고 최소화가 되기 때문에
 텍스트 양만큼 즉 컨텐츠의 크기만큼으로 잡히는 것이다

⚠️ inset: 0 을 주었을 때 비로소 containing block이 제공하는 높이와 너비를 자동으로 쓸 수 있게 되는 것이다

See the Pen Untitled by tjqehd23 (@tjqehd23) on CodePen.

  • 어디서 쓰이는지 더 알아보자


flexbox

  • 자식 요소 flex items 가아닌 자식을 포함한 부모 flex Container 에게 준다

margin의 특성을 이용한 가운데 정렬

3개의 자식요소가 있다고 가정했을 때
justify-content 를 사용하지 않고 margin 만으로
3개의 요소를 가운데에 정렬하려면..?

.one {
  margin-left: auto;
}
.three {
  margin-right: auto;
}

✔️ 첫번째와 세번째 요소에게 각각 마진값을 주어 2번째 요소를 쪼여주면 해결할 수 있다


flex items 에 사용하는 속성들

flex-basis

  • flex-item의 기본 사이즈를 지정하는 속성
  • 여백의 공간이 아닌 전체 공간을 분할하는 속성
  • 기본값이 auto이다

  • flex-basis는 주축에만 적용되기 때문에 flex-directioncolumn이라면
    flex-basisheight을 제어하게 된다

flex-grow

  • 부모의 컨테이너 내부에서 할당할 수 있는 공간의 정도를 지정할 수 있는 속성
  • 남은 여백을 채우기 위한 속성
  • 형제 요소인 아이템들이 같은 flex-grow값을 가지면, 동일한 공간을 할당받는다
  • flex-basis값에 grow의 비율 크기만큼 더해진다

flex-shrink

  • 아이템의 크기를 고정하거나 축소할 때 사용한다
  • 값을 0을 줄 경우 줄어들지 않는다.
  • 기본값이 1로 공통분담을 뜻한다

💡 flex-basis:0 을 주게 되면 여백공간이 아니라 전체 공간을 분할한다?

  • flex-basis 속성이 없는 경우의 flex-item 공간

    • (전체공간 중 요소들의 크기를 뺀 나머지 여백 / 요소들의 flex-grow 속성값의 합 * flex-grow의 값) + 요소의 크기
      245(첫번째 자식 item의 크기) === (500 - 30 / (2+1+1) * 2) + 10


  • flex-basis 속성이 있고 0인 경우의 flex-item 공간

    • 여백이 아닌 전체 공간 / 요소들의 flex-grow 속성값의 합 * flex-grow의 값
      250(첫번째 자식 item의 크기) === 500 / (2+1+1) * 2


  • flex-shrink 속성이 0이 아니고 부모요소의 크기를 넘을 경우

    • 요소의 공간 - (부모요소를 넘는 공간의 크기 / 요소들의 flex-shrink 속성값의 합)
      183.33 === 200 - 100 / 6


See the Pen Untitled by tjqehd23 (@tjqehd23) on CodePen.



초기값의 중요성

min-width

  • 내부에 있는 컨텐츠의 너비가 부모를 넘어가버릴때 생기는 문제의 원인
  • min-width 의 initial value는 auto 이다

💡 flex-basis : 0를 주면 자동으로 너비가 없어져야되는데 왜 살아있을까??

⚠️ min-width: auto 로 인해 내부 자식 컨텐츠 크기만큼 자신의 줄어들 수 없는 최소사이즈가 강제되어리기 때문이다
⚠️ min-width: 0 로 해결이 가능하다

align-items

  • 자식하나의 높이가 커지면 다른 자식도 같이 커지게되는 문제의 원인
  • align-items 의 initial value는 stretch 이다

💡 이러한 기능들은 과연 왜 존재할까?

🔎 레이아웃이 안정적으로 유지되게끔해주는 장치들이다

See the Pen Untitled by tjqehd23 (@tjqehd23) on CodePen.

✔️ stretch 컨데이너의 맞게 늘리는 성질이 있기때문에
 자식하나가 나면 부모의 높이가 늘어난다 이때 stretch에 의해 자식들이 늘어난다

✔️ margin을 상하단으로 주어 margin: auto 0px 늘어나는 것을 방지할 수 있다
✔️ flex에서도 사용가능한 공간으로 주어지기 때문에 margin이 같은 개념으로 동작한다


width와 basis 무엇을 쓸까?

  • flex-basis 는 나머지 공간이 flex Items 에 분배되기 전에 flex Items의 초기 크기를 설정한다
  • 이렇게하면 컨텐츠에 따라 항목이 동적으로 늘어나거나 줄어들 수 있다

🔎 flexbox 에서 따로 basis를 쓰는 이유가 있을 것이다
🔎 flex-basis는 flexbox 내에서 더 유연하게 컨트롤 할 수 있다


방법의 다양성

🔎 실제 실무에서는 여러 방식을 사용해서 해결해야하는 경우가 다양하다
🔎 하나의 방법을 익히는 것이 아닌 여러가지의 방법을 익히려는 자세가 중요하다




✨ Today is …

네이버의 책임 리더이신 상훈님의 특강🌟

지금의 기술발전이 앞으로 내가 가고자하는 길에 어떤 영향을 미치는지
그렇다면 내가 어떤 자세를 취해야하는지 진지하게 고민 해볼 수 있는 시간이었다 💭

공부 할 때 ChatGPT를 자주 애용하곤 했는데
효율적으로 정보를 얻어낼 수 있어서 편리하면서도
한편으로는, 위기감에 미래에 대한 걱정도 있었다 😟
특강을 통해 걱정에 대한 해답을 얻을 수 있었던 것 같다

앞으로 어떤 자세로 언어를 다루고 어떤 관심을 가져야 하는지
그러한 노력이 없다면 왜 더더욱 도태될 수 밖에 없는지 디테일하게 알 수 있었던 특강… 🙇‍♂️

💡 관심을 가지고, 알아내서, 고민하고, 공부하자 ❗

댓글남기기