본문 바로가기
Frontend/CSS

CSS의 flex를 함께 공부해보자 - 2. flex-items

by 코딩쥐 2024. 7. 10.

앞서서 flex-container에 대한 공부를 했다. 컨테이너 안에 있는 플렉스 아이템들의 크기와 배치를 하는 방법을 알아보자. 

 

아이템 관련 속성

  • flex-basis: 값; 
    플렉스 아이템의 기본 크기를 설정한다. 기본값은 auto (컨텐츠 크기)로 box-sizing을 따로 지정하지 않으면 컨텐츠 박스 크기에 맞춰서 조정한다. width나 height와 함께 사용 시에 width와 height를 우선시 한다 .

  • flex-grow: 값;
    기본 값은 0으로, 컨테이너 내부에 남아있는 공간을 다른 아이템들과 비교하여 얼마나 할당 받을지를  설정한다. 모든 아이템들이 같은 flex-grow값을 갖는다면 컨테이너 내에서 동일한 공간을 할당받는다.

  • flex-shrink: 값;
    기본 값은 1로, 아이템의 감소 폭을 지정한다. 설정한 값에 따라서 아이템의 크기를 축소한다. 

  • flex: flex-grow값 flex-shrink값 flex-basis값;
    flex로 한 번에 축약해서 값을 설정할 수 있다. 컨테이너 안에서 할당되는 크기의 비율, 크기가 작을 때의 축소 비율, 아이템의 실제 크기 순으로 설정한다. 지정을 하지 않으면 기본 값으로 0, 1, auto가 되며 이는 컨텐츠 크기에 맞춰서 설정된다. flex를 쓸 때 flex: 1; 이런식으로 flex-grow에만 값을 주고 flex-basis와 flex-shrink를 기본값으로 사용하는 경우도 있다. 
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .container {
            display: flex;
            background-color: lightgray;
        }

        .item {
            background-color: lightcyan;
            border: 1px solid black;
            margin: 10px;
        }

        .first>div:nth-of-type(2) {
            flex-basis: 500px;
        }
        .second>div:nth-of-type(1){
            flex-grow: 2;
        }
        .second>div:nth-of-type(2){
            flex-grow: 1;
        }
        .third{
            width: 400px;
        }
        .third>div:nth-of-type(1){
            flex-basis: 200px;
            flex-shrink: 3;
        }
        .third>div:nth-of-type(2){
            flex-basis: 200px;
            flex-shrink: 5;
        }
        .third>div:nth-of-type(3){
            flex-basis: 200px;
        }

    </style>
</head>

<body>
    <h1>flex-basis</h1>
    <div class="container first">
        <div class="item">flex-basis를 설정하지 않았을 때</div>
        <div class="item">flex-basis를 500px로 설정</div>
    </div>
    <h1>flex-grow</h1>
    <div class="container second">
        <div class="item">flex-grow: 2</div>
        <div class="item">flex-grow: 1</div>
        <div class="item">flex-grow설정안함(공간 할당못받음)</div>
    </div>
    <h1>flex-shrink</h1>
    <p>container width를 400px로 설정했을 때 각 아이템이 줄어드는 정도가 다르다</p>
    <div class="container third">
        <div class="item">flex-shrink 3</div>
        <div class="item">flex-shrink 5</div>
        <div class="item">flex-shrink 설정안함</div>
    </div>
</body>

</html>

 


아이템의 배치

  • order: 값;
    말그대로 아이템들의 순서를 변경할 수 있다.

  • align-self: stretch | center | flex-start | flex-end | baseline;
    플렉스 아이템의 수직 위치를 조정할 수 있다. 컨테이너에서 사용되는 align-items보다 우선권이 있다. 
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .container {
            display: flex;
            background-color: lightgray;
            height: 30vh;
        }

        .item {
            background-color: lightcyan;
            border: 1px solid black;
            margin: 10px;
        }
        .first>.item{
            width: 100px;
            height: 100px;
        }

        .first>div:nth-of-type(1){
            order: 2;
        }
        .first>div:nth-of-type(2){
            order: 1;
        }
        .first>div:nth-of-type(3){
            order: 3;
        }
        .second>div:nth-of-type(1){
            align-self: stretch;
        }
        .second>div:nth-of-type(2){
            align-self: center;
        }
        .second>div:nth-of-type(3){
            align-self: flex-start;
        }
        .second>div:nth-of-type(4){
            align-self: flex-end;
        }
        .second>div:nth-of-type(5){
            align-self: baseline;
        }

    </style>
</head>

<body>
    <h1>order</h1>
    <div class="container first">
        <div class="item">1</div>
        <div class="item">2</div>
        <div class="item">3</div>
    </div>
    <h1>align-self</h1>
    <div class="container second">
        <div class="item">stretch</div>
        <div class="item">center</div>
        <div class="item">flex-start</div>
        <div class="item">flex-end</div>
        <div class="item">baseline</div>
    </div>
</body>

</html>