Año lanzamiento Bootstrap CSS: 2011
Año lanzamiento Tailwind CSS: 2017
Versión Bootstrap: 5.3.6
Repo: https://github.com/twbs/bootstrap
https://getbootstrap.com/docs/5.3/getting-started/introduction/
Se importa mediante 2 links: CSS y JavaScript.
El JavaScript es para los componentes interactivos: dropdown, modal, accordion, popovers...
- https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css
- https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js
Bootstrap CSS aplica ciertos estilos ya por defecto sin que los especifiquemos nosotros:
https://getbootstrap.com/docs/5.3/content/reboot/
-
h1, h2, h3, h4, h5, h6
-
display-1, display-2, display-3, display-4, display-5, display-6
-
lead
-
text-center, text-end, text-start
-
text-sm-end, text-md-end, text-lg-end, text-xl-end, text-xxl-end
-
fs-1, fs-2, fs-3, fs-4, fs-5, fs-6
-
text-lowercase, text-uppercase, text-capitalize
-
fst-normal, fst-italic
-
fw-lighter, fw-light, fw-normal, fw-medium, fw-semibold, fw-bolder, fw-bold
-
lh-1, lh-sm, lh-base, lh-lg
-
font-monospace
-
text-decoration-none, text-decoration-underline, text-decoration-line-through
-
text-primary, text-secondary, text-success, text-danger, text-warning, text-info, text-light, text-dark
-
text-wrap, text-nowrap
-
overflow-auto, overflow-hidden, overflow-visible, overflow-scroll
-
overflow-x-auto, overflow-x-hidden, overflow-x-visible, overflow-x-scroll
-
overflow-y-auto, overflow-y-hidden, overflow-y-visible, overflow-y-scroll
-
text-truncate
Desde 5.3:
https://getbootstrap.com/docs/5.3/utilities/link/
-
link-primary, link-secondary, link-success, link-danger, link-warning, link-info, link-light, link-dark
-
stretched-link (hace clicable todo el contenedor que envuelve un link)
-
Nomenclatura: primary, secondary, success, danger, warning, info, light, dark
-
text-primary, text-secondary, text-success, text-danger, text-warning, text-info, text-light, text-dark
-
bg-primary, bg-secondary, bg-success, bg-danger, bg-warning, bg-info, bg-light, bg-dark
-
border-primary, border-secondary, border-success, border-danger, border-warning, border-info, border-light, border-dark
-
btn-primary, btn-secondary, btn-success, btn-danger, btn-warning, btn-info, btn-light, btn-dark
-
text-opacity-75, text-opacity-50, text-opacity-25
-
text-body
-
text-black, text-white, text-black-50, text-white-50
Lo nuevo en boostrap 5.3:
- text-{color}-emphasis para dar mejor contraste en modo claro y oscuro
- bg-{color}-subtle y border-{color}-subtle para hacer más sutil el uso de fondos y bordes
- text-body-secondary, text-body-tertiary
- Se ha quitado text-muted
El sufijo subtle es nuevo en 5.3 de bootstrap, sirve para quitarle importancia a fondos y bordes para que no resalten tanto, por eso lo de subtle (sutil).
-
bg-primary, bg-primary-subtle
-
bg-secondary, bg-secondary-subtle
-
bg-success, bg-success-subtle
-
bg-danger, bg-danger-subtle
-
bg-warning, bg-warning-subtle
-
bg-info, bg-info-subtle
-
bg-light, bg-light-subtle
-
bg-dark, bg-dark-subtle
-
bg-body-secondary, bg-body-tertiary
-
bg-black, bg-white
-
bg-transparent
-
bg-primary bg-gradient
-
bg-secondary bg-gradient
-
bg-success bg-gradient
-
bg-danger bg-gradient
-
bg-warning bg-gradient
-
bg-info bg-gradient
-
bg-light bg-gradient
-
bg-dark bg-gradient
-
bg-black bg-gradient
-
bg-success bg-opacity-75
-
bg-success bg-opacity-50
-
bg-success bg-opacity-25
-
border
-
border-top
-
border-end
-
border-bottom
-
border-start
-
border border-1
-
border border-2
-
border border-3
-
border border-4
-
border border-5
-
border border-primary
-
border border-primary-subtle
-
border border-secondary
-
border border-secondary-subtle
-
border border-success
-
border border-success-subtle
-
border border-secondary-subtle
-
border border-danger
-
border border-danger-subtle
-
border border-warning
-
border border-warning-subtle
-
border border-info
-
border border-info-subtle
-
border border-light
-
border border-light-subtle
-
border border-dark
-
border border-dark-subtle
-
border border-black
-
border border-white
-
border border-0
-
border border-top-0
-
border border-end-0
-
border border-bottom-0
-
border border-start-0
-
border-opacity-75
-
border-opacity-50
-
border-opacity-25
-
border-opacity-10
-
rounded
-
rounded-top
-
rounded-end
-
rounded-bottom
-
rounded-bottom-1
-
rounded-start
-
rounded-start-2
-
rounded-0
-
rounded-1
-
rounded-2
-
rounded-3
-
rounded-4
-
rounded-5
-
rounded-circle
-
rounded-end-circle
-
rounded-pill
-
rounded-start-pill
- shadow-none
- shadow-sm
- shadow
- shadow-lg
-
w-25
-
w-50
-
w-75
-
w-100
-
w-auto
-
mw-100
-
min-vw-100
-
vw-100
-
h-25
-
h-50
-
h-75
-
h-100
-
h-auto
-
mh-100
-
min-vh-100
-
vh-100
- {property}{sides}-{size}
donde:
-
property: m, p
-
sides: t, b, s, e, x, y
-
size: 0, 1, 2, 3, 4, 5, auto
-
mt-2
-
mb-2
- visible
- invisible
- visually-hidden (oculta elementos pero los deja accesibles para tecnologías asistivas como screen readers)
Aplican en diferentes clases de utilidad
- xs: 0,
- sm: 576px,
- md: 768px,
- lg: 992px,
- xl: 1200px,
- xxl: 1400px
Diferencia con Tailwind CSS:
- sm
- md
- lg
- xl
- 2xl
Permite anilear elementos en un mismo eje sin entrar a trabajar con filas y columnas bidimensionales, es decir trabajamos en una dimensión.
d viene de display
- d-flex
- d-inline-flex
Diferencia con Tailwind:
-
Tailwind CSS: flex
-
Bootstrap CSS: d-flex
-
d-{breakpoint}-flex
-
d-{breakpoint}-inline-flex
-
d-flex flex-row
-
d-flex flex-row-reverse
-
d-flex flex-column
-
d-flex flex-column-reverse
Diferencia con Tailwind CSS:
-
Tailwind CSS: flex-row, flex-col
-
Bootstrap CSS: flex-row, flex-column
-
d-flex justify-content-start
-
d-flex justify-content-end
-
d-flex justify-content-center
-
d-flex justify-content-between
-
d-flex justify-content-around
-
d-flex justify-content-evenly
-
d-flex align-items-start
-
d-flex align-items-end
-
d-flex align-items-center
-
d-flex align-items-baseline
-
d-flex align-items-stretch
-
align-self-start
-
align-self-end
-
align-self-center
-
align-self-baseline
-
align-self-stretch
-
flex-fill
-
flex-grow-1
-
flex-shrink-1
-
Stacks: son shorthand helpers que usan flexbox por debajo y ayudan a estructurar layouts rápidamente.
- vstack
- hstack
<div class="vstack gap-2 col-md-5 mx-auto">
<button type="button" class="btn btn-secondary">Save changes</button>
<button type="button" class="btn btn-outline-secondary">Cancel</button>
</div>
- container (es el que se usa normalmente)
- container-sm
- container-md
- container-lg
- container-xl
- container-xxl
- container-fluid
Dentro de un container:
- row
- col
<div class="container">
<div class="row">
<div class="col">
Contenido en columna 1
</div>
<div class="col">
Contenido en columna 2
</div>
</div>
</div>
Por defecto bootstrap considera el grid con 12 columnas virtuales.
Si no indicamos un ancho, se toma automáticamente de forma equitativa, por ejemplo estas dos columnas ocupan 6 cada una:
<div class="container">
<div class="row">
<div class="col"></div>
<div class="col"></div>
</div>
</div>
Ocuparían ancho 4 cada una:
<div class="container">
<div class="row">
<div class="col"></div>
<div class="col"></div>
<div class="col"></div>
</div>
</div>
Teniendo en cuenta los breakpoints para responsive:
- Bootstrap: col-{breakpoint}-{1/12}
- Tailwind: grid grid-cols-1 md:grid-cols-3
Ejemplo tailwind:
<div class="grid grid-cols-4 gap-4">
<div>01</div>
<!-- ... -->
<div>09</div>
</div>
Opción similar a tailwind pero con el grid nativo de bootstrap:
<div class="container text-center">
<div class="row row-cols-1 row-cols-md-3">
<div class="col">Column</div>
<div class="col">Column</div>
<div class="col">Column</div>
<div class="col">Column</div>
</div>
</div>
Idóneo para cuando estamos agregando divs desde un bucle for y no queremos preocuparnos de cuando abrir y cerrar rows y de diferenciar cada item columna con una clase columna diferente.
Esto se usa habitualmente para crear:
- dashboard de administración
- página de inicio que muestra diferentes progresos
- grid de productos, ecommerce
- grid de features, beneficios, ventajas
- sección de equipo
- footer
- menú de una navbar (Flyout Menus en tailwind)
Este grid es nativo de bootstrap y se creó antes de que se integrara CSS Grid.
Desde v5.1 de Bootstrap, desactivado por defecto.
https://getbootstrap.com/docs/5.3/layout/css-grid/
<div class="grid text-center">
<div class="g-col-6">.g-col-6</div>
<div class="g-col-6">.g-col-6</div>
</div>
Más similar a tailwind, pero con la filosofía de bootstrap.
-
Button: botones para desencadenar acciones o enviar formulario o navegar entre páginas.
-
Button Group: agrupar acciones relacionadas en una sola línea, útil para agrupar acciones masivas.
-
Badge: mostrar contadores, estados.
-
Tables: mostrar datos tabulares especialmente para la parte de administración, se suelen combinar con botones,
-
Cards: contenedores flexibles para items, card de producto,
-
Images: img-fluid
-
Listas: List Groups, list-unstyled, list-inline, contenido relacionado o items de una lista de datos que viene de backend
- Navs & tabs: menús de navegación horizontal o vertical, pestañas que se seleccionan y cambian un contenido
- Navbar: barra de navegación responsive y con menú hamburguesa, distintos colores
- Dropdowns: menús desplegables para agrupar opciones
- Breadcrumb: facilitar la navegación entre mucho contenido agrupado por categorías
- Pagination: botones para pasar de una página a otra, el contenido vendría paginado desde backend (LIMIT, OFFSET, TOP)
- Scrollspy: actualiza menús en base a la posición del scroll
CONSEJO:
Si queremos posicionar urls se recomienda que tengan slugs claros:
Básico:
- localhost:8080/tutoriales/4
- localhost:8080/tutoriales/33efee79-6a0f-4e5d-be35-c1be3a656477
SEO friendly:
- empresa.com/tutorial-java-oop-polimorfismo-y-herencia
- empresa.com/java/tutorial/oop-polimorfismo-y-herencia
-
Alerts: mostrar mensajes informativos usando código de color verde éxito, amarillo warning, rojo peligro.
-
Toasts: mensajes emergentes temporales no interrumpen la experiencia.
-
Close button: botón de cierre con una cruz
-
Spinners: indica progreso de carga o acción, con una animación
-
Progress: barra de progreso con porcentaje, stripped, animada
-
Placeholders: también conocidos como skeleton, representación visual del contenido mientras se termina de cargar.
-
Tooltips: información adicional cuando se hace hover sobre un elemento.
-
Popovers: es como el tooltip pero más grande y con más contenido, para información contextual más amplia.
-
Modal: Crear ventanas que permitan al usuario ver contenido e interactual, por ejemplo login, ofertas, cuando quieres borrar un item o hacer una acción que modifica algo mostramos un modal de confirmación.
-
Collapse: mostrar y ocultar contenido de forma expandible, FAQs preguntas y respuestas.
-
Accordion: paneles colapsables agrupados donde puede estar abierto uno o varios a la vez.
-
Offcanvas: panel lateral oculto se revela al ejecutar una acción o clic para mostrar información adicional.
-
Carousel: contenido deslizable como imágenes. CUIDADO: si las imágenes tienen distinta resolución de alto, producirá layout shift moviendo contenido, lo cuál puede quedar mal.
Desde la versión v5.3.
En Bootstrap 5.3, el dark mode se implementa utilizando el atributo data-bs-theme
que puede aplicarse al elemento <html>
para un cambio global, o a componentes específicos para cambios localizados. Por ejemplo:
<html lang="en" data-bs-theme="dark">
Bootstrap automáticamente aplica los estilos oscuros a todos los componentes dentro de ese contenedor sin necesidad de añadir clases adicionales ni prefijos dark:
como en tailwind.
También es posible crear temas personalizados por ejemplo para B2B:
https://getbootstrap.com/docs/5.3/customize/color-modes/#adding-theme-colors
.form-label
- Etiquetas de formulario con márgenes apropiados.form-text
- Texto de ayuda pequeño y atenuado.visually-hidden
- Oculta visualmente manteniendo accesibilidaddisabled
- Deshabilita elementos |fieldset[disabled]
- Deshabilita grupo completo
.form-control
- Input base (text, email, password, textarea, file).form-control-plaintext
- Input readonly con apariencia de texto.form-control-lg
- Input grande |.form-control-sm
- Input pequeño.form-control-color
- Input de color con estilos especiales
.form-select
- Select personalizado.form-select-lg
- Select grande |.form-select-sm
- Select pequeñomultiple
- Selección múltiple |size="n"
- Opciones visibles
.form-check
- Contenedor |.form-check-input
- Input |.form-check-label
- Etiqueta.form-check-inline
- En línea horizontal.form-switch
- Checkbox como toggle switch.btn-check
- Checkbox/radio con apariencia de botón
.form-range
- Range personalizadomin/max/step
- Atributos de configuración
.input-group
- Contenedor |.input-group-text
- Texto/icono anexo.input-group-sm
- Pequeño |.input-group-lg
- Grande.form-check-input.mt-0
- Checkbox/radio en grupo
.form-floating
- Contenedor para etiquetas flotantes- Requiere
placeholder
en input e input antes que label
.mb-3
- Espaciado entre campos.row
+.col-*
- Layout con grid.col-form-label
- Etiqueta alineada en layout horizontal.g-*
- Espaciado grid |.align-items-center
- Alineación vertical
.needs-validation
- Validación JS |.was-validated
- Validación automática.is-valid
- Campo válido |.is-invalid
- Campo inválido.valid-feedback
- Mensaje éxito |.invalid-feedback
- Mensaje error.valid-tooltip
- Tooltip éxito |.invalid-tooltip
- Tooltip errornovalidate
- Desactiva validación nativa |required
- Campo obligatorio
Como extra, que no ofrece bootstrap está el concepto editor enriquecido o editor WYSIWYG:
- CKEditor: https://ckeditor.com/ckeditor-5/demo/
- TinyMCE: https://www.tiny.cloud/docs/tinymce/latest/cloud-quick-start/
Casos de uso:
- login y registro
- buscador
- campo correo newsletter
- Administración: Crear y editar entidades-modelos
- Formulario de review u opinión en un producto o servicio
- Formulario publicar un post en una red social
Seguridad: son críticos ya que envían datos a backend y se almacenan en base de datos. Posible entrada para SQLInjection, fuente de errores si no tienes bien las validaciones a nivel de frontend como de backend. A la hora de insertar en base de datos normalmente los ORM o la capa de persistencia debería sanitizar esa entrada usar sentencias parametrizadas para evitar que se rompa el SQL al ejecutarlo en base de datos.
- Formularios avanzados: se suele combinar varios tipos de input (checkbox, buscador, selector) para hacer componentes avanzados que permitan buscar y seleccionar:
https://primeng.org/multiselect
Bootstrap nos proporciona clases básicas para los inputs, textarea, select, checkbox, radio.
CUIDADO: hay que tener en cuenta las asociaciones entre entidades: many-to-one select simple, many-to-many select multiple, one-to-one select simple.
Comentarios en Producto (many-to-one). Producto y Categoría(many-to-one).
Similar Font Awesome.
https://icons.getbootstrap.com/
Alternativa:
Requisitos: tener node instalado.
cd customization
npm install bootstrap
npm install -g sass
sass --version
sass custom.scss custom.css
sass --watch scss/custom.scss:css/custom.css
Ver más: https://getbootstrap.com/docs/5.3/customize/sass/#including
Ver ejemplo
Ver ejemplo
Que es la Gestalt | Principios de percepción visual
https://www.youtube.com/watch?v=oW6dwEZIf3g
- Angular: se suele usar NgBootstrap en forma de componentes de Angular.
- NgBootstrap: usa Bootstrap CSS https://ng-bootstrap.github.io/
- PrimeNG: que está basado en Tailwind CSS
- Angular Material: que está basado en Material Design