Twitter Bootstrap - Grid System Tutorial


In this tutorial, you will learn how to use Twitter Bootstrap to create a Grid System.
As you may know, in graphics design, a Grid system is a two dimensional structure made up of horizontal and vertical axes having intersecting areas, useful for structuring content. It is widely used to design layout and content structure in print design. In web design, it is a very effective method to create a consistent layout rapidly and effectively using HTML and CSS. Thus, Grid systems have become an essential component/module for web design framework or workflow.

Explaining it in a simple way, in web design, we create rows and columns using HTML and CSS to achieve a grid. And columns contain the actual content.
As of Version 2.3.2, Twitter Bootstrap offers two types of Grids. The default Grid System is 940px wide and 12 column. You can add the responsive stylesheet to it and then it will become adaptable to 724px and 1170px wide with respect to the viewport it is rendered on.
There is also a fluid grid system. This is a percentange based one instead of pixel based. And can be extended to the responsiveness same as the default fixed grid. We will discuss the default one with several examples in this tutorial and will have separate tutorial for fluid grid system.
It would be great if you have downloaded the Latest Bootstrap files from "http://twitter.github.io/bootstrap/assets/bootstrap.zip". You can see the file structure of this download from our introductory tutorial.

Getting started with default Grid
Let's start with a basic HTML and we will see how to apply default grid on that.


 <!DOCTYPE html>
<html>
  <head>
    <title>Fixed layout example with Twitter Bootstrap</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!-- Bootstrap -->
    <link href="bootstrap/css/bootstrap.min.css" rel="stylesheet" media="screen">
  </head>
  <body>

    <script src="http://code.jquery.com/jquery.js"></script>
    <script src="bootstrap/js/bootstrap.min.js"></script>
  </body>
</html>

Bootstrap uses CSS class "row" for creating horizontal rows and CSS class "spanx" (where value of x is 1 through 12) for creating vertical columns. So, two create a three column grid (each column containing some text content), our HTML will look like following


 <!DOCTYPE html>
<html>
  <head>
    <title>Fixed layout example with Twitter Bootstrap</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!-- Bootstrap -->
    <link href="bootstrap/css/bootstrap.min.css" rel="stylesheet" media="screen">
  </head>
  <body>
<div class="row">
  <div class="span4"><p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nam cursus. Morbi ut mi. Nullam enim leo, egestas id, condimentum at, laoreet mattis, massa. Sed eleifend nonummy diam. Praesent mauris ante, elementum et, bibendum at, posuere sit amet, nibh. Duis tincidunt lectus quis dui viverra vestibulum. Suspendisse vulputate aliquam dui. Nulla elementum dui ut augue. Aliquam vehicula mi at mauris. Maecenas placerat, nisl at consequat rhoncus, sem nunc gravida justo, quis eleifend arcu velit quis lacus. Morbi magna magna, tincidunt a, mattis non, imperdiet vitae, tellus. Sed odio est, auctor ac, sollicitudin in, consequat vitae, orci. Fusce id felis. Vivamus sollicitudin metus eget eros.</p></div>
  <div class="span4"><p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nam cursus. Morbi ut mi. Nullam enim leo, egestas id, condimentum at, laoreet mattis, massa. Sed eleifend nonummy diam. Praesent mauris ante, elementum et, bibendum at, posuere sit amet, nibh. Duis tincidunt lectus quis dui viverra vestibulum. Suspendisse vulputate aliquam dui. Nulla elementum dui ut augue. Aliquam vehicula mi at mauris. Maecenas placerat, nisl at consequat rhoncus, sem nunc gravida justo, quis eleifend arcu velit quis lacus. Morbi magna magna, tincidunt a, mattis non, imperdiet vitae, tellus. Sed odio est, auctor ac, sollicitudin in, consequat vitae, orci. Fusce id felis. Vivamus sollicitudin metus eget eros.</p></div>
  <div class="span4"><p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nam cursus. Morbi ut mi. Nullam enim leo, egestas id, condimentum at, laoreet mattis, massa. Sed eleifend nonummy diam. Praesent mauris ante, elementum et, bibendum at, posuere sit amet, nibh. Duis tincidunt lectus quis dui viverra vestibulum. Suspendisse vulputate aliquam dui. Nulla elementum dui ut augue. Aliquam vehicula mi at mauris. Maecenas placerat, nisl at consequat rhoncus, sem nunc gravida justo, quis eleifend arcu velit quis lacus. Morbi magna magna, tincidunt a, mattis non, imperdiet vitae, tellus. Sed odio est, auctor ac, sollicitudin in, consequat vitae, orci. Fusce id felis. Vivamus sollicitudin metus eget eros.</p></div>
</div>  
  <script src="http://code.jquery.com/jquery.js"></script>
    <script src="bootstrap/js/bootstrap.min.js"></script>
  </body>
</html>

Here is pictorial presentation of the Grid system


So, we ended up creating a three column grid using "span4" class for each of the columns. There is a "container" class to hold the entire structure. And from this we can derive the general syntax for which CSS class to be used for creating a given number of columns.
General syntax for creating grid is :


<div class="row">  
<div class="spanx">  
inline elements like span, block level elements like p, div.  
</div>  
repeat <div class="spanx"> y times.  
              
Where y is the number of columns you want to create and sum of x's (used through y number of columns) equals to 12 (since that is the maximum number of columns you can create). Value x must be positive integer and values must be 1 through 12.
So, for example, if you have three equal width columns, then the first column will be of class="span4", and so is the second and third column. But if you want the first column bigger you may use class="span6" and other two columns may be class="span3".
How rows are created in fixed grid
Now, before we proceed to a bit non trivial examples, we will see what are the CSS rules used to create rows and columns in a fixed grid.
row class stats with this


.row {  
  margin-left: -20px;  
  *zoom: 1;  
}  
A negative left margin of 20px is set and a "*zoom: 1;" is set. "*" here points to all elements and setting zoom property to 1 is used to fix bugs in IE6/7. Setting zoom property to 1 sets an internal property called hasLayout, which fixes many of the scaling/rendering problems of IE6/7.


.row:before,  
.row:after {  
  display: table;  
  line-height: 0;  
  content: "";  
}  
Bootstrap uses the above CSS code to create rows. It uses ":before" and ":after" CSS properties. These are pseudo-elements. ":before" is used to insert some content before the targeted element and ":after" is used to insert the same after the targeted element. "display:table;" makes the element to rendered as a table. Along with that it has been made sure rows don't have their own line-height by setting "line-height: 0;" and since 'content: ""' is used, no content is inserted before or after the element in question.
And then the following rule is used to make sure that no floating element comes either on left or on right side of given element.

.row:after {  
  clear: both;  
}  
How columns are created in fixed grid


[class*="span"] {  
  float: left;  
  min-height: 1px;  
  margin-left: 20px;  
}  
This is the CSS rule which is used. '[class*="span"]' selects any element having a class attribute whose value starts with 'span'. Now to place columns next to each other, "float: left;" is used. And all of the columns have a minimum height of 1px because of "min-height: 1px" and a left margin of 20px.


Example of Twitter Bootstrap default Grid
This example shows how to create 1 column, 2 columns, 6 columns, 12 columns and 4 columns (in that order).
Also note that, all of the columns created are wrapped with "container" class, which is used to create a fixed layout using Twitter Bootstrap.

  <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Twitter Bootstrap Grid System Example - bh24 Twitter Bootstrap Tutorial</title>
<meta name="description" content="Creating a 16 columns Grid with Twitter Bootstrap. Learn with examples to create a Grid System in Twitter Bootstrap.">
<link href="booststrap/css/bootstrap.min.css" rel="stylesheet">
<style>
.span12 h1{color:#FE6E4C; font-weight: bold; padding: 5px;}
h3 {margin: 10px 0 10px 0;}
</style>
</head>
<body>
<div class="container">
<div class="row">
<div class="span12">
<h1>bloggerhelp24.blogspot.com is a web design and development tutorial.</h1>
</div>
</div>
<div class="row">
<div class="span3">
<p><img src="/images/bh24.png" width="149" height="52" alt="bh24 logo" /></p>
</div>
<div class="span9">
<p>bh24 offers web development tutorials. We believe in Open Source. Love standards. And prioritize simplicity and readability while serving content. With 1000+ unique content pages and thousands of examples, we are comprehensive. We have online practice editors to play around with the example codes.</p>
</div>
</div>
<div class="row">
<div class="span12">
<h3>Some of the topics and more... :</h3>
</div>
<div class="span2">
<p><img src="images/html5_logo.png" width="140" height="86" alt="html5 logo" /></p>
</div>
<div class="span2">
<p><img src="images/javascript-logo.png" width="140" height="86" alt="javascript logo" /></p>
</div>
<div class="span2">
<p><img src="images/json.gif" width="140" height="86" alt="JSON logo" /></p>
</div>
<div class="span2">
<p><img src="images/php.png" width="140" height="86" alt="PHP logo" /></p>
</div>
<div class="span2">
<p><img src="images/mysql-logo.png" width="140" height="86" alt="MySQL logo" /></p>
</div>
<div class="span2">
<p><img src="images/browser-statistics.png" width="140" height="86" alt="Browser Statistics logo" /></p>
</div>
</div>
<div class="row">
<div class="span12">
<h3>Social networking sites to share:</h3>
</div>
</div>
<div class="row">
<div class="span1">
<p><img src="images/gplus.png" width="50" height="49" alt="GPlus logo" /></p>
</div>
<div class="span1">
<p><img src="images/twitter.png" width="50" height="38" alt="Twitter logo" /></p>
</div>
<div class="span1">
<p><img src="images/orkut.png" width="50" height="55" alt="Orkut logo" /></p>
</div>
<div class="span1">
<p><img src="images/ipad.png" width="50" height="53" alt="iPad logo" /></p>
</div>
<div class="span1">
<p><img src="images/digo.png" width="50" height="54" alt="Digo logo" /></p>
</div>
<div class="span1">
<p><img src="images/zapface.png" width="51" height="53" alt="Zapface logo" /></p>
</div>
<div class="span1">
<p><img src="images/facebook.png" width="48" height="53" alt="facebook logo" /></p>
</div>
<div class="span1">
<p><img src="images/netvibes.png" width="51" height="53" alt="Netvibes logo" /></p>
</div>
<div class="span1">
<p><img src="images/linkedin.png" width="49" height="54" alt="LinkedIn logo" /></p>
</div>
<div class="span1">
<p><img src="images/newsvine.png" width="48" height="53" alt="Newsvine logo" /></p>
</div>
<div class="span1">
<p><img src="images/blogger.png" width="51" height="53" alt="Blogger logo" /></p>
</div>
<div class="span1">
<p><img src="images/reditt.png" width="48" height="57" alt="Reddit logo" /></p>
</div>
</div>
<div class="row">
<div class="span3">
<h3>Fontend Development:</h3>
<p>HTML4.0, XHTML1.0, CSS2.1, HTML5, CSS3, JavaScript</p>
</div>
<div class="span3">
<h3>Backend Developemt:</h3>
<p>PHP, Ruby, Python, Java, ASP.NET, SCALA</p>
</div>
<div class="span3">
<h3>Database Management:</h3>
<p>SQL, MySQL POstgreSQL, NoSQL, MongoDB</p>
</div>
<div class="span3">
<h3>APIs, Tools and Tips:</h3>
<p>Google Plus API, Twitter Bootstrap, JSON, Firebug, WebPNG</p>
</div>
</div>
</div>
</body>
</html>
            

Offsetting columns: default grid
By using offset, you can move a column to the right of it's native position. This is achieved by suitably adding left margin to a column. Using Twitter Bootstrap you can use "offsetx" (where value of x is a positive integer) class along with class "spany" (where value of y is a positive intege). Depending upon the value of 'x' in 'offestx', the associated column is moved 'x' number of columns to the right of it's native position.
Width of the offsets are defined in Bootstrap CSS. offset12 has the highest left margin of 980px and offset1 is having the lowest left margin of 100px.
Since default grid system is pixel based, while applying offsets, you must be aware of the pixels you are using for offset and pixels you are using for columns. Together, they must not exceed the number of pixels you have on your viewport horizontally.
In the following example we want to create a two column grid where we want the left column to be moved 4 columns to it's right. Then the HTML code for that will be following:


<!DOCTYPE html>
<html>
  <head>
    <title>Bootstrap offsetting column example</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!-- Bootstrap -->
    <link href="bootstrap/css/bootstrap.min.css" rel="stylesheet" media="screen">
  </head>
  <body>
    <div class="container">
    <div class="row">
<div class="span4 offset4">
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nam cursus. Morbi ut mi. Nullam enim leo, egestas id, condimentum at, laoreet mattis, massa. Sed eleifend nonummy diam. Praesent mauris ante, elementum et, bibendum at, posuere sit amet, nibh. Duis tincidunt lectus quis dui viverra vestibulum. Suspendisse vulputate aliquam dui. Nulla elementum dui ut augue. Aliquam vehicula mi at mauris. Maecenas placerat, nisl at consequat rhoncus, sem nunc gravida justo, quis eleifend arcu velit quis lacus. Morbi magna magna, tincidunt a, mattis non, imperdiet vitae, tellus. Sed odio est, auctor ac, sollicitudin in, consequat vitae, orci. Fusce id felis. Vivamus sollicitudin metus eget eros.</p>
</div>
<div class="span3">
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nam cursus. Morbi ut mi. Nullam enim leo, egestas id, condimentum at, laoreet mattis, massa. Sed eleifend nonummy diam. Praesent mauris ante, elementum et, bibendum at, posuere sit amet, nibh. Duis tincidunt lectus quis dui viverra vestibulum. Suspendisse vulputate aliquam dui. Nulla elementum dui ut augue. Aliquam vehicula mi at mauris. Maecenas placerat, nisl at consequat rhoncus, sem nunc gravida justo, quis eleifend arcu velit quis lacus. Morbi magna magna, tincidunt a, mattis non, imperdiet vitae, tellus. Sed odio est, auctor ac, sollicitudin in, consequat vitae, orci. Fusce id felis. Vivamus sollicitudin metus eget eros.</p>
</div>
</div>
</div>
    <script src="http://code.jquery.com/jquery.js"></script>
    <script src="bootstrap/js/bootstrap.min.js"></script>
  </body>
</html>
You can add responsive features to the default grid with columns using offset too by adding the responsive CSS immediately after the native CSS.
Nesting columns: default grid

Columns can be nested using Twitter Bootstrap default grid. You simply create a row within a column and create the number of columns you want in the nested row. But while doing so you must remember that total number columns of the column nesting other columns, must not exceed the number of columns you mentioned while creating the parent column.
Following example shows how to keep nested columns in default grid of Bootstrap.

<!DOCTYPE html>
<html>
  <head>
    <title>Bootstrap nested columns example</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!-- Bootstrap -->
    <link href="bootstrap/css/bootstrap.min.css" rel="stylesheet" media="screen">
  </head>
  <body>
    <div class="container">
    <div class="row">
    <div class="span7">
    <div class="row">
    <div class="span4">
   <p>Maecenas aliquet velit vel turpis. Mauris neque metus, malesuada nec, ultricies sit amet, porttitor mattis, enim. In massa libero, interdum nec, interdum vel, blandit sed, nulla. In ullamcorper, est eget tempor cursus, neque mi consectetuer mi, a ultricies massa est sed nisl. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Proin nulla arcu, nonummy luctus, dictum eget, fermentum et, lorem. Nunc porta convallis pede.</p>
    </div>
   <div class="span3">
<p>Maecenas aliquet velit vel turpis. Mauris neque metus, malesuada nec, ultricies sit amet, porttitor mattis, enim. In massa libero, interdum nec, interdum vel, blandit sed, nulla. In ullamcorper, est eget tempor cursus, neque mi consectetuer mi, a ultricies massa est sed nisl. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Proin nulla arcu, nonummy luctus, dictum eget, fermentum et, lorem. Nunc porta convallis pede.</p>
    </div>
    </div>
   </div>
  <div class="span5">
  <p>Maecenas aliquet velit vel turpis. Mauris neque metus, malesuada nec, ultricies sit amet, porttitor mattis, enim. In massa libero, interdum nec, interdum vel, blandit sed, nulla. In ullamcorper, est eget tempor cursus, neque mi consectetuer mi, a ultricies massa est sed nisl. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Proin nulla arcu, nonummy luctus, dictum eget, fermentum et, lorem. Nunc porta convallis pede.</p>
    </div>
   </div>
   </div>
    <script src="http://code.jquery.com/jquery.js"></script>
    <script src="bootstrap/js/bootstrap.min.js"></script>
  </body>
</html>

In the above example, the row which is directly under the container has two columns, defined by 'class="span7"' and 'class="span5"'. That makes total number of columns 12. Prefect. Now we added another row within the left column and then created two columns defined by 'class="span4"' and 'class="span3"', so it abides by the total number of columns specified for it's parent column (7=4+3).
You can add responsive feature here too.

 

Comments