본문 바로가기

CodeTech/HTML\CSS

CSS - 4 [inline, block, Flexbox, Wrapping, Flex-grow]

block vs inline vs inline-block

  block inline inline-block
상하좌우 마진/패딩
너비와 높이
줄 바꿈
기본너비가 부모너비
요소 사이 공백

 

inline-block 

인라인은 높이와 너비를 가질수 없다고 했다, 하지만 높이와 너비를 가진 상태로 

박스들을 옆으로 붙이고 싶다면?

 

인라인 블럭은

- 높이와 너비

- 옆에 다른요소도 올 수 있고, 

- margin도 올 수 있다.

 

하지만 inline-block은 별로다. 

- default값에서 두요소 사이에 위와 같이 빈공간이 있다. (우리는 이러한 공간을 만든적이 없다. margin이 아니다.)

- 위와 같은 빈공간이 요소의 크기마다 일정하지 않다. (요소가 커질수록 이러한 빈공간은 작아진다. 왜? 몰라.)

- inline-block은 Responsive Design (반응형 디자인)을 지원하지 않는다. 모니터마다 다른사이즈를 지원하지 않음

- 구리다.

inline-block은 Responsive Design (반응형 디자인)을 지원하지 않는다.

인라인은 높이와 너비를 가질수 없다고 했다, 하지만 높이와 너비를 가진 상태로 

박스들을 옆으로 붙이고 싶다면? - 반응형 디자인을 지원하는 방법

 

flexbox

- 박스의 위치를 어디에나 위치시킬수 있고 

- 반응형 디자인을 지원한다.

 

하지만 이것을 쓰기 위해서는 규칙이 필요하다.

1. 자식 element에는 명시하지 말고

2. 부모 element에만 명시한다.

-> 부모가 자식을 제어한다.

(* 부모, 자식 element가 무엇이냐? <body>는 <div>의 부모이다. <html>은 <body>의 부모이다.)

3. main axis(수평축), cross axis(수직축) 

 

부모 자식 element

부모를 flex-container로 만들면 된다.

- 각각의 div 들은 여전히 block요소이다.

- justify-content라는 attribute를 이용하고 center라는 값을 주면 block들이 가운데로 온다.

- flex-end : block들이 끝으로 간다.

- flex-start : block들이 시작으로 간다.(default값)

- space-evenly : 빈 공간을 같은 크기로 나누어서 배치(고르게 배치) 등

웹 브라우저 크기에 따라 알아서 공간이 나뉜다.

main axis(수평축), cross axis(수직축)

- justify-content 라는 attribute는 수평축에 작용한다.(default = 0도)

- align-items 라는 attrubute는 수직축에 작용한다.(default = 90도)

(기본적으로 axis는 수평, 수직 이다. 축의 각도 변환 가능)

 

block들이 수평축에서 center로 갔다

- body의 높이를 줘서 아이템들을 맞춰보자

- 100vh (vh는 viewport height : viewport는 screen)  = 100%의 스크린 크기 (화면크기에 따라 바뀌는 상대적 크기)

- align-items에 적용되는 값들은 justify-content와 같다.

stretch

- stretch는 늘려 놓는 값이기 때문에 부모의 총크기를 정해놓고 (100vh) 자식의 높이를 없애야한다.

 

Flex-direction

- 기본 값은 수평(row)이다.

- column(수직)으로 바꾸면 main axis(주축)은 90도가 되고 cross axis은 0도 가된다.

- column-reverse면 main axis(주축)은 270도 cross axis 0도 가 되어 배열이 역순이된다.

- row-reverse면 main axis(주축은) 0도 cross axis은 270도가 되어 가로 배열이 역순이 된다.

 

Wrapping

wrapping - nowrap

- body의 display가 flex인 상황에서 창크기를 줄이면 이렇게 박스가 눌린다.

- flex-wrap에서 nowrap이 default값이다.

- 모든 요소를 한줄에 다 들어가게 하려고 이렇게 width값을 초기값으로만 여기고 변형시킨다.

 

이러한 wrapping 현상을 없앨 수 있다.

- flew-wrap을 wrap으로 바꾼다.

wrapping - wrap

- 한줄에 다들어가지 못하고 두줄로 늘렸다.

- 1 아래로 2 3순으로 들어가게 되어 순서대로 아래로 배열이된다.

 

flex-wrap에 wrap-reverse값을 넣는다면 반대로

- 3아래로 2 1로 배열이된다.

 

 

Flex-grow

- 부모 박스가 flex일 경우 자식 박스들이 부모박스의 공간을 어느정도의 비율로 나눠 가질지

부여하는 attribute이다.

 

<h4>This is a Flex-Grow</h4>
<h5>A,B,C and F are flex-grow:1 . D and E are flex-grow:2 .</h5>
<div id="content">
  <div class="box" style="background-color:red;">A</div>
  <div class="box" style="background-color:lightblue;">B</div>
  <div class="box" style="background-color:yellow;">C</div>
  <div class="box1" style="background-color:brown;">D</div>
  <div class="box1" style="background-color:lightgreen;">E</div>
  <div class="box" style="background-color:brown;">F</div>
</div>
#content {
  display: flex;

  justify-content: space-around;
  flex-flow: row wrap;
  align-items: stretch;
}

.box {
  flex-grow: 1;
  border: 3px solid rgba(0,0,0,.2);
}

.box1 {
  flex-grow: 2;
  border: 3px solid rgba(0,0,0,.2);
}

이렇게 비율을 맞춰 자식 박스들을 정리할 수 있다.