Cómo usar Bootstrap en una aplicación web

Bootstrap

Bootstrap es un framework para CSS y JavaScript, creado con el objetivo de facilitar la organización de contenido, la aplicación de estilos y el desarrollo de páginas web adaptables a dispositivos móviles. En este artículo se demostrará como usar Bootstrap en una aplicación web.

Hemos preparado un sitio web estático cargado con información básica sobre todas las películas de la saga Star Wars, para que el lector pueda usarlo durante el desarrollo del artículo. Este sitio web es bastante simple y solo contiene código HTML sin estilos CSS ni código JavaScript.

El sitio web puede ser descargado como un archivo ZIP desde Github y Bitbucket, o puede ser clonado desde una terminal:

$ git clone https://github.com/rukbotto/simple-starwars-site.git

Esto creará un directorio simple-starwars-site/ con todas las páginas e imágenes del sitio web:

simple-starwars-site/
  add-movie/
  episode-i/
  episode-ii/
  episode-iii/
  episode-iv/
  episode-v/
  episode-vi/
  episode-vii/
  media/
  index.html

El objetivo es utilizar Bootstrap para organizar el contenido, mejorar la tipografía y las imágenes y aplicar estilos a todas las páginas del sitio.

Descargando e instalando Bootstrap

Las instrucciones que aparecen en este artículo aplican para la versión 3.3.6 de Bootstrap.

A continuación, es necesario descargar e instalar Bootstrap. Para esto, nos dirigimos a la página de descargas de Bootstrap:

Al finalizar la descarga, obtendremos el archivo bootstrap-3.3.6-dist.zip el cual vamos a descomprimir. El directorio resultante tiene la siguiente estructura:

bootstrap-3.3.6-dist/
  css/
  fonts/
  js/

Copiamos los directorios css/, fonts/ y js/ al directorio donde se encuentra el sitio web estático, de la siguiente manera:

simple-starwars-site/
  static/
    css/
    fonts/
    js/

Para finalizar la instalación, es necesario incluir los archivos CSS de Bootstrap en la sección <head> de cada uno de los archivos HTML que se encuentran en el directorio del sitio estático:

<head>
  <link rel="stylesheet" href="/static/css/bootstrap.css">
  <link rel="stylesheet" href="/static/css/bootstrap-theme.css">
</head>

También debemos incluir el archivo JavaScript de Bootstrap al final de cada archivo HTML, antes del cierre de la etiqueta <body>:

  <script src="/static/js/bootstrap.js"></script>
</body>

Descargando e instalando jQuery

Algunos componentes de Bootstrap utilizan código JavaScript y la librería jQuery para funcionar correctamente. A continuación vamos a descargar e instalar jQuery. Podemos obtener la última versión en la página de descargas:

Descargamos la última versión de desarrollo, que al momento de escribir este artículo es la versión 1.12.1, y copiamos el archivo al directorio del sitio web estático:

simple-starwars-site/
  static/
    js/
      jquery-1.12.1.js

Incluimos la librería jQuery al final de cada uno de archivos HTML, antes del cierre de la etiqueta <body>. La inclusión de jQuery debe hacerse justo antes de la inclusión de Bootstrap:

  <script src="/static/js/jquery-1.12.1.js"></script>
  <script src="/static/js/bootstrap.js"></script>
</body>

Configurando un servidor web ligero

Para visualizar el sitio web en el navegador web de manera apropiada, se recomienda usar un servidor web ligero. En este caso vamos a usar SimpleHTTPServer para Python 2.7 o http.server para Python 3.

Para iniciar el servidor ligero, ejecutamos los siguientes comandos desde la terminal:

$ cd simple-starwars-site/

>> Python 2.7
$ python -m SimpleHTTPServer 8080

>> Python 3
$ python -m http.server 8080

Probando la instalación de Bootstrap y jQuery

Para probar si Bootstrap y jQuery han sido instalados correctamente, cargamos la dirección http://localhost:8080 en nuestro navegador web. Si vemos que el estilo de la tipografía y el color de los enlaces ha cambiado, entonces el procedimiento ha sido exitoso:

Organizando la página de inicio

En la página de inicio, tenemos un listado con las siete películas de Star Wars que hasta el momento se han producido y presentado. Para cada película en el listado, se muestra el titulo, la imagen del póster oficial y el texto que aparece al iniciar cada película, llamado Opening Crawl.

Lo que queremos es organizar la información de tal manera que podamos ver la imagen del póster y al mismo tiempo ver el Opening Crawl sin tener que desplazarnos demasiado por toda la página.

Para organizar el contenido usaremos un componente de Bootstrap llamado Grid que nos permite dividir el área de la página en una grilla de doce columnas por las filas que deseemos.

Este componente es completamente adaptable, lo que significa que el sitio web se ajustará automáticamente a la pantalla de cualquier dispositivo móvil y de escritorio.

Modificamos el archivo index.html, creando un contenedor <div class="container"> en el <body> de la página. En él vamos a insertar la etiqueta <section> que contiene el listado completo de las películas:

<body>
  <div class="container">
    <section>
      <h1>Star Wars Movies</h1>
      <p>Explore all official Star Wars movies.</p>
      <article>...</article>
      <article>...</article>
      <article>...</article>
      <article>...</article>
      <article>...</article>
      <article>...</article>
      <article>...</article>
    </section>
  </div>
</body>

En seguida vamos a crear un contenedor <div class="row"> por cada pelicula en el listado. Dentro de ellos vamos a insertar cada una de las etiquetas <article> que contiene la información de cada película:

<section>
  <h1>Star Wars Movies</h1>
  <p>Explore all official Star Wars movies.</p>
  <div class="row">
    <article>
      <h2><a href="/episode-i/">Episode I: The Phantom Menace</a></h2>
      <img src="/media/images/starwars_episode_i.png" alt="Episode I: The Phantom Menace">
      ...
    </article>
  </div>
  <div class="row">
    <article>
      <h2><a href="/episode-ii/">Episode II: Attack of the Clones</a></h2>
      <img src="/media/images/starwars_episode_ii.png" alt="Episode II: Attack of the Clones">
      ...
    </article>
  </div>
</section>

Ahora vamos a organizar el contenido de cada película en dos secciones. En la primera sección vamos a colocar la imagen del póster; y en la siguiente vamos a colocar el titulo y el texto del Opening Crawl:

<div class="row">
  <article>
    <div class="col-md-3">
      <img src="/media/images/starwars_episode_i.png" alt="Episode I: The Phantom Menace">
    </div>
    <div class="col-md-9">
      <h2><a href="/episode-i/">Episode I: The Phantom Menace</a></h2>
      <p>Turmoil has engulfed the Galactic Republic. The taxation of trade routes to outlying star systems is in dispute.</p>
      <p>Hoping to resolve the matter with a blockade of deadly battleships, the greedy Trade Federation has stopped all shipping to the small planet of Naboo.</p>
      <p>While the Congress of the Republic endlessly debates this alarming chain of events, the Supreme Chancellor has secretly dispatched two Jedi Knights, the guardians of peace and justice in the galaxy, to settle the conflict...</p>
    </div>
  </article>
</div>

Finalmente, agregamos la clase img-responsive a la imagen, para que esta se adapte de forma automática al contenedor en el que se encuentra:

<img class="img-responsive" src="/media/images/starwars_episode_i.png" alt="Episode I: The Phantom Menace">

La razón por la que usamos <div class="container"> es porque no se puede construir la grilla afuera de este contenedor. Es decir que <div class="row"> y <div class="col-md-X"> no funcionarán correctamente si no están dentro del contenedor container.

El contenedor <div class="row"> sirve para definir las filas de la grilla y dentro de él se encuentran los contenedores <div class="col-md-X">, que se usan para definir las casillas de la grilla.

En conclusión, la forma correcta de definir una grilla es:

<div class="container">
  <div class="row">
    <div class="col-md-12">
    </div>
  </div>
  <div class="row">
    <div class="col-md-12">
    </div>
  </div>
</div>

En este caso tenemos una grilla compuesta por dos filas, cada una de ellas con una casilla que ocupa todo el ancho de la página, es decir doce columnas.

Ahora bien, hemos usado <div class="col-md-3"> para definir la casilla que contiene la imagen y <div class="col-md-9"> para definir la casilla que contiene el titulo y el texto.

Lo anterior significa que la casilla de la imagen va a ocupar las primeras tres columnas, de izquierda a derecha, y la casilla con el texto va a ocupar las restantes nueve columnas de cada fila.

Al implementar los cambios, la página de inicio debe verse de la siguiente manera:

Organizando la página de cada película

Para demostrar cómo organizar la información presente en la página de cada película, solo vamos a modificar la página del Episodio I. Dejamos como ejercicio para el lector la modificación de las demás páginas.

En este punto, la página del Episodio I se ve así:

Vamos a organizar la información de una manera similar que en la página de inicio. Vamos a mover la imagen del póster hacia la izquierda; y el titulo, el Opening Crawl y las tablas con la información básica de la película hacia la derecha.

Modificamos el archivo episode-i/index.html, creando un contenedor <div class="container"> alrededor de la etiqueta <article> que aloja todo el contenido de la página:

<body>
  <div class="container">
    <article>
      <h1>Episode I: The Phantom Menace</h1>
      <img src="/media/images/starwars_episode_i.png" alt="Episode I: The Phantom Menace">
      <h2>Opening crawl</h2>
      ...
    </article>
  </div>
</body>

Enseguida creamos el contenedor <div class="row"> dentro del contenedor container:

<body>
  <div class="container">
    <div class="row">
      <article>
        <h1>Episode I: The Phantom Menace</h1>
        <img src="/media/images/starwars_episode_i.png" alt="Episode I: The Phantom Menace">
        <h2>Opening crawl</h2>
        ...
      </article>
    </div>
  </div>
</body>

A continuación, creamos el contenedor <div class="col-md-3"> para crear la casilla para la imagen del póster; y el contenedor <div class="col-md-9"> para crear la casilla para el titulo, el Opening Crawl y el resto del contenido:

<div class="row">
  <article>
    <div class="col-md-3">
      <img src="/media/images/starwars_episode_i.png" alt="Episode I: The Phantom Menace">
    </div>
    <div class="col-md-9">
      <h1>Episode I: The Phantom Menace</h1>
      <h2>Opening crawl</h2>
      ...
    </div>
  </article>
</div>

Para finalizar, agregamos la clase img-responsive a la imagen, para que esta se adapte de forma automática al contenedor en el que se encuentra:

<img class="img-responsive" src="/media/images/starwars_episode_i.png" alt="Episode I: The Phantom Menace">

El resultado de aplicar los cambios ya mencionados se puede ver a continuación:

Aplicando estilos a las tablas

Bootstrap define varios estilos de tablas. Para aplicar el estilo básico, basta con agregar la clase table a cualquier tabla:

<table class="table">
    ...
</table>

Si deseamos que las filas impares de la tabla tengan un color diferente, podemos agregar la clase table-striped:

<table class="table table-striped">
    ...
</table>

Ahora, si queremos que las filas de la tabla cambien de color cuando el cursor está sobre ellas, agregamos la clase table-hover:

<table class="table table-hover">
    ...
</table>

Siguiendo con nuestro sitio de ejemplo, vamos a aplicar la clase table a la primera tabla, la clase table-striped a la segunda tabla y la clase table-hover a la tercera tabla. El resultado debe verse así:

Podemos ver que las tablas ocupan todo el ancho del contenedor en el que se encuentran, lo que hace que exista bastante espacio en blanco en el interior. Para solucionar este problema visual, vamos a reducir el ancho de las tablas a la mitad.

Para esto, vamos a crear un contenedor <div class="col-md-6>" dentro de un contenedor <div class="row"> alrededor de las tres tablas:

<div class="row">
  <div class="col-md-6">
    <table class="table">
      ...
    </table>
    <table class="table table-striped">
      ...
    </table>
    <table class="table table-hover">
      ...
    </table>
  </div>
</div>

Como podrán observar, estamos creando una grilla dentro de otra. El nuevo contenedor row nos permite dividir el ancho de la casilla en doce columnas mas pequeñas.

El contenedor col-md-6 hace que el ancho de las tablas solo ocupe las primeras seis columnas de izquierda a derecha, es decir, la mitad del ancho que tenían anteriormente.

Las tablas rediseñadas deben verse de la siguiente forma:

Aplicando estilos al formulario

En la página dispuesta para agregar películas existe un formulario HTML bastante simple y no muy agradable a la vista, el cual vamos a mejorar usando Bootstrap:

Editamos el archivo add-movie/index.html y creamos una grilla para alojar el formulario. El formulario va a ocupar la mitad del ancho total de la página:

<body>
  <div class="container">
    <div class="row">
      <div class="col-md-6">
        <section>
          <h1>Add Movie</h1>
          <h2>Attribution information</h2>
          <form>...</form>
        </section>
      </div>
    </div>
  </div>
</body>

Ahora creamos un contenedor <div class="form-group"> alrededor de cada campo del formulario de la siguiente forma:

<form>
  <div class="form-group">
    <label for="title">Title</label>
    <input id="title" type="text" name="title" value="">
  </div>
  <div class="form-group">
    <label for="opening-crawl">Opening Crawl</label>
    <textarea id="opening-crawl" name="opening-crawl" rows="8" cols="40"></textarea>
  </div>
  ...
</form>

Luego, agregamos la clase form-control a cada una de las etiquetas <input> y <textarea>:

<form>
  <div class="form-group">
    <label for="title">Title</label>
    <input class="form-control" id="title" type="text" name="title" value="">
  </div>
  <div class="form-group">
    <label for="opening-crawl">Opening Crawl</label>
    <textarea class="form-control" id="opening-crawl" name="opening-crawl" rows="8" cols="40"></textarea>
  </div>
    ...
</form>

Podemos ver que algunos campos tienen un texto explicativo. Estas líneas de texto deben estar dentro del contenedor form-group y se les debe agregar la clase help-block:

<div class="form-group">
  <label for="directors">Director(s)</label>
  <textarea class="form-control" id="directors" name="directors" rows="8" cols="40"></textarea>
  <p class="help-block">One director per line.</p>
</div>

Por último, aplicamos estilos al botón del formulario agregando las clases btn y btn-default:

<input class="btn btn-default" type="submit" name="submit" value="Add movie">

Al terminar de aplicar los cambios, el formulario debe verse así:

Diseñando para dispositivos móviles

Con Bootstrap es posible adaptar la grilla a las pantallas de los diferentes dispositivos móviles. Hasta el momento solo hemos usado las clases col-md-X para implementar el layout en todo el sitio.

En este caso, el layout solo funciona cuando la pantalla o la ventana del navegador tiene un ancho mayor o igual a 992 píxeles. Cuando el ancho es menor, las casillas de la grilla simplemente se apilan una encima de otra.

Si queremos que la distribución se mantenga para pantallas de menor tamaño, debemos hacer uso de las clases col-sm-X, que se activan cuando el ancho de la pantalla es mayor o igual a 768 píxeles; o de las clases col-xs-X para cuando el ancho de la pantalla es menor que 768 píxeles.

Dejamos al lector cómo ejercicio utilizar las clases col-sm-X en lugar de col-md-X en cada uno de los contenedores que definen las casillas de la grilla. Al terminar de hacer los cambios, la página debe verse así en el iPad:

Es importante aclarar que al usar las clases col-sm-X, la distribución se seguirá manteniendo para pantallas de mayor tamaño.

Para concluir…

Bootstrap es el framework CSS y JavaScript mas popular para diseñar sitios y aplicaciones web adaptables a dispositivos móviles. En este artículo solo cubrimos una pequeña parte de todas las características disponibles.

La utilización de componentes como Navbar, Jumbotron, Page Header, Button Dropdowns, Thumbnails y Responsive Embed quedan en el tintero para un próximo artículo. Mientras tanto, el lector puede revisar la documentación oficial de Bootstrap para mayor información.

El sitio web modificado puede ser descargado desde éste repositorio Git alojado en Github.