일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 로컬상태
- 실행컨텍스트란
- styled-component
- 노마드코더
- 실행컨텍스트콜스택
- useRef역할
- html
- npm 에러
- Mini Node Server
- 전역상태
- 실행컨텍스트 실행과정
- CORS
- 알고리즘
- 실행컨텍스트 동작과정
- css
- .current
- 영어
- 개발일기
- 실행컨텍스트자바스크립트
- CLI
- 고차함수
- 영어공부
- 개발공부
- state hook
- 객체
- Block
- 실행컨텍스트스택
- .env
- 그래머인유즈
- 실행컨텍스트 면접
- Today
- Total
오늘도 삽질중
CSS(레이아웃 리셋, Flexbox) (수정중) 본문
기본 스타일링을 제거하는 CSS 코드의 예시
<body>태그는 기본 스타일에 약간의 여백이 있다.
width, heigth 계산이 여백을 포함하지 않아 계산에 어려움이 있다.
브라우저(크롬,사파리)마다 기본 스타일이 조금씩 다르다.
이 모든 문제들을 아래의 코드를 적용시키면 기본 스타일링을 제거하여 디자인한 대로 레이아웃 구현 가능
* {
box-sizing: border-box;
}
body {
margin: 0;
padding: 0;
}
flexbox로 레이아웃 잡기
flexbox로 레이아웃을 잡는다 = 박스를 유연하게 늘리거나 줄여 레이아웃을 잡는다.
🤜 display : flex
- 부모박스 요소에 display : flex를 적용해, 자식 박스의 방향과 크기를 결정하는 레이아웃 구성방법
기본값으로, display: flex가 적용된 부모 박스의 자식 요소는 왼쪽부터 차례대로 이어 배치된다.
<div id="outer">
<div class="box">box1</div>
<div class="box">box2</div>
<div class="box">box3</div>
</div>
#outer {
display:flex;
border:1px dotted red;
padding: 10px;
}
.box {
border: 1px solid teal;
padding: 10px;
margin-right: 10px;
}
🤜 flex 요소에 방향 지정하기( flex-direction )
기본적으로 flexbox는 박스가 수직으로 분할되는 것이 기본이지만 방향을 설정해주면 수평으로도 가능하다
flex-direction 속성은 부모 박스요소에 적용한다. 자식 박스에 특별한 속성을 주지 않아도, 부모 요소에 의해 자식 요소가 영향을 받는다.
(이게 어떻게 사용했지>>...?)
row(기본값)
column
기억!
display 속성에 flex 적용시키는것은 부모 요소이다.( display : flex )
자식 요소는 flex라는 속성에 값을 적용한다. ( flex : 0 1 auto )
🤜 flex: <grow> <shrink> <basis>
자식 박스에 어떠한 속성도 주지 않으면, 왼쪽부터 오른쪽으로 컨텐츠의 크기만큼 배치가 된다.
flex 속성에 적용되는 세가지는 기본 크기를 바탕으로 필요에 따라 늘리거나 줄일 수 있다. (순서, 기본값 꼭 외우기)
flex : 0 1 auto; // 자식요소에 flex 속성을 추가하지 않으면 적용되는 기본값
grow, shrink , basis 도 각 값을 따로 지정할 수 있다.
flex-grow: 0;
flex-shrink: 1;
flex-basis: auto;
grow, shrink 속성은 단위가 없고, 비율에 따라 결과가 달라진다.
🤜 grow: 자식 박스는 얼마나 늘어날 수 있을까?
.target {
flex : 1 1 auto;
}
예시
<div id="outer">
<div class="box target">.box.target</div>
<div class="box">.box</div>
<div class="box">.box</div>
</div>
#outer {
display: flex;
border: 1px dotted red;
padding: 10px;
}
.box {
border: 1px solid green;
padding: 10px;
}
.box.target {
flex : 1 1 auto;
}
target 클래스에서, flex-grow속성의 값을 1로 변경한다.
target클래스를 가지고 있는 첫 번째 자식박스는 부모 박스의 가로 길이 중에서 남은 빈 영역만큼 늘어난다. 전체 자식요소가 가진 grow값의 합은 1 + 0 + 0 = 1 이므로, target클래스를 가지고 있는 자식 박스의 가로 크기는 1/1 = 100% 이다. 그러나 다른 자식 박스 안에 이미 콘텐츠가 존재하므로, 다른 자식 박스안의 콘텐츠가 담긴 길이를 제와한 나머지 가로 길이가 target 클래스를 가진 자식박스의 가로 길이이다.
- box 클래스의 flex-grow는 기본값이 0이다. 만약 box클래스의 flex-grow속성에 값을 1로 설정하면, 모든 박스가 1의 비율로 늘어나려고 하기때문에 각각 1+ 1+ 1 , 각각 1/3 크기를 가진다.
모든 자식 박스의 flex-grow속성이 0보다 큰 값을 동일하게 가지는 경우, 각 박스의 가로 길이는 동일한 비율을 가진다.
.box {
flex: 1 1 auto;
}
box 클래스의 flex-grow 속성에는 1을 그대로 두고, target 클래스의 flex-grow속성의 값을 변경해보자
.box {
flex : 1 1 auto;
}
.target {
flex : 2 1 auto;
}
// 자식 박스가 총 3개인데, target만 2의 비율을 가진다.
// 2(target) + 1(box2) + 1(box3) = 4이므로,
// target의 비율은 50%이다.
<위의 내용 정리>
- target 클래스에 적용된 flex-grow 속성의 값이 1, box클래스에 적용된 flex-grow 속성의 값이 1일 경우, grow가 적용도니 전체 값은 1+1+1 = 3 이다. 따라서 각 자식 박스의 가로 길이는 1/3의 길이를 가진다.
- target 클래스의 flex-grow 속성의 값이 2, box 클래스의 flex - grow 속성의 값이 1일경우, grow가 적용된 전체 값은 2+1+1 =4 이다. 따라서, target 클래스를 가지지 못한 나머지 자식 박스는 1/4의 길이를 가진다.
🤜 shrink : 자식 박스는 얼마나 줄어들 수 있음?
shrink는 설정한 비율만큼 박스 크기가 작아진다. 보통 flex-grow속성과 flex-shrink속성은 같이 사용되지 않는데, 그 이유는 실제 크기를 예측하기 어렵기 때문이다. 따라서 비율로 레이아웃을 지정할 경우 flex-grow 속성 또는 flex: <grow> 1 auto 와 같이 사용한다.
flex-grow 속성으로 비율을 변경하는 경우, flex-shrink속성은 기본값인 1로 두어도 무방하다.
🤜 basis: 이 박스의 기본 크기는 몇인가?
- 자식 박스가 flex-grow나 flex-shrink에 의해 늘어나거나 줄어들기 전에 가지는 기본 크기이다.
flex-grow가 0일때, basis크기를 지정하면 그 크기는 유지된다. (기억하기)
<div id="outer">
<div class="left">메뉴</div>
<div class="right">본문</div>
</div>
* {
box-sizing: border-box;
}
#outer {
display: flex;
border: 1px dotted red;
padding: 10px;
}
.left {
border: 1px solid green;
padding: 10px;
flex: 0 1 100px; // grow를 0으로 설정해줘야 100px 이상으로 늘어나지 않습니다.
}
.right {
border: 1px solid green;
padding: 10px;
.right {
flex: 1 1 auto; // 우측 박스는 grow를 1로 설정해 나머지 공간을 채워준다.
}
'HTML,CSS' 카테고리의 다른 글
CSS(Selector 구체적으로) (0) | 2021.09.07 |
---|---|
css(시맨틱태그,em/rem,css내용분해,class/id,background) (0) | 2021.08.30 |
inline (0) | 2021.08.30 |
HTML (0) | 2021.08.27 |
css(margin, border, padding) (0) | 2021.08.25 |