Bootstrap 3.3.7 그리드 시스템
그리드 시스템이란?
Bootstrap 사용의 가장 큰 장점은 “화면 크기에 따라 레이아웃을 자동으로 조정할 수 있다’라는 점에 있을 것이다. 레이아웃에 큰 핵심이 되는 것은 “그리드 시스템"이다.
그리드 시스템이라는 것은 표시하는 내용을 몇 블록으로 나누어 정리하고 이를 “그리드"라는 종횡으로 분할한 영역에 끼워 표시하는 방법이다. 알기 쉽게 말하면, “표"와 같은 것에 콘텐츠를 집어 넣어 표시하는 것이라고 생각하면 좋을 것이다.
이 그리드 시스템의 가장 큰 특징은 “옆으로 늘어선 블록을 자동 조정한다"라는 점에 있다. 예를 들어 폭이 넓은 컴퓨터 화면에서는 두 블록을 나란히 표시하지만, 스마트 폰과 같은 폭이 좁은 화면에는 두 블록을 세로로 나란히 된다.
이 자동 조정은 태그에 설정되는 CSS 클래스에 의해 실현하고 있다. 그리드 시스템에 의한 콘텐츠 작성법을 정리하면 아래와 같은 소스 코드가 된다.
<div class="container">
<div class="container-fluid">
<div class="row">
<div>내용</div>
<div>내용</div>
...
</div>
<div class="row">
...필요한 row을 준비...
</div>
</div>
</div>
포인트를 몇 가지 정리한다.
<div class="container">
이것은 이미 이전에 등장 했다. Bootstrap의 콘텐츠는 항상 class="container"
태그 내에 기술한다. 이것에 의해 폭이 자동 조정이 된다.
<div class="container-fluid">
이것이 그리드 시스템의 컨테이너가 되는 부분이다. class="container-fluid"
에 의해 이중으로 작성된 태그가 폭에 따라 자동 조정되게 된다.
(.container
와 .container-fluid
에 대해서는 후에 다시 자세히 설명하겠다.)
<div class="row">
이것은 콘텐츠의 row(가로 열)를 작성하기 위한 컨테이너이다. 그리드 시스템에서는 이 class="row"
태그 안에 표시할 내용을 준비한다. 그로 인해, 이 class="row"
태그 안에 포함된 콘텐츠의 태그가 자동으로 가로로 나란히 정렬되거나, 세로로 정렬되거나 한다.
class="row"
을 지정한 태그는 여러가지가 있다. 그것들은 수직으로 정렬된다. 이 “row 안에 가로로 콘텐츠를 준비하고, 그 row를 얼마든지 쓰고 나란히 정렬한다"라는 기본적인 구조를 제대로 이해해 두도록 한다.
컨테이너(container)
레이아웃을 만드는 가장 상위 요소에 .container
또는 .container-fluid
를 추가한다. 전체 가로폭을 정하는 클래스 값이다.
클래스명 | 설명 |
---|---|
.container |
고정폭 레이아웃을 만들 때 사용한다. |
.container-fluid |
좌우로 꽉 찬 레이아웃을 만들 때 사용한다. |
.container의 속성은 다음과 같다.
.container {
padding-right: 15px;
padding-left: 15px;
margin-right: auto;
margin-left: auto;
}
@media (min-width: 768px) {
.container {
width: 750px;
}
}
@media (min-width: 992px) {
.container {
width: 970px;
}
}
@media (min-width: 1200px) {
.container {
width: 1170px;
}
}
가로 해상도 767px 이하에서는 100%, 768px 이상에서는 750px, 992px 이상에서는 970px, 1200px 이상에서는 1170px의 가로폭을 가진다.
.container-fluid의 속성은 다음과 같다.
.container-fluid {
padding-right: 15px;
padding-left: 15px;
margin-right: auto;
margin-left: auto;
}
가로 해상도에 관계없이 100%의 가로폭을 가진다.
두가지 클래스를 비교할 수 이는 사용 예제는 아래와 같다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Bootstrap</title>
<link rel="stylesheet" href="css/bootstrap.min.css">
<style>
.container {
background-color: #cccccc;
}
.container-fluid {
background-color: #dddddd;
}
h1 {
margin: 100px 0px;
}
</style>
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
</head>
<body>
<div class="container">
<h1>.container</h1>
</div>
<div class="container-fluid">
<h1>.container-fluid</h1>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script src="js/bootstrap.min.js"></script>
</body>
</html>
폭 조정을 하는 클래스
그리드 시스템 최대의 포인트는 row 내에 배치하는 내용으로 설정하는 “클래스"이다.
이 클래스는 col-종류-숫자
형태로 작성한다. “종류"는 디바이스의 종류, 이는 디바이스의 가로폭에 따라 4가지 종류가 준비되어 있다. 아래와 정리할 수 있다.
종류 | 크기 | 주로 해당되는 디바이스 |
---|---|---|
lg | 1200px 이상 | PC, 태블릿 |
md | 992 ~ 1200px | 태블릿 |
sm | 768 ~ 992px | 태블릿 |
xs | 768px 미만 | 스마트 폰 |
PC의 큰 화면이라면 lg, 스마트 폰에서 세로로 표시된다면 xs 클래스가 적용된다고 생각하면 된다. 태블릿의 경우는 해상도에 따라 lg ~ sm 중 하나가 사용되게 될 것이다.
이후에 “숫자"는 그 내용이 row에 차지하는 비중이다. row는 폭 전체를 “12"의 블록으로 나누어 관리한다. 이 마지막 숫자는 “그 콘텐츠가 블록 비줄이 얼마인지"를 보여줍니다.
예를 들어, 2개의 콘텐츠를 가로한다면, “6"과 “6"으로하면 그냥 반씩이 된다. “4"와 “8"으로 하면 1 : 2의 비율로 나타날 수 있다. “합계가 12 이상이 되면?“라고 생각한 사람이 있을 수 있다. 이런 경우는 12 이후에 컨텐츠는 다음 행으로 줄 바꿈되어 표시된다.
예로써 “768 ~ 992px 크기에서 4 : 8로 표시"되는 경우의 태그를 아래는 아래와 같다. 이는 두 개의 콘텐츠가 4 : 8 (1 : 2)로 표시된다. 또한, 보기 쉽도록 style 속성에서 배경색을 지정하고 있다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Bootstrap</title>
<script src="./js/jquery-3.1.1.min.js"></script>
<script src="./js/bootstrap.min.js"></script>
<link rel="stylesheet" href="./css/bootstrap.min.css">
<link rel="stylesheet" href="./css/bootstrap-theme.min.css">
</head>
<body >
<div class="container">
<h1>그리드 시스템</h1>
<div class="container-fluid">
<div class="row">
<div class="col-sm-4"
style="border:1px solid white; background-color:#eee;">
<p>MENU</p></div>
<div class="col-sm-8"
style="border:1px solid white; background-color:#eee;">
<p>Content.</p><p>Content.</p><p>Content.</p></div>
</div>
</div>
</div>
</body>
</html>
여러 화면 크기에 대응하기
그리드 시스템의 기본 클래스 설정 방법은 알게 되었. 여기서 이런 의문이 생길지도 모른다.
“4개의 디바이스의 종류가 있는데, 내 사이트에는 어떤 것을 준비하면 되는거야?“라고 생각할 수도 있다.
이런 사람은 “이 중에 사용하고 싶은 것을 골라 쓸 것이다"라고 착각을 하고 있는 것이다. 그렇지는 않다.
디바이스의 종류별 클래스는 모두 준비되어 있는 것이다!
이는 하나 밖에 해당된다는 의미가 아니다. 그 내용이 디바이드의 폭에 따라 자동으로 배치되도록 조정되는 클래스이기 때문이다. 어떤 가로에도 최적이 되도록, 모든 클래스를 준비해 두는 것이다.
예를 들어, 방금 작성한 “4 : 8에서 콘텐츠를 표시"하는 샘플을 모든 디바이스으로 대응 되도록 수정한 것을 아래에 올려 둔었다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Bootstrap</title>
<script src="./js/jquery-3.1.1.min.js"></script>
<script src="./js/bootstrap.min.js"></script>
<link rel="stylesheet" href="./css/bootstrap.min.css">
<link rel="stylesheet" href="./css/bootstrap-theme.min.css">
</head>
<body >
<div class="container">
<h1>그리드 시스템</h1>
<div class="container-fluid">
<div class="row">
<div class="col-lg-2 col-md-3 col-sm-4 col-xs-12"
style="border:1px solid white; background-color:#eee;">
<p>MENU</p></div>
<div class="col-lg-10 col-md-9 col-sm-8 col-xs-12"
style="border:1px solid white; background-color:#eee;">
<p>Content.</p><p>Content.</p><p>Content.</p></div>
</div>
</div>
</div>
</body>
</html>
여기에 표시할 내용의 비율을 다음과 같이 설정되어 있다.
종류 | 크기 | 비율 |
---|---|---|
lg | 1200px 이상 | 2 : 10으로 보기 |
md | 992 ~ 1200px | 3 : 9로 표시 |
sm | 768 ~ 992px | 4 : 8로 표시 |
xs | 768px 미만 | 12 : 12으로 표시 (각각 한 줄씩 표시) |
어떠한가? 이렇게 설정하면 왼쪽의 컨텐츠(MENU가 표시되는 부분)는 어느 정도의 폭을 정리하고, 오른쪽 내용 중 일부를 필요에 따라 확대될 수 있도록 하고 있다. 또한 스마트 폰에는 MENU 아래에 내용이 세로로 표시되도록 한다.
이처럼 모든 크기의 클래스를 제공함으로써, 생각한대로 레이아웃을 실현할 수 있다. “귀찮다"라고 생각한 사람도, 적어도 “768px 미만과 그 이상의 어느것"이라도 준비하도록 하자.
오프셋(offset)과 비져블(visible)
그리드 시스템은 기본적으로 “준비된 콘텐츠를 순서대로 정렬하여 표시한다"는 것이지만, 표시를 조정하는 기능도 일부 갖고있다. 그 중에서도 비교적 간단하고, 기억해 두면 편리한 2개를 소개한다.
오프셋(offset)
오프셋은 지정된 블록만 간격을 두고 배치하기 위한 것이다. 이것은 col-종류-offset-숫자
형태로 작성한다. 예를 들어, md 사이즈의 1블록 사이를 비우고 3블록 역역의 콘텐츠를 배치한다면,
class="col-md-offset-1 col-md-3"
이런 식으로 클래스를 제공한다. 이것으로 그 앞에 있는 콘텐츠에서 1블록을 빈공간로 표시를 두고, 3블록 영역의 내용을 표시한다.
비져블(visible)
이것은 지정된 디바이스의 크기인 경우에만 콘텐츠를 표시하기 위한 것이다. 이것은 visible-종류-block
라는 형태로 클래스 이름을 지정한다. 예를 들어,
class="visible-md-block"
이와 같이 작성하면, 이 태그는 md으로 설정되는 폭(992 ~ 1200px)의 경우에만 표시되고, 그 이외의 경우는 표시되지 않는다. 이것을 사용하여 폭에 따라 다른 내용을 표시하거나 하는 것이 가능하다.
실제 사용 예를 아래에 올려 둔다. 이것은 오프셋과 비져블를 통합한 샘플이다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Bootstrap</title>
<script src="./js/jquery-3.1.1.min.js"></script>
<script src="./js/bootstrap.min.js"></script>
<link rel="stylesheet" href="./css/bootstrap.min.css">
<link rel="stylesheet" href="./css/bootstrap-theme.min.css">
</head>
<body >
<div class="container">
<h1>그리드 시스템</h1>
<div class="container-fluid">
<div class="row">
<div class="col-lg-1 col-md-2 col-sm-3 col-xs-12"
style="border:1px solid white; background-color:#eee;">
<p>MENU</p></div>
<div class="col-lg-9 col-lg-offfset-1 col-md-7 col-md-offset-1 col-sm-6 col-sm-offset-1 col-xs-12"
style="border:1px solid white; background-color:#eee;">
<p>Content.</p><p>Content.</p><p>Content.</p></div>
<div class="visible-lg-block visible-md-block visible-sm-block">
<div class="col-lg-1 col-md-2 col-sm-2 col-xs-12"
style="border:1px solid white; background-color:#dfd;">
<p>default option</p></div>
</div>
<div class="visible-xs-block">
<div class="col-xs-12"
style="border:1px solid white; background-color:#fdd;">
<p>small option</p></div>
</div>
</div>
</div>
</div>
</body>
</html>
폭이 넓은 디바이스라면, MENU 및 Content 사이에 1블록 영역의 여백을 두고 표시된다. 맨 오른쪽에는 default option이 표시되고, 폭이 좁아지면 MENU 및 Content가 수직으로 겹쳐지게 된다(여백이 사라진다). 그리고, 표시되는 default option 대신에 small option가 표시된다.
스마트 폰과 태블릿, PC의 레이아웃을 변경하기에 그리드 시스템이 매우 효과적이라는 것을 알 수 있다. 이 그리드 시스템을 사용하는 것만으로도 Bootstrap을 이용하는 가치가 있다고 할 수 있다.
표시 결과 설명
- 폭이 넓으면, MENU 및 Content 사이에 1블록 영역의 여백을 두고 표시한다.
- 맨 오른쪽에는 default option이 표시된다.
- 폭이 좁아하면 MENU 및 Content가 세로로 겹쳐 표시된다.
- default option 대신에, small option이 표시된다.