https://flexboxfroggy.com/#ko

 

Flexbox Froggy

A game for learning CSS flexbox

flexboxfroggy.com

생각보다 재미있었던 개구리 flex게임

 

Flex

flexbox 혹은 flexible box라 불리는 flex는 아이템 공간 배분/정렬 기능을 제공하기 위한 기능이다.

(1차원 레이아웃 모델)

 

+ Flex 기능을 이용하여  Holy grail layout을 만들 수 있다.

 

flex가 있기 전에는 <table>로 했었다는 끔찍한 전설이....

 

 

 

 

우선, Flex를 사용하기 위해서는 꼭! Container역할을 하는 요소가 있어야 한다.

 

<container>
	<item></item>
</container>

요롷게 부모 역할의 container가 있어야 한다.

 

이 때, item의 width는 콘텐츠 크기로 정해지고, 높이는  container의 높이만큼 차지한다. (inline요소와 비슷)

 

그리고 여기서 container역할을 하는 요소 / item 역할을 하는 요소에 부여할 수 있는 속성은 각각 따로 정해져 있다. (아래에서 각각 쓸수 있는 속성들을 정리해 놓았다)

예를 들면,

flex를 사용하기 위해서는

 

1. display: flex;를 container역할 요소에 부여한다. (item역할 요소한테 ㄴㄴ)

2. flex-direction(아이템 정렬 방향)도 container역할 요소에 부여한다.

 

container{
	display: flex;
    flex-direction : column;
}

이렇게!

 

여기서 flex-direction은 간단하게, 아이템 정렬이 가로(row)이냐, 세로(column)이냐를 나타낸다. 기본 설정은 가로(row)이다.

 

 

*flex 기능을 더 알기 위해서 알아야 할 지식이 있는데 바로 주축(Main Axis)과 교차축(Cross Axis)이다.*

위에서 말했듯이, flex-direction의 기본 값은 가로(row)이다. 여기서 주축은 row 방향을 따른다.

가로의 교차는? 세로(column)겠지. 그러니 flex-direction: row; 일 때, 주축은 가로, 교차축은 세로가 된다.

 

반대로, flex-direction: column; 일 때, 아이템 정렬은 세로로 되어있다.

그때 주축은 세로 방향(column)이고, 교차축은 반대로 가로 방향(row)이 되는 것이다.

 

 

 

 

 

Flex Container Properties(container에 부여할 수 있는 flex 속성들) 

 

  • flex-direction:
    row - 가장 기본 방향. 오른쪽에서 왼쪽으로
    row-reverse - row의 역순. 왼쪽에서 오른쪽으로 정렬
    column - 세로 방향. 위에서 아래로
    column-reverse - column의 역순. 아래에서 위로.
    (이러한 기능들을 이용해서 모바일에선 column 정렬이었다가 폭이 넓어지면 row를 쓰는 반응형 레이아웃도 구현 가능하다..)

 

  • flex-wrap:
    nowrap;
    wrap;
    wrap-reverse;
    나열된 item들의 총 넓이가 부모(container)보다 넓을 때 item들이 부모를 벗어나거나, 부모크기에 맞춰 축소되지 않도록 다음 줄에 이어서 정렬해주는 기능(감싸안는것)
    flex-wrap을 설정해주지 않으면 기본값은 flex-wrap: nowrap;이다.

flex-wrap: nowrap;일 때

실제 사이즈인 분홍색 박스와 달리 같은 사이즈의 item 박스들이 container안에 다 들어가기 위해 축소된다. (혹은 container박스를 넘어가는 경우도 있다. 이 차이점은 다음에...)

 

flex-wrap: wrap; 일 때

wrap을 설정해 주었을 때는 부모 container안에서 item 박스들이 크기를 유지하며 정렬되어 있다. 아래는 코드.

<!DOCTYPE html>
<head>
    <style>
        .container{
            width: 100px;
            height: 200px;
            border:2px solid black;
            display:flex;
            flex-wrap:wrap;
        }

        .container div{
            width: 50px;
            height: 50px;
        }

        .aside{
            width: 50px;
            height: 50px;
            background-color: pink;
        }
    </style>
    <title></title>
</head>
<body>
    <div class="container">
        <div style="background-color:orange;">A</div>
        <div style="background-color: firebrick;">B</div>
        <div style="background-color: slateblue;">C</div>
        <div style="background-color: dodgerblue;">D</div>
        <div style="background-color: limegreen;">E</div>
        <div style="background-color: gray;">F</div>
    
    </div>
    <div class="aside">size</div>
</body>

 

만약에 item들에 개수가 많아서 부모요소에 다 담기지 못한다면..?

이렇게 부모를 벗어나 정렬된다.

wrap-reverse;는 역순으로 정렬이 되는건데, wrap이 상단에서 정렬이 시작되었다면 wrap-reverse는 그와 반대로 하단에서 정렬이 시작된다.

wrap-reverse 일때.

 

  • flex-flow: 
    flex-direction과 flex-wrap을 한꺼번에 지정할 수 있는 단축 속성
    e.g) flex-flow: column wrap; 

  • justify-content:
    위에서 언급한 주축(Main Axis)을 기준으로 item 배열의 위치를 조종하거나 item 간의 간격을 설정할 수 있다.
    flex-start; Axis 처음으로 정렬, 주축이 가로라면 가로 왼쪽으로 item정렬
    flex-end; Axis 끝으로 정렬, 주축이 가로라면 가로 오른쪽으로 item 정렬
    center; Axis 중간으로 정렬, 주축이 가로라면 중앙으로 item정렬
    space-between; item간의 사이 균등하게 여백 주기
    space-around; item의 네 면에 균등하게 여백 주기 / item 사이에 여백은 2배가 되어 더 넓어짐.
    space-evenly; item의 네 면 + item간 사이 모두 균등하게 여백 / IE, Edge에선 지원 안됨...

justify-content: space-between; 일 때. item과 item 사이에 공간을 주기 때문에 item 사이가 아닌 A/F의 끝쪽 변에는 여백이 없다

 

space-around; 위의 space-between과 차이점이 보인다.


space-between이나 space-around나, 일단 flex-wrap을 설정해 주어도 자식요소가 부모요소 크기에 여백없이 딱 맞게 들어 간다면  space가 적용되지 않는다.... 

  • align-items:
    justify-content와 다르게 교차축(Cross Axis)을 기준으로 item 배열의 위치를 지정할 수 있다.
    stretch; 기본값. item의 크기가 정해져 있지 않으면 교차축 방향으로 끝까지 늘어난다.
    flex-start; 교차축 처음으로 item들이 위치하게 된다. 
    flex-end; 교차축의 끝으로 item들이 위치한다.
    center; 교차축의 중앙으로 item들이 위치하게 된다.
    baseline; text의 베이스라인 기준으로 위치하게 된다.

*jusitfy-content: center;

align-items: center;를 설정하면

margin:0 auto; 처럼 정중앙에 위치 시킬 수 있으니 꼭! 외워서 써먹자.

 

 

flex-direction: row; 일 때 align-items: flex-end를 해주면 교차축 끝, 아래로 정렬이 된다.

  • align-content:
    flex-wrap:wrap;이 설정된 상태에서 item들의 행이 2줄 이상일 때, 교차축(Cross Axis) 방향 기준으로 정렬을 설정해주는 기능

    아래는 위에 나왔던 것들과 기능 똑같으니 자세한 설명은 생략한다.
    flex-start;
    flex-end;
    center;
    space-between; - 아이템을 그룹으루 묶어서 그룹과 그룹사이로 인지
    space-around;
    space-evenly; (역시 IE와 Edge에서는 지원 안됨)

Main Axis가 column 방향일 때 space-around;을 주면 이런 모습. item각각에 여백이 생긴게 아니라 아이템 열이 2줄 일 때, 그 줄을 한덩어리로 보고 그 덩어리를 기준으로 여백을 준다.

 

 

Flex Item Properties(item에 부여할 수 있는 flex 속성들) 

 

  • order:
    item들의 나열 순서를 정할 수 있는 속성. 0(기준점)부터 시작해서 작은 숫자일 수록 먼저 배치된다. html 구조를 바꾸는 것이 아닌 오로지 "시각적" 순서를 나타내는 것이기 때문에 스크린 리더를 사용하는 시각장애인에게는 order의 적용은 의미가 없다.

A-B-C-D-E-F 순이었을 때, D의 기준은 0이다. D에게 order을 0보다 작은 -1을 주면 맨앞으로 가고, E에게 -2를 주면 E는 D보다 더 앞으로 가게 된다.


order에 부여하는 숫자는 절대적인 위치를 나타내는 숫자가 아니라 "상대적"이다.

  • flex-basis: 
    flex item들의 기본 크기를 설정. flex-direction에 따라 너비/높이중 하나가 설정된다. flex-basis를 설정하지 않으면 콘텐츠의 넓이만큼 크기가 설정 됌.
    width:100px;
    flex-basis:100px; 의 차이점? => width:100px;은 더 강제성이 있어 콘텐츠 크기에 상관없이 100px로 아이템 크기가 정해진다. flex-basis:100px;은 콘텐츠 크기 때문에 100px가 넘는 크기의 아이템을 억지로 100px로 맞추지는 않음.

  • flex-grow:
    아이템들의 크기가 유연하게 커질 수 있게 하는 기능.
    아이템들의 flex-basis크기에서 남은 여백을 얼만큼의 비율을 차지하며 커질것인지 정할 수 있다.
    기본값은 flex-grow:0;


    flex-basis:50px만 주고 flex-grow 값은 주지 않은 상태
    컨텐츠부분(글자)를 제외한 나머지 여백 비율이 1 : 2 : 1 : 1 item C 박스에는 flex-grow:2 나머지에는 flex-grow:1 값을 주었다.



  • flex-shrink:
    flex-grow와 반대로 아이템 크기가 유연하게 작아지도록 설정하는 기능. 기본값은 flex-shrink:1;이다.
    flex-shrink:0;으로 설정시 작아지지 않는다.
  • flex:
    flex-basis + flex-grow + flex-shrink를 한번에 쓸 수 있는 축약형.
  • align-self: 
    부모의 align-items 속성보다 우선하여 개별 item 요소에게 align 속성을 부여하는 것. 기본값은 stretch이다.

 

 

아래는 flex에 대하여 설명이 잘 정리되어 있는 글이다.(영어주의)

https://css-tricks.com/snippets/css/a-guide-to-flexbox/