Computer >> 컴퓨터 >  >> 프로그래밍 >> 프로그래밍

CSS로 두 개의 div를 나란히 배치하는 3가지 방법 (float, flexbox, grid)

CSS를 활용하면 HTML의 div 요소 두 개를 손쉽게 나란히 배치할 수 있습니다. 이 글에서는 가장 많이 사용되는 세 가지 방법을 코드 예제와 함께 자세히 살펴보겠습니다.

  • Float(플로트) 방식
  • Flexbox(플렉스박스) 방식
  • CSS Grid(CSS 그리드) 방식

1. Float 방식

Float 방식에서는 아래와 같은 HTML 마크업을 사용합니다.

<div class="float-container">

  <div class="float-child">
    <div class="green">Float Column 1</div>
  </div>
  
  <div class="float-child">
    <div class="blue">Float Column 2</div>
  </div>
  
</div>

여기서 .float-container는 두 개의 .float-child 요소를 감싸는 부모 요소입니다.

두 div를 나란히 배치하기 위해 다음과 같은 CSS 규칙을 적용합니다.

.float-container {
    border: 3px solid #fff;
    padding: 20px;
}

.float-child {
    width: 50%;
    float: left;
    padding: 20px;
    border: 2px solid red;
}  

위 코드를 실행하면 결과는 다음과 같습니다.

CSS로 두 개의 div를 나란히 배치하는 3가지 방법 (float, flexbox, grid)

구조를 한눈에 파악하기 쉽도록 div에 테두리와 패딩을 추가했습니다. 바깥쪽 굵은 흰색 테두리가 .float-container div이며, 20px의 패딩을 가지고 있습니다.

그리고 각 .float-child 요소는 더 얇은 빨간색 테두리와 패딩을 가지며, 실제 색상 블록은 이 .float-child의 자식 요소입니다. 그 이유는 잠시 후 설명하겠습니다.

두 div를 나란히 배치하는 핵심은 float 속성입니다. 각 .float-child 요소를 왼쪽으로 띄우면(float), 공간이 충분할 경우 두 요소가 나란히 표시됩니다. 두 div의 너비가 각각 50%이므로 정확히 화면에 들어갈 수 있는 것입니다.

또한 div 사이의 여백은 각 .float-child에 패딩을 추가하고, 그 안에 색상 블록을 넣는 방식으로 만들어집니다.

외부 div로 감싸서 열 사이 여백 만들기

색상 블록에 여백을 추가하면서도 두 블록이 나란히 들어가게 하려면, 반드시 외부 div(.float-child)로 감싸야 합니다.

만약 패딩 없이 .float-child div만 사용하고, 대신 첫 번째 블록에 margin-right 값을 줘서 여백을 만들려고 하면 어떻게 될까요?

HTML:

<div class="float-container">

  <div class="float-child green">
    Float Column 1
  </div>
  
  <div class="float-child blue">
    Float Column 2
  </div>
  
</div>

CSS:

.float-child.green {
    margin-right: 20px;
}

이 경우 두 .float-child 요소는 전체 너비의 50%씩 차지하지만, 첫 번째 초록색 요소에는 추가로 20px의 마진이 붙습니다.

결국 전체 너비는 50% + 20px + 50%가 되어 100%를 초과하게 되고, 두 블록을 나란히 배치할 공간이 부족해집니다.

그 결과 두 번째 파란색 블록은 첫 번째 블록 아래 행으로 내려가서 왼쪽으로 띄워지게 됩니다.

CSS로 두 개의 div를 나란히 배치하는 3가지 방법 (float, flexbox, grid)

너비를 48% 등 50%보다 작은 값으로 조정해서 맞추는 방법도 있지만, 어디까지나 근사치일 뿐 정확하지 않습니다.

그래서 저는 개인적으로 블록을 너비 50%의 외부 div로 감싸고, 패딩으로 여백을 주는 방식을 선호합니다.

요즘은 float보다 더 새롭고 편리한 CSS 기법으로 div를 나란히 배치할 수 있습니다. 그중 하나인 flexbox 방식을 살펴보겠습니다.

2. Flexbox 방식

Flexbox를 사용하면 훨씬 직관적인 방식으로 두 div를 정렬할 수 있습니다.

HTML:

<div class="flex-container">

  <div class="flex-child magenta">
    Flex Column 1
  </div>
  
  <div class="flex-child green">
    Flex Column 2
  </div>
  
</div>

CSS:

.flex-container {
    display: flex;
}

.flex-child {
    flex: 1;
    border: 2px solid yellow;
}  

.flex-child:first-child {
    margin-right: 20px;
} 

Flexbox에서는 먼저 부모 요소인 .flex-containerdisplay: flex를 설정하여 플렉스박스를 활성화합니다.

그다음 각 .flex-child 요소에 flex: 1을 지정합니다. 이 숫자는 부모 플렉스 요소 안에서 각 자식의 너비 비율을 의미합니다.

두 값이 같으므로 남은 공간이 동등하게 나누어지고, 자식 요소가 두 개이므로 각각 50%씩 차지하게 됩니다.

결과는 다음과 같습니다.

CSS로 두 개의 div를 나란히 배치하는 3가지 방법 (float, flexbox, grid)

마진으로 여백을 추가해도 레이아웃이 유지됩니다!

주목할 점은 첫 번째 .flex-child 요소에만 margin-right: 20px를 추가했다는 것입니다. 하지만 flexbox는 충분히 똑똑해서, 나머지 가용 너비를 나눌 때 이 20px까지 고려해 줍니다.

즉, 픽셀을 일일이 계산하지 않고도 마진으로 여백을 추가할 수 있으며, flexbox가 알아서 콘텐츠 크기를 맞춰 줍니다.

이것이 제가 flexbox를 좋아하는 큰 이유 중 하나입니다.

다만 반응형 그리드처럼 여러 요소를 배치할 때는, 어느 지점에 여백을 추가해야 하는지 항상 알 수 있는 것은 아닙니다.

예를 들어 모바일 화면에서 두 div를 위아래로 쌓으려면, 모바일 너비 구간에서 margin-right 속성을 제거해야 합니다.

혹은 float 방식에서 했던 것처럼 각 .flex-child를 외부 요소로 감싸고 패딩을 추가하는 방법도 있습니다.

100% 직관적이진 않지만 여전히 잘 작동합니다. flexbox로 더 복잡한 반응형 레이아웃을 만들 때는 이 점을 염두에 두어야 합니다.

이제 div를 나란히 배치하는 가장 최신 방법인 CSS Grid를 살펴보겠습니다.

3. CSS Grid 방식

CSS Grid를 사용하면 다음과 같이 두 div를 나란히 배치할 수 있습니다.

HTML:

<div class="grid-container">

    <div class="grid-child purple">
        Grid Column 1
    </div>

    <div class="grid-child green">
        Grid Column 2
    </div>
  
</div>

CSS:

.grid-container {
    display: grid;
    grid-template-columns: 1fr 1fr;
    grid-gap: 20px;
}

결과는 다음과 같습니다.

CSS로 두 개의 div를 나란히 배치하는 3가지 방법 (float, flexbox, grid)

Grid의 가장 큰 변화는 레이아웃 작성 전에 먼저 그리드 템플릿, 즉 몇 개의 열과 행을 사용할지 결정한다는 점입니다.

여기서는 너비가 같은 두 개의 열이 필요합니다. 따라서 부모 요소인 .grid-containerdisplay: grid로 그리드를 활성화한 뒤, grid-template-columns 속성으로 원하는 열 수를 지정합니다.

너비가 같은 두 개의 열을 원하므로 1fr 1fr로 설정했습니다. 이는 브라우저에게 두 개의 열 레이아웃을 만들고, 각 열이 1fr(fr = 분수 단위)의 공간을 차지하도록 지시하는 것입니다.

fr 단위는 열 간의 비율을 나타내며, flexbox 방식에서 사용한 flex: 1과 비슷한 개념입니다. 열을 1fr 1fr로 설정하면 각 열이 동일한 공간을 차지하게 됩니다.

grid-gap 속성으로 그리드 항목 사이 여백 추가하기

CSS Grid의 큰 장점 중 하나는 그리드 항목 사이에 여백을 만들 때 패딩이나 마진을 사용할 필요가 없다는 점입니다.

grid-gap(최신 브라우저에서는 gap) 속성을 사용하면 그리드 템플릿에 자동으로 여백을 추가할 수 있습니다.

여기서는 grid-gap을 20px로 설정했기 때문에, 브라우저는 항목들이 나란히 배치되든 위아래로 쌓이든 상관없이 모든 항목 사이에 20px의 여백을 추가합니다.

그리고 눈치채셨겠지만, 그리드 관련 CSS 속성은 모두 부모 요소인 .grid-container에 설정했습니다. 자식 요소인 .grid-child에는 단 하나의 CSS도 작성할 필요가 없었던 것입니다.