본문 바로가기

WEB

CSS 레이아웃: FLEX

 

레이아웃이란 컨텐츠를 잘 정리정돈해서 구조화 시킬 때 사용하는 기능으로,

flex는 CSS에서 레이아웃을 잡을 때 사용한다.

<li>태그가 반드시 ul이나 ol 같은 부모태그가 필요하듯이

flex를 사용하기 위해서는 태그가 두 단계가 필요한데 바로 부모 역할을 하는 태그인 container와

자식 역할을 하는 태그인 item이다.

정렬하고자 하는 각각의 아이템들은 부모에 해당하는 container가 필요하다. 

<body>
/* 자식과 부모가 있어야 한다. */
    <div class="container">
        <div class="item">

        </div>
        <div class="item">
            
        </div>
        <div class="item">
            
        </div>
        <div class="item">
            
        </div>
        <div class="item">
            
        </div>
    </div>
</body>

또한 컨테이너에게 부여하는 속성과 아이템들에게 부여하는 속성이 각각 존재한다.

출처&amp;nbsp;https://www.youtube.com/watch?v=8DJBCHro-3Q

 

레이아웃으로 flex를 사용하려면 출발점은 반드시 부모에게 display 값을 flex로 주는 것이다.

부모가 flex가 된 순간 자식들은 변하게 된다.

<style>
        .container {
            /* flex의 출발점 */
            display: flex;
            /* 태그들을 반대쪽으로 정렬 */
            flex-direction: row-reverse;
            /* 수직방향으로 정렬 */
            flex-direction: column;
        }
</style>

display를 flex로 설정하면 flex의 기본값인 row에 따라 아이템들이 수평으로 정렬된다.

flex-direction을 column으로 설정하면 아이템들을 수직으로 정렬할 수 있다.

 

 

flex item의 속성

1. flex-basis

특정한 엘리먼트의 크기를 정하고 싶을 때 flex-basis 속성을 사용한다.

/* item의 두번째 등장하는 엘리먼트 선택자 */
        .item:nth-child(2) {
            flex-basis: 200px;
        }

 

2. flex-grow

모든 요소들이 여백 없이 공평하게 화면을 꽉 채우게 만들고 싶을때 사용한다.

.item {
            background-color: tomato;
            color: white;
            border: 1px solid white;
            /* 0이 기본값 */
            flex-grow: 1;
        }

*기존화면: container의 배경색이 powderblue색상

위와 같이 변경된다.

두번째 엘리먼트가 더 많은 여백을 갖게 만들고 싶을 때는 

두번째 엘리먼트 선택자에 flex-grow값을 추가로 준다.

.item:nth-child(2) {
            flex-grow: 2;
        }

3. flex-shrink

창의 화면이 줄어들 때, 아이템들의 크기도 그에 맞춰 줄어들게 되어있는데

flex-shrink 속성을 사용하면 아이템의 영역이 줄어드는 크기를 조절할 수 있다.

특정 엘리먼트의 flex-shrink 값을 0으로 줄면 화면이 줄어들어도 해당 엘리먼트의 크기는 줄어들지 않는다.

<style>
.item:nth-child(2) {
            flex-basis: 500px;
            flex-shrink: 0; /* 줄어들지 않는다 */
        }
        .item:nth-child(1) {
            flex-basis: 300px;
            flex-shrink: 2;
        }
</style>
  • flex-shrink가 0인 경우 창이 줄어들어도 영역은 그대로 유지 된다.
  • flex-shrink가 1인 경우 창이 줄어들면 영역은 1만큼 줄어들고, 2인 경우 영역은 1보다 더 빠른 속도로 줄어든다.

 

4. flex-wrap

기본값은 nowrap이다.

wrap을 하게 되면 컨테이너의 크기보다 아이템의 크기가 클 때 아이템은 줄바꿈을 하며 아래로 쌓인다.

 

 

flex 속성 태그가 정리되어 있는 유용한 사이트는 아래와 같다.

https://codepen.io/enxaneta/pen/adLPwv

 

 

holy grail layout

출처&amp;nbsp;https://www.youtube.com/watch?v=8DJBCHro-3Q

holy grail layout은 header, nav, main, aside, footer로 영역을 나누는 레이아웃 방법이다.

header에는 페이지의 제목이나 썸네일이,

nav에는 리스트가,

main에는 페이지의 메인 컨텐츠/글 들이,

asdie에는 페이지에서 덜 중요한 정보들 (ex.광고)가,

footer에는 주소와 관련된 정보들이 표현된다.

<body>
    <div class="container">
        <header>
            <h1>생활코딩</h1>
        </header>
        <section class="content">
            <!-- nav, main, add  -->
            <nav>
                <ul>
                    <li>html</li>
                    <li>css</li>
                    <li>javascript</li>
                </ul>
            </nav>
            <main>
                생활코딩은 일반인을 위한 코딩 수업입니다

            </main>
            <aside>
                <!-- 페이지에서 덜 중요한 광고같은 것 -->
                AD
            </aside>

        </section>
        <footer>
            <a href="#">홈페이지</a>
        </footer>
    </div>
</body>

컨텐츠를 수평으로 나열하기 위해서 container의 display를 flex로 주면

flex-direction가 기본값인 row로 정렬된다 (수평으로 정렬된다)

  • flex-direction가 column 일때 → 수직으로 보여준다
  • flex-direction가 row 일때(기본값) → 수평으로 보여준다

flex-direction을 column으로 주고(수직)

각각의 태그에 border로 선을 그어서 영역을 구분해보면 다음과 같다.

<style>
        .container {
            display: flex;
            flex-direction: column;
        }
        header {
            border-bottom: 1px solid gray;
        }
        footer {
            border-top: 1px solid gray;
        }
        .content {
            display: flex;
        }
        .content nav {
            border-right: 1px solid gray;
        }
        .content aside {
            border-left: 1px solid gray;
        }
    </style>

section 태그에는 nav, main, aside 태그가 포함되어 있는데,

만약 화면이 움직일 때 nav와 aside의 크기는 고정시키고 main 컨텐츠의 크기만 움직이게 하고 싶을 때

nav와 aside 태그에 flex-basis로 크기를 정하고, flex-shrink 속성의 값을 0으로 설정하면

화면이 움직일때 nav, aside의 크기는 고정되며 main 컨텐츠만 크기가 변경되게 된다.

<style>
        /* 화면의 움직임에 따라 main만 움직이게 하기 */
        nav, aside {
            flex-basis: 150px;
            /* 화면이 줄어들어도 영역이 줄어들지 않음 */
            flex-shrink: 0;
        }
    </style>

 

 

 

 

 

 

 

 

해당 게시글은 '생활코딩' 님의 CSS 수업 강의를 참고하였습니다.

출처 https://www.youtube.com/watch?v=8DJBCHro-3Q