티스토리 뷰

1. div 요소를 화면 전체로 채운다

div 요소는 기본적으로 block 요소이기 때문에 width는 기본적으로 한 줄을 다 차지한다.

하지만 높이는 기본적으로 fit-content이기 때문에 화면 정중앙에 배치하기 위해서는 div 요소가 화면 100%를 꽉 채우도록 설정해 줘야 한다.

height를 100vh로 설정해주면 된다. 근데 여기서 특이한 점은 100%로 하면 적용이 안된다는 것이다

 

#parent{
    background-color: palegreen;
    height: 100vh; /* 100% (X) */
}
.card {
    height: 100px;
    width: 100px;
    border: 2px solid gray;
    text-align: center;
    background-color: crimson;
}
<body>
    <div id="parent">
        <div class="card">
            1
        </div>
        <div class="card">
            2
        </div>
        <div class="card">
            3
        </div>
    </div>
</body>

 

 

100vh와 100%의 차이가 뭔데 이러는 걸까?


100vh: viewport 높이의 100% height  (Viewport Height) 

100% : 부모 요소의 100% height

 

* viewport: 내 스크린(브라우저 창) 크기 전체.

- 100vh라면 내 스크린을 꽉 채우는 높이라는 것이고, 10vh라면 내 스크린의 10%만 채운다는 것.

 

** parent div의 부모인 body의 100% 높이를 채우는 것이 내 스크린의 100%를 채운다는 뜻이랑 다른가?

- parent div의 부모인 body에 height값이 세팅되어있지 않기 때문에 부모 높이 자체를 알 수 없다

 

body에 height 값이 없기 때문에 자식 div가 참조할 수 없다

 

*** 그럼 body에 height: 100%를 주면 되야하는거 아닌가?

-> 마찬가지로 body의 부모인 html 요소에 height값이 세팅되어있지 않기 때문에 부모 높이를 알 수 없다. 

이는 다시말하면 최상위 부모인 html 요소에 height를 잡아주면 해결을 할 수 있긴 하다. 

html, body {
    height: 100%;
}

근데 썩 바람직한 모습은 아닌것으로 보인다. vh를 사용하는 것이 제일 좋아보인다.


 

2. flexbox 적용

dlsplay: flex; flex-direction: row; justify-content: space-evenly; align-items: center;

 

flex-direction -> 요소들의 기본 축 (default: row)

justify-content -> flex-direction 기준 수평 축 정렬

align-items -> flex-direction 기준 수직 축 정렬

 

** flex-direction이 row -> column으로 바뀌면 justify-content와 align-items의 기준 축도 서로 바뀐다 **

 

flex에 대한 설정은 부모에서 해준다. 그럼 자식이 부모의 정보를 참조하여 배치가 된다.

 

* {
    box-sizing: border-box;
    margin: 0;
    padding: 0;
}
#parent{
    background-color: palegreen;
    height: 100vh;
    display: flex;
    flex-direction: row;
    justify-content: space-evenly;
    align-items: center;
}
.child {
    background-color: crimson;
    height: 100px;
    width: 100px;
    text-align: center;
    border: 2px solid gray;
}
<body>
    <div id="parent">
        <div class="child">
            1
        </div>
        <div class="child">
            2
        </div>
        <div class="child">
            3
        </div>
    </div>
</body>

 

아주 잘 된다!

 

더 나아가서 안쪽에 child 박스 안에 있는 텍스트도 정중앙에 배치해보면?

.card {
    display: flex;           
    align-items: center;
    justify-content: center;
    font-size: 2rem;
    height: 100px;
    width: 100px;
    border: 2px solid gray;
    color: white;
    background-color: crimson;
}

 

 

아주 마음에 쏙 든다!

 

# 실전 응용

<body>
<div class="container" style="height: 100vh; display: flex; justify-content: center; align-items: center; flex-wrap: wrap;">
    <div class="row cards-1" style="margin: auto;">
        <div class="card">
            ...
        </div>
        
        <div class="card">
            ...
        </div>
        
        <div class="card">
            ...
        </div>
    </div>
</div>
</body>

 

* 본 프로젝트는 부트스트랩 템플릿을 이용하고 있다

- 기본적으로 container 클래스나 row, column 클래스는 display: flex로 이미 설정되어 있다!!

 

 

대체 어떻게 된건지 이해해보면


1. 최상위 container div를 높이를 100vh로 세팅해 화면을 가득 채움

 

2. 부모(container div)에 justify-content, align-items 설정을 함

-> 자식인 row div가 화면의 정중앙에 배치된다.

 

3. row div 안에 각각 card div를 순서대로 넣고 margin으로 간격을 조절함

(card가 옆으로 쌓이는 이유는 템플릿에 이미 card 속성의 display가 inline-block로 세팅되어 있어서 그렇다 + card간의 간격 조절 역시 템플릿에 이미 세팅되어 있다.)


 

부트스트랩 템플릿을 잘 사용하려면 진짜  프론트엔드 지식도 많이 필요한 것 같다. 기본적인 html css 배치 정도는 꿰고 있어야 뭐라도 좀 이쁘게 만든다 진심

 

 

그래도 뭔가 flexbox에 대해 알고나니까 템플릿이 어떻게 구성되어 있는지 이해가 꽤 된다.

아주 뜻깊은 시간이었던 것 같다 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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 31
글 보관함