이 게시물은 2016년 9월 30일 수정판입니다.
이 카드에서 다루는 컬럼 그리드(Column Grid)란, 한 줄에 나열되는 객체를 일정한 간격을 두어 정렬하는 것을 의미합니다.
이러한 컬럼들을 매번 만들어서 CSS를 정의하는 것이 매우 귀찮은 작업이기 때문에, 미리 약 10개까지의 컬럼을 커버할 수 있는 CSS 코드를 작성해두고 그때그때 붙여 넣어서 사용하는 것이 바로 컬럼 그리드입니다.
한번 만들어 놓은 컬럼 그리드는 HTML 코드를 붙여 넣는 것 만으로도 여러가지 단을 쉽게 나열할 수 있습니다. 하지만 원리를 알지 못하고 무작정 가져다 쓰는 것은 무의미한 행동입니다. 이 글에서 어떻게 컬럼 그리드가 만들어지는지 이해하는 것이 중요합니다. 원리를 모르고 쓰는 것은 그냥 모르는 것입니다.
이 문서는 내용이 상당히 깁니다. 여러분이 불편하게 컴퓨터 앞에 앉아서 하나하나 따라해 보는 것이 아니라, 그냥 편하게 눈으로 한번 쭉 읽으면 감이 오도록 하기 위해서 부득이하게 분량이 늘어난 것입니다. 따라서 문서 내용이 많다고하여 부담스러워하면 안됩니다. 그냥 소설 읽듯이 쭉쭉 읽어내려가는 것이 중요합니다.
먼저, 각 컬럼들이 들어갈 공간부터 만들었습니다. 웹 사이트에서는 이 단이 컨텐츠가 뿌려질 단이 되겠죠. 이 부분은 실제로 컬럼 그리드와는 관계없습니다. 무대를 만든 것 뿐입니다.
<section class="contents"> </section>
이제 컬럼(단)을 2개 넣어보려고 합니다. 2개의 단이 서로 나란히 나열되는 형태를 만들기 위해서 입니다. 만들어진 단의 이름은 col-2
로 정의했습니다. 왜 이렇게 정했는지는 나중에 알게됩니다.
<section class="contents"> <div class="col-2">첫번째 단</div> <div class="col-2">첫번째 단</div> </section>
이제 각 컬럼을 나란히 정렬하기 위해 col-2
클래스에 float: left
속성을 부여했습니다. 이제부터 모든 컬럼은 float: left
속성을 갖게 되므로 계속해서 수평으로 나란히 붙게 됩니다. 그리고 너비를 50%로 설정하여 서로 같은 너비를 가지도록 했으며, 눈에 잘 띄도록 배경색도 넣었습니다.
컬럼이 서로 딱 붙어있으니 이제 간격을 주도록 합시다. 간격이 필요없는 형태를 원한다면 이 부분을 넘어가도 되겠지만, 지금은 넣어보도록 합시다.
이런… 각 컬럼에 양쪽 10px씩의 내부 여백을 넣었더니 단이 밑으로 떨어지고 말았습니다. 플로팅 드롭(Floating Drop) 현상이 발생한 것입니다. 2개의 단의 합이 100%에서 단 1px이라도 넓어지면 단은 떨어지고 맙니다. 어떻게 해서든 그 합이 100%를 넘지 않아야만 나란히 놓일 수 있는 것입니다.
하지만 우리는 너비가 50%인 각 컬럼의 양쪽에 10px씩의 내부 여백을 주었기 때문에 결과적으로는 아래와 같은 너비변화가 발생했습니다.
2개의 단에 양쪽 10px씩 여백이 발생했으므로, 총 40px이 넘어버린 것입니다. 이것은 CSS의 박스모델과 관계가 있는 부분이며, 좀 더 자세한 내용을 알고 싶다면 CSS 박스모델 이해하기 게시물을 통해 개념을 정리하세요.
결국, 이 문제를 해결하려면, 늘어난 여백 너비만큼 본래 단의 너비(50%)가 줄어들어야 합니다. 그래서 사용하는 CSS 속성으로 box-sizing: border-box
가 있습니다. 이 속성을 사용하게 되면, 내부 여백이 발생해도 width
속성에서 정의한 너비를 유지한 채, 단 안쪽으로 여백이 발생합니다.
이제 우리는 box-sizing: border-box
속성 덕분에 단 본연의 너비는 유지한 채, 안쪽에만 여백을 발생시켜 100%를 넘지 않도록 유지할 수 있게 되었습니다.
단, box-sizing: border-box
속성은 CSS3부터 생긴 새로운 속성이기 때문에 인터넷 익스플로러 6과 7 버전에서는 작동하지 않습니다. 아울러, 파이어폭스, 사파리, 크롬등의 최신 웹 브라우저에서도 모두 제대로 작동하게 하려면 브라우저 제조사별 전용 속성(Vendor-specific Properties)도 함께 정의해 주어야 합니다. 지금은 복잡하게 생각하지 말고 아래 추가된 CSS 속성을 참고해서 그대로 쓰면 됩니다.
그리고, 각 컬럼 사이에 생긴 간격을 좀 더 눈에 띄게 알아보기 위해서 내용을 길게 넣었습니다. 이제 각 단 사이에 확실히 간격이 생긴 것을 파악할 수 있습니다. 각 단의 색상도 바꾸면 단과 여백 사이의 경계를 더 잘 알아볼 수 있을 것 같군요. col-2
클래스에 정의했던 배경색을 삭제하고, HTML에서 각 단에 직접 CSS를 넣어서 색상을 구분해 볼까요?
각 단에 여백을 넣는 것에는 성공했지만, 우리가 원하는 것은 각 단과 단 사이에만 여백이 있고, 처음과 끝 부분은 양쪽에 딱 달라붙는 형태입니다. 만일 양쪽 끝을 정렬하지 않으면 다음과 같은 모양새가 됩니다.
각 컬럼에 모두 여백이 있다보니, 그 위에 있는 타이틀 부분의 끝선과 맞지 않고 안쪽으로 모여듭니다. 그러나 우리가 원하는 모양은 아래와 같아야 합니다.
이러한 이유로 컬럼의 첫 시작 부분과 끝 부분에 있는 10px의 여백을 삭제해야하는데, 약간의 꼼수를 쓰게 됩니다. 간략히 설명하자면, 컬럼을 감싸는 포장용 <div>
를 하나 만들고, 이 포장단의 양쪽 외부 여백(margin)을 바깥쪽으로 10px씩 끌어 당기는 것입니다. 그러면 포장단 안쪽에 위치한 컬럼의 처음과 끝이 10px씩 바깥쪽으로 빠지면서, 컬럼 안쪽의 내용물이 끝선에 맞춰지는 것입니다.
매우 복잡한 개념일수도 있으니 여기서는 느낌만 파악하면 됩니다. 이것은 일종의 꼼수이기 때문에 이 논리를 완전히 이해할 필요가 없습니다. 대충 알아놓고 잘 써먹기만 하면 그만입니다. 그러면 직접 이 부분을 적용해 보도록 하겠습니다. 아주 간단합니다.
<section class="contents"> <div class="row"> <div class="col-2" style="background-color: #ffdbdb"> 애플은 스티브 잡스와 스티브 워즈니악과 론 웨인이 1976년에 설립한 컴퓨터 회사이다. 이전 명칭은 애플 컴퓨터였다. </div> <div class="col-2" style="background-color: #59b1f6"> 애플은 스티브 잡스와 스티브 워즈니악과 론 웨인이 1976년에 설립한 컴퓨터 회사이다. 이전 명칭은 애플 컴퓨터였다. </div> </div> </section>
먼저, HTML에서는 각 컬럼을 모두 감싸는 포장용 단을 하나 만듭니다. 여기서는 row
라는 이름의 <div>
로 포장하였습니다.
.row { margin-left: -10px; margin-right: -10px; } .col-2 { float: left; width: 50%; padding-left: 10px; padding-right: 10px; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; }
그리고 CSS에서는 row
단에 음수마진을 사용하여 왼쪽과 오른쪽에 각각 -10px을 써서, 첫 단과 끝 단을 각각 10px씩 바깥쪽으로 당겨지도록 했습니다. 이것으로 끝입니다.
얼핏보면 달라진 것이 없어보이지만, 각 단의 컨텐츠들이 끝선에 정렬되었습니다. 정렬이 잘 되었는지 확인하려면, 컬럼 그리드 이외의 곳에 테스트용 문구를 적어 넣어보면 쉽게 알 수 있습니다.
이제 컬럼을 나열하고 끝선을 맞추는 것 까지 완성했습니다. 이제 남은 것은, 비단 2개의 컬럼뿐만 아니라, 원하는 갯수만큼 손쉽게 나열할 수 있도록 하는 것입니다. 일단, 잠시 4개의 단을 구성하는 것을 살펴본 후, 여러분이 원하는 만큼 나열할 수 있는 프레임웍을 드리겠습니다.
4개의 컬럼을 나열하려면 당연히 <div>
가 4개로 늘어야 하겠죠. HTML 코드에서 단을 4개로 늘려봅니다. (불필요한 배경색이나 테스트용 구문들은 모두 삭제했습니다)
<section class="contents"> <div class="row"> <div class="col-2"> 첫번째 단 </div> <div class="col-2"> 두번째 단 </div> <div class="col-2"> 세번째 단 </div> <div class="col-2"> 네번째 단 </div> </div> </section>
컬럼을 4개로 늘렸어도 각 단에 정의된 col-2
클래스의 너비가 50%로 지정되어 있기 때문에 이 컬럼들은 총 200%가 되버려서 한 줄에 나열되지 못합니다. 따라서 CSS에서 col-2 클래스의 너비를 25%로 변경하면 25% x 4 = 100%
가 되어서 한 줄에 나열됩니다. 하지만, 기존 클래스를 바꾸는 것보다 새로운 클래스를 만들어두면, 나중에 원하는 컬럼 수에 맞는 클래스를 불러 쉽게 사용할 수 있습니다.
col-2는 컬럼이 2개일 때 사용하는 클래스입니다. 따라서 컬럼이 4개일때 사용하는 클래스로 col-4
를 새로 만들어 사용합시다. 일단 HTML 코드의 클래스를 모두 col-4로 바꿉니다.
<section class="contents"> <div class="row"> <div class="col-4"> 첫번째 단 </div> <div class="col-4"> 두번째 단 </div> <div class="col-4"> 세번째 단 </div> <div class="col-4"> 네번째 단 </div> </div> </section>
이제 CSS 쪽을 조정해 볼까요? col-2를 사용할 경우에는 너비를 50%로, col-4로 사용할 경우에는 너비를 25%로 하려면 다음과 같이 짤 수 있을 겁니다.
.row { margin-left: -10px; margin-right: -10px; } .col-2 { float: left; width: 50%; padding-left: 10px; padding-right: 10px; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } .col-4 { float: left; width: 25%; padding-left: 10px; padding-right: 10px; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; }
하지만 이렇게 CSS를 사용하는 것은 코드 낭비입니다. col-2와 col-4의 차이점이라면 너비 속성 1개뿐이므로, 다음과 같이 변경하면 더욱 효과적입니다.
.row { margin-left: -10px; margin-right: -10px; } .col-2 { width: 50% } .col-4 { width: 25% } .col-2, .col-4 { float: left; padding-left: 10px; padding-right: 10px; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; }
이 표현이 이해가 가나요? col-2
와 col-4
에 각각 서로 다른 너비를 정의하고, 그 외에 공통된 부분은 콤마(,)를 사용해서 묶어버린 것입니다. 이렇게하면 우리는 col-2와 col-4를 모두 정의해 놓은 상태여서, 원할때마다 적절한 클래스를 쓸 수 있게 됩니다. 아울러, CSS 코드의 양도 반 정도로 확 줄어서 좋죠.
기나긴 문서를 읽느라 고생 많으셨습니다. 이해가 된 사람도 있고 안된 사람도 있을 수 있습니다. 중요한건, 느낌만 알고 이후부터는 그냥 가져다 쓰는 것에 있습니다. 이제 여러분이 원하는 만큼의 컬럼을 손쉽게 만들 수 있는 프레임워크를 드리겠습니다.
이 프레임워크의 소스코드를 살펴보면 여러분이 위에서 알아본 모든 것이 그대로 포함되어 있습니다. 한번씩 이 프레임워크의 HTML 파일을 열어 살펴보세요. 총 10개까지 나열할 수 있습니다.
이 프레임워크에 사용 된 CSS 코드는 여러분이 사용하는 스타일시트 파일에 복사해서 넣던지, 혹은 별도의 CSS 파일로 만들어서 HTML 문서에서 링크시키던지 여러분의 마음입니다.
프레임워크에 사용된 CSS에는 각 컬럼의 여백과 경계를 보기 쉽게 하기 위해 테두리 속성(border)이 사용되었습니다. 이런 것들은 여러분의 디자인에 맞게 삭제해서 사용해도 좋습니다.
감사합니다. 너무 재밌네요 ㅎㅎ
컬럼 그리드만 이해해도 부트스트랩 같은 프로토타입 라이브러리에 의존하지 않고 스스로 반응형 컨텐츠를 쉽게 만들 수 있어요~
부트스트랩의 원리를 이해하고 사용할 수 있겠네요 ㅎ 감사합니다 ㅎ
깔끔한 정리네요. 감사합니다. 그리드 원리는 알았어도 꼼수는 몰랐습니다.