HTML 레퍼런스 북

레이아웃05

이번 레이아웃은 레이아웃 03번이랑 유사합니다. 공부하실 때 레이아웃03번도 참고하면 도움이 될 것입니다.

float을 이용한 레이아웃

float이란, 페이지에서 이미지와 텍스트를 인라인으로 어우러지게 할 수 있는 기능입니다.(구버전)
※ float 속성을 적용하면 그 다음 요소에도 float가 적용되어 버그가 생길 수 있습니다. 이럴 때 사용할 수 있는 속성이 "clear" 입니다.

사용 방법
div태그는 block특성을 가지고 있기 때문에 세로로 나타납니다. 이를 가로로 정렬시켜주는 것이 float입니다.

*{
    margin: 0;
    padding: 0;
}
#wrap {
    width: 100%;
}
#header {
    height: 100px;
    background-color: #EEEBE9;
}
#nav {
    height: 100px;
    background-color: #B9AAA5;
}
#main {
    height: 780px;
    background-color: #886F65;
}
#footer {
    height: 100px;
    background-color: #4E342E;
}
.container {
    margin: 0 auto;
    width: 1200px;
    height: inherit;
    background-color: rgba(0, 0, 0, 0.3);
    overflow: hidden;
}
.contents .con1 {
    width: 100%;
    height: 100px;
    background-color: #74574A;
}
.contents .con2 {
    width: 100%;
    height: 200px;
    background-color: #684D43;
}
.contents .con3 {
    width: 50%;
    height: 480px;
    float: left;
    background-color: #594139;
}
.contents .con4 {
    width: 50%;
    height: 480px;
    float: left;
    background-color: #4A352F;
}
/* 
    float으로 인한 영역깨짐 방지법
    1. 깨지는 영역에 clear:both를 설정한다. ->But, 구조가 복잡해지면 문제가 생길 수 있음.
    2. 부모 박스 영역에 overflow: hidden을 설정한다. ->완벽한 방법은 아님
    3. clearfix를 설정한다.
*/

/* clearfix */
.clearfix::before,
.clearfix::after {
    content: '';
    display: block;
    line-height: 0;
}
.clearfix::after {
    clear: both;
}

@media (max-width: 1220px){
    .container {
    margin: 0 auto;
    width: 96%;
    height: inherit;
    background-color: rgba(0, 0, 0, 0.3);
    overflow: hidden;
    }
    .contents .con1 {
        width: 30%;
        height: 780px;
        float: left;
    }
    .contents .con2 {
        width: 70%;
        height: 390px;
        float: left;
    }
    .contents .con3 {
        width: 35%;
        height: 390px;
    }
    .contents .con4 {
        width: 35%;
        height: 390px;
    }
}
@media (max-width: 768px){
    .container {
        width: 100%;
    }
    .contents .con1 {
        width: 30%;
        height: 780px;
        float: left;
    }
    .contents .con2 {
        width: 70%;
        height: 260px;
        float: left;
    }
    .contents .con3 {
        width: 70%;
        height: 260px;
    }
    .contents .con4 {
        width: 70%;
        height: 260px;
    }
}
@media (max-width: 480px){
    .contents .con1 {
        width: 100%;
        height: 150px;
    }
    .contents .con2 {
        width:  100%;
        height: 210px;
        float: left;
    }
    .contents .con3 {
        width: 100%;
        height: 210px;
    }
    .contents .con4 {
        width: 100%;
        height: 210px;
    }
}

결과

flex을 이용한 레이아웃

flex란, 유연성을 뜻하며 레이아웃 배치 전용 기능으로 고안되었습니다. (신버전)
flex 아이템들은 가로 방향으로 배치되고 inline 요소들 처럼 아이템들의 width만큼을 차지하게 됩니다.

사용 방법
display: flex; 아이템들을 더 이상 한 줄에 담을 여유 공간이 없을 때 아이템 줄바꿈을 어떻게 할지 결정하는 속성 : flex-wrap flex-wrap: wrap;

* {
    margin: 0;
}

#wrap {
    width: 100%;
}

#header {
    height: 100px;
    background-color: #EEEBE9;
}

#nav {
    height: 100px;
    background-color: #B9AAA5;
}

#main {
    height: 780px;
    background-color: #886F65;
}

#footer {
    height: 100px;
    background-color: #4E342E;
}

.container {
    margin: 0 auto;
    width: 1200px;
    height: inherit;
    background-color: rgba(0, 0, 0, 0.3);
}

.contents .left {
    width: 100%;
}

.contents .left .con1 {
    height: 100px;
    background-color: #74574A;
}

.contents .right {
    height: 680px;
    display: flex;
    flex-wrap: wrap;
}

.contents .right .con2 {
    width: 100%;
    height: 200px;
    background-color: #684D43;
}

.contents .right .con3 {
    width: 50%;
    height: 480px;
    background-color: #594139;
}

.contents .right .con4 {
    width: 50%;
    height: 480px;
    background-color: #4A352F;
}

@media (max-width: 1220px) {
    .container {
        width: 96%;
    }
    .contents {
        display: flex;
        flex-wrap: wrap;
    }
    .contents .left {
        width: 30%;
        height: 780px;
    }
    .contents .left .con1 {
        width: 100%;
        height: 780px;
    }
    .contents .right {
        width: 70%;
        height: 780px;
    }
    .contents .right .con2 {
        width: 100%;
        height: 390px;
    }
    .contents .right .con3 {
        width: 50%;
        height: 390px;
    }
    .contents .right .con4 {
        width: 50%;
        height: 390px;
    }
}
@media (max-width: 768px) {
    .container {
        width: 100%;
    }
    .contents .right .con2 {
        width: 100%;
        height: 260px;
    }
    .contents .right .con3 {
        width: 100%;
        height: 260px;
    }
    .contents .right .con4 {
        width: 100%;
        height: 260px;
    }
}
@media (max-width: 480px) {
    .contents {
        flex-wrap: wrap;
    }
    .contents .left {
        width: 100%;
        height: 150px;
    }
    .contents .left .con1 {
        height: 150px;
    }
    .contents .right {
        width: 100%;
        height: 630px;
    }
    .contents .right .con2 {
        width: 100%;
        height: 210px;
    }
    .contents .right .con3 {
        width: 100%;
        height: 210px;
    }
    .contents .right .con4 {
        width: 100%;
        height: 210px;
    }
}

결과

grid을 이용한 레이아웃

grid는 2차원(행과 열)의 레이아웃 시스템을 제공합니다. 위의 방법들과는 달리, 더 복잡한 레이아웃을 만들기 위해서는 grid방법을 사용하는 것이 편리합니다.

사용 방법
display: grid; table처럼 행과 열을 나눠준 후에 area를 정해주면 됩니다.

*{
    margin: 0;
}
#header {
    height: 100px;
    background-color: #EEEBE9;
}
#nav {
    height: 100px;
    background-color: #B9AAA5;
}
#main {
    height: 780px;
    background-color: #886F65;
}
#footer {
    height: 100px;
    background-color: #4E342E;
}
.container {
    width: 1200px;
    height: inherit;
    margin: 0 auto;
    background-color: rgba(0, 0, 0, 0.3);
}
.contents {
    display: grid;
    grid-template-areas: 
        "cont1 cont1"
        "cont2 cont2"
        "cont3 cont4";
    grid-template-columns: 50% 50%;
    grid-template-rows: 100px 200px 480px;
}
.contents .cont1 {
    background-color: #74574A;
    grid-area: cont1;
}
.contents .cont2 {
    background-color: #684D43;
    grid-area: cont2;
}
.contents .cont3 {
    background-color: #594139;
    grid-area: cont3;
}
.contents .cont4 {
    background-color: #4A352F;
    grid-area: cont4;
}
@media (max-width: 1220px){
    .container {
    width: 96%;
    }
    .contents {
    display: grid;
    }
    .contents {
    display: grid;
    grid-template-areas: 
        "cont1 cont2 cont2"
        "cont1 cont3 cont4";
    grid-template-columns: 1fr 1fr 1fr; /* 동등하게 3등분*/
    /* grid-template-columns: repeat(3, 1fr); 동등하게 3등분
    grid-template-columns: repeat(3, 33.3333% );  동등하게 3등분
    grid-template-columns: 33.3333% 33.3333% 33.3333%; 동등하게 3등분 */

    grid-template-rows: repeat(2, 1fr);
    }
}
@media (max-width: 768px){
    .container {
    width: 100%;
    }
    .contents {
    display: grid;
    grid-template-areas: 
        "cont1 cont2"
        "cont1 cont3"
        "cont1 cont4";
    grid-template-columns: 30% 70%; /* 동등하게 3등분*/
    grid-template-rows: repeat(2, 1fr);
    }
}
@media (max-width: 480px){
    .contents {
    display: grid;
    grid-template-areas: 
        "cont1"
        "cont2"
        "cont3"
        "cont4";
    grid-template-columns: 100%;
    grid-template-rows: 150px 210px 210px 210px;
    }
}

결과