Variables CSS y personalización básica
Bootstrap 5 revolucionó la personalización al introducir variables CSS nativas (también conocidas como custom properties) que permiten modificar la apariencia del framework sin necesidad de recompilar código fuente. Esta aproximación moderna facilita enormemente la adaptación del diseño a las necesidades específicas de cada proyecto.
Fundamentos de las variables CSS en Bootstrap
Bootstrap define cientos de variables CSS en el elemento :root
que controlan todos los aspectos visuales del framework. Estas variables siguen una nomenclatura consistente que las hace fáciles de identificar y modificar:
:root {
--bs-primary: #0d6efd;
--bs-secondary: #6c757d;
--bs-success: #198754;
--bs-info: #0dcaf0;
--bs-warning: #ffc107;
--bs-danger: #dc3545;
--bs-light: #f8f9fa;
--bs-dark: #212529;
}
La principal ventaja de este sistema es que cualquier cambio en estas variables se propaga automáticamente a todos los componentes que las utilizan. Por ejemplo, modificar --bs-primary
actualiza instantáneamente botones, enlaces, badges, barras de progreso y cualquier otro elemento que use el color primario.
Personalización de la paleta de colores
El caso de uso más común es adaptar los colores corporativos de una empresa. Supongamos que necesitas implementar una identidad visual con azul corporativo #1e40af
y verde secundario #059669
:
:root {
--bs-primary: #1e40af;
--bs-secondary: #059669;
}
Esta simple modificación transforma automáticamente todos los elementos que usan estos colores:
<button class="btn btn-primary">Botón corporativo</button>
<div class="alert alert-primary">Mensaje con colores corporativos</div>
<div class="bg-secondary text-white p-3">Fondo con color secundario personalizado</div>
Para proyectos que requieren mayor control, puedes personalizar también las variaciones de color que Bootstrap genera automáticamente:
:root {
--bs-primary: #1e40af;
--bs-primary-rgb: 30, 64, 175;
--bs-primary-bg-subtle: #dbeafe;
--bs-primary-border-subtle: #93c5fd;
--bs-primary-text-emphasis: #1e3a8a;
}
Personalización de tipografía
Las variables de tipografía permiten adaptar completamente el sistema de texto sin tocar CSS complejo:
:root {
--bs-font-sans-serif: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
--bs-font-monospace: "Fira Code", "SF Mono", Monaco, "Cascadia Code", monospace;
--bs-font-size-base: 1rem;
--bs-font-weight-normal: 400;
--bs-font-weight-bold: 600;
--bs-line-height-base: 1.6;
}
Estos cambios afectan inmediatamente a todos los textos, títulos, formularios y componentes que usan el sistema tipográfico de Bootstrap:
<h1 class="display-1">Título con tipografía personalizada</h1>
<p class="lead">Párrafo con line-height y peso modificados</p>
<code>Código con fuente monospace personalizada</code>
Modificación del sistema de espaciado
El sistema de espaciado de Bootstrap también es completamente personalizable mediante variables CSS:
:root {
--bs-spacer: 1rem;
/* Esto modifica automáticamente todos los valores de margin/padding */
/* .m-1, .p-2, .mt-3, etc. se recalculan en base a este valor */
}
Para necesidades más específicas, puedes ajustar espaciados individuales:
:root {
--bs-gutter-x: 2rem; /* Espaciado entre columnas del grid */
--bs-gutter-y: 1.5rem; /* Espaciado vertical entre filas */
--bs-border-radius: 0.5rem; /* Radio de bordes global */
--bs-border-radius-lg: 1rem; /* Radio para elementos grandes */
}
Personalización de componentes específicos
Muchos componentes exponen variables específicas que permiten personalización granular sin afectar otros elementos:
:root {
/* Navbar personalizada */
--bs-navbar-padding-y: 1rem;
--bs-navbar-brand-font-size: 1.5rem;
--bs-navbar-nav-link-padding-x: 1rem;
/* Cards personalizadas */
--bs-card-border-radius: 1rem;
--bs-card-box-shadow: 0 10px 25px rgba(0,0,0,0.1);
--bs-card-cap-bg: #f8f9fa;
/* Botones personalizados */
--bs-btn-padding-y: 0.75rem;
--bs-btn-padding-x: 2rem;
--bs-btn-border-radius: 2rem;
}
Aplicación práctica: tema corporativo completo
Un ejemplo real de personalización que combina varios aspectos podría ser:
:root {
/* Colores corporativos */
--bs-primary: #2563eb;
--bs-secondary: #64748b;
--bs-success: #10b981;
--bs-warning: #f59e0b;
--bs-danger: #ef4444;
/* Tipografía corporativa */
--bs-font-sans-serif: "Poppins", system-ui, sans-serif;
--bs-font-size-base: 0.95rem;
--bs-font-weight-normal: 400;
--bs-font-weight-semibold: 600;
--bs-line-height-base: 1.7;
/* Espaciado y formas */
--bs-border-radius: 0.75rem;
--bs-border-radius-lg: 1rem;
--bs-box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);
/* Componentes específicos */
--bs-navbar-padding-y: 1.25rem;
--bs-btn-font-weight: 600;
--bs-card-border-width: 0;
--bs-card-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
}
Con esta configuración, todos los componentes de Bootstrap adoptan automáticamente el nuevo estilo corporativo, manteniendo la coherencia visual en toda la aplicación mientras aprovechas la robustez y accesibilidad del framework.
Utilidades personalizadas y clases custom
Más allá de modificar variables existentes, Bootstrap permite crear utilidades completamente nuevas que sigan las mismas convenciones y patrones del framework. Esta aproximación te permite extender las capacidades nativas manteniendo la consistencia y escalabilidad del sistema.
Extensión del sistema de utilidades existente
Bootstrap utiliza un patrón sistemático para generar sus utilidades que puedes replicar fácilmente. Por ejemplo, para crear nuevas utilidades de color que complementen la paleta existente:
/* Nuevos colores corporativos como utilidades */
.text-corporate { color: #1a365d !important; }
.bg-corporate { background-color: #1a365d !important; }
.border-corporate { border-color: #1a365d !important; }
.text-accent { color: #ed8936 !important; }
.bg-accent { background-color: #ed8936 !important; }
.border-accent { border-color: #ed8936 !important; }
/* Versiones sutiles para mayor versatilidad */
.text-corporate-subtle { color: #4a90a4 !important; }
.bg-corporate-subtle { background-color: #e6f3ff !important; }
.border-corporate-subtle { border-color: #b8daf0 !important; }
Estas utilidades se integran perfectamente con el resto del framework:
<div class="card border-corporate">
<div class="card-header bg-corporate-subtle">
<h5 class="text-corporate mb-0">Panel Corporativo</h5>
</div>
<div class="card-body">
<p class="text-accent">Contenido con colores personalizados</p>
</div>
</div>
Utilidades de espaciado específicas del proyecto
Aunque Bootstrap incluye un sistema completo de espaciado, algunos proyectos requieren valores específicos que no encajan en la progresión estándar:
/* Espaciados específicos para el proyecto */
.mt-section { margin-top: 4.5rem !important; }
.mb-section { margin-bottom: 4.5rem !important; }
.py-section { padding-top: 4.5rem !important; padding-bottom: 4.5rem !important; }
.px-content { padding-left: 1.75rem !important; padding-right: 1.75rem !important; }
.mx-content { margin-left: 1.75rem !important; margin-right: 1.75rem !important; }
/* Espaciados responsivos personalizados */
.gap-custom { gap: 2.5rem !important; }
@media (min-width: 768px) {
.gap-custom { gap: 3.5rem !important; }
}
@media (min-width: 1200px) {
.gap-custom { gap: 5rem !important; }
}
Utilidades de tipografía avanzadas
Bootstrap cubre las necesidades tipográficas básicas, pero puedes crear utilidades específicas para casos especiales:
/* Utilidades tipográficas específicas */
.text-uppercase-spaced {
text-transform: uppercase !important;
letter-spacing: 0.1em !important;
font-weight: 600 !important;
}
.text-gradient {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%) !important;
-webkit-background-clip: text !important;
-webkit-text-fill-color: transparent !important;
background-clip: text !important;
}
.text-shadow-sm {
text-shadow: 0 1px 2px rgba(0, 0, 0, 0.1) !important;
}
.text-balance {
text-wrap: balance !important;
}
/* Tamaños intermedios específicos */
.fs-7 { font-size: 0.825rem !important; }
.fs-8 { font-size: 0.775rem !important; }
Estas utilidades permiten refinamientos tipográficos precisos:
<h2 class="text-uppercase-spaced text-corporate mb-4">Servicios Destacados</h2>
<p class="fs-7 text-muted text-balance">Descripción optimizada para legibilidad</p>
<span class="badge bg-primary text-gradient">Premium</span>
Componentes híbridos y extensiones
Puedes crear clases personalizadas que combinen múltiples utilidades de Bootstrap con estilos únicos:
/* Card mejorada con efectos personalizados */
.card-enhanced {
transition: all 0.3s ease !important;
border: none !important;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.08) !important;
}
.card-enhanced:hover {
transform: translateY(-4px) !important;
box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15) !important;
}
/* Botón con efecto glassmorphism */
.btn-glass {
background: rgba(255, 255, 255, 0.1) !important;
backdrop-filter: blur(10px) !important;
border: 1px solid rgba(255, 255, 255, 0.2) !important;
color: white !important;
transition: all 0.3s ease !important;
}
.btn-glass:hover {
background: rgba(255, 255, 255, 0.2) !important;
transform: translateY(-1px) !important;
color: white !important;
}
/* Navbar con scroll effect */
.navbar-scroll {
transition: all 0.3s ease !important;
backdrop-filter: blur(10px) !important;
}
.navbar-scroll.scrolled {
background-color: rgba(255, 255, 255, 0.95) !important;
box-shadow: 0 2px 20px rgba(0, 0, 0, 0.1) !important;
}
Utilidades de layout específicas
Para necesidades de diseño particulares que no cubren flexbox o grid básicos:
/* Utilidades de aspect ratio personalizadas */
.aspect-4x3 {
aspect-ratio: 4/3 !important;
}
.aspect-21x9 {
aspect-ratio: 21/9 !important;
}
/* Utilidades de posicionamiento específicas */
.position-sticky-top {
position: sticky !important;
top: 2rem !important;
z-index: 1020 !important;
}
/* Utilidades de overflow con fade */
.overflow-fade {
position: relative !important;
overflow: hidden !important;
}
.overflow-fade::after {
content: '';
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 2rem;
background: linear-gradient(transparent, rgba(248, 249, 250, 1));
pointer-events: none;
}
/* Grid personalizado para casos específicos */
.grid-auto-fit {
display: grid !important;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)) !important;
gap: 1.5rem !important;
}
Integración práctica con componentes existentes
El verdadero valor de las utilidades personalizadas se aprecia cuando se combinan naturalmente con los componentes de Bootstrap:
<!-- Card con utilidades personalizadas -->
<div class="card card-enhanced">
<div class="aspect-16x9 overflow-hidden">
<img src="imagen.jpg" class="card-img-top h-100 object-fit-cover">
</div>
<div class="card-body">
<h5 class="text-uppercase-spaced text-corporate">Producto Premium</h5>
<p class="text-balance text-muted">Descripción del producto optimizada</p>
<button class="btn btn-glass px-content">Más información</button>
</div>
</div>
<!-- Navbar con efectos personalizados -->
<nav class="navbar navbar-expand-lg navbar-scroll fixed-top">
<div class="container">
<a class="navbar-brand text-gradient fw-bold" href="#">MiMarca</a>
<div class="navbar-nav ms-auto gap-custom">
<a class="nav-link text-uppercase-spaced" href="#">Servicios</a>
<a class="nav-link text-uppercase-spaced" href="#">Contacto</a>
</div>
</div>
</nav>
<!-- Layout con grid personalizado -->
<section class="py-section">
<div class="container">
<h2 class="text-center mb-section text-shadow-sm">Nuestros Servicios</h2>
<div class="grid-auto-fit">
<div class="card card-enhanced">
<!-- Contenido -->
</div>
<div class="card card-enhanced">
<!-- Contenido -->
</div>
<div class="card card-enhanced">
<!-- Contenido -->
</div>
</div>
</div>
</section>
Organización y mantenimiento
Para proyectos escalables, es fundamental organizar las utilidades personalizadas de forma lógica:
/* ===== UTILIDADES PERSONALIZADAS ===== */
/* Colores corporativos */
.text-corporate { /* ... */ }
.bg-corporate { /* ... */ }
/* Espaciados específicos */
.py-section { /* ... */ }
.gap-custom { /* ... */ }
/* Efectos visuales */
.card-enhanced { /* ... */ }
.btn-glass { /* ... */ }
/* Utilidades de layout */
.grid-auto-fit { /* ... */ }
.aspect-4x3 { /* ... */ }
/* ===== COMPONENTES HÍBRIDOS ===== */
/* Navbar personalizada */
.navbar-scroll { /* ... */ }
/* Cards mejoradas */
.card-premium { /* ... */ }
Esta aproximación te permite crear un sistema de diseño coherente que extiende Bootstrap sin romper sus convenciones, facilitando el mantenimiento y la colaboración en equipo mientras mantienes la flexibilidad para abordar necesidades específicas del proyecto.
Configuración de Sass y compilación básica
Aunque las variables CSS cubren la mayoría de necesidades de personalización, Sass ofrece un control más profundo sobre Bootstrap, permitiendo modificar aspectos fundamentales del framework que no están expuestos como custom properties. Esta aproximación es especialmente útil cuando necesitas personalizar la generación de utilidades, modificar mapas de colores, o ajustar el comportamiento de los mixins.
Estructura básica de archivos Sass
Para trabajar con la versión fuente de Bootstrap, necesitas una estructura de archivos organizada que separe tu personalización del código original:
proyecto/
├── scss/
│ ├── custom.scss # Tu archivo principal personalizado
│ ├── _variables.scss # Variables personalizadas
│ └── _components.scss # Componentes personalizados
├── node_modules/
│ └── bootstrap/ # Bootstrap instalado via npm
└── package.json
El archivo principal custom.scss
actúa como punto de entrada donde importas Bootstrap después de definir tus variables personalizadas:
// custom.scss - Archivo principal de personalización
// 1. Incluir funciones de Bootstrap (necesarias para los cálculos)
@import "node_modules/bootstrap/scss/functions";
// 2. Definir variables personalizadas ANTES de importar Bootstrap
@import "variables";
// 3. Importar variables por defecto de Bootstrap
@import "node_modules/bootstrap/scss/variables";
// 4. Importar el resto de Bootstrap
@import "node_modules/bootstrap/scss/bootstrap";
// 5. Incluir personalizaciones adicionales
@import "components";
Variables Sass fundamentales
El archivo _variables.scss
contiene las personalizaciones principales usando la sintaxis de variables Sass tradicional:
// _variables.scss - Variables personalizadas
// === COLORES PRIMARIOS ===
$primary: #1e40af;
$secondary: #059669;
$success: #10b981;
$info: #06b6d4;
$warning: #f59e0b;
$danger: #ef4444;
$light: #f8fafc;
$dark: #0f172a;
// === TIPOGRAFÍA ===
$font-family-sans-serif: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
$font-family-monospace: "Fira Code", "SF Mono", Monaco, "Cascadia Code", monospace;
$font-size-base: 0.95rem;
$font-weight-normal: 400;
$font-weight-bold: 600;
$line-height-base: 1.6;
// === ESPACIADO ===
$spacer: 1rem;
$spacers: (
0: 0,
1: $spacer * 0.25,
2: $spacer * 0.5,
3: $spacer,
4: $spacer * 1.5,
5: $spacer * 3,
6: $spacer * 4, // Espaciado adicional personalizado
7: $spacer * 6 // Espaciado adicional personalizado
);
// === BORDES Y SOMBRAS ===
$border-radius: 0.75rem;
$border-radius-sm: 0.5rem;
$border-radius-lg: 1rem;
$box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);
$box-shadow-lg: 0 10px 25px rgba(0, 0, 0, 0.1);
Personalización de mapas de color
Una de las ventajas exclusivas de Sass es la capacidad de modificar los mapas que Bootstrap usa para generar utilidades automáticamente:
// _variables.scss - Extensión de mapas de colores
// Agregar colores personalizados al mapa principal
$custom-colors: (
"corporate": #1a365d,
"accent": #ed8936,
"neutral": #718096
);
// Fusionar con los colores existentes de Bootstrap
$theme-colors: map-merge($theme-colors, $custom-colors);
// Personalizar grises
$grays: (
"100": #f7fafc,
"200": #edf2f7,
"300": #e2e8f0,
"400": #cbd5e0,
"500": #a0aec0,
"600": #718096,
"700": #4a5568,
"800": #2d3748,
"900": #1a202c
);
Con esta configuración, Bootstrap genera automáticamente todas las utilidades correspondientes:
<!-- Estas clases se generan automáticamente -->
<button class="btn btn-corporate">Botón corporativo</button>
<div class="bg-accent text-white">Fondo con color personalizado</div>
<p class="text-neutral">Texto con color neutro</p>
Configuración de breakpoints personalizados
Los breakpoints responsive también pueden personalizarse completamente:
// _variables.scss - Breakpoints personalizados
$grid-breakpoints: (
xs: 0,
sm: 576px,
md: 768px,
lg: 992px,
xl: 1200px,
xxl: 1400px,
xxxl: 1800px // Breakpoint adicional para pantallas muy grandes
);
// Contenedores correspondientes
$container-max-widths: (
sm: 540px,
md: 720px,
lg: 960px,
xl: 1140px,
xxl: 1320px,
xxxl: 1680px
);
Proceso de compilación básico
Para compilar tu Sass personalizado, necesitas instalar las dependencias necesarias:
{
"name": "mi-proyecto-bootstrap",
"version": "1.0.0",
"devDependencies": {
"bootstrap": "^5.3.8",
"sass": "^1.69.0"
},
"scripts": {
"build-css": "sass scss/custom.scss:css/custom.css --style=compressed",
"watch-css": "sass scss/custom.scss:css/custom.css --watch --style=expanded"
}
}
El comando de compilación básico transforma tu Sass en CSS listo para producción:
# Instalación inicial
npm install
# Compilación única
npm run build-css
# Modo watch para desarrollo
npm run watch-css
Personalización avanzada de componentes
Sass permite modificar componentes específicos antes de su generación:
// _variables.scss - Personalización de componentes
// === NAVBAR ===
$navbar-padding-y: 1.25rem;
$navbar-padding-x: 2rem;
$navbar-nav-link-padding-x: 1.5rem;
$navbar-brand-font-size: 1.75rem;
$navbar-brand-font-weight: 700;
// === CARDS ===
$card-border-width: 0;
$card-border-radius: $border-radius-lg;
$card-box-shadow: $box-shadow-lg;
$card-cap-bg: rgba($primary, 0.05);
// === BOTONES ===
$btn-padding-y: 0.75rem;
$btn-padding-x: 2rem;
$btn-font-weight: 600;
$btn-border-radius: 2rem;
$btn-box-shadow: $box-shadow;
// === FORMULARIOS ===
$input-padding-y: 0.875rem;
$input-padding-x: 1.25rem;
$input-border-radius: $border-radius;
$input-focus-border-color: $primary;
$input-focus-box-shadow: 0 0 0 0.25rem rgba($primary, 0.25);
Integración práctica completa
Un ejemplo completo de configuración que demuestra la potencia de Sass:
// custom.scss - Configuración completa del proyecto
@import "node_modules/bootstrap/scss/functions";
// Variables del proyecto
$primary: #2563eb;
$font-family-sans-serif: "Poppins", system-ui, sans-serif;
$border-radius: 1rem;
// Colores corporativos adicionales
$corporate-colors: (
"brand": $primary,
"accent": #f59e0b,
"neutral": #64748b
);
$theme-colors: map-merge($theme-colors, $corporate-colors);
// Espaciados específicos del proyecto
$spacers: map-merge($spacers, (
6: $spacer * 4,
7: $spacer * 5,
8: $spacer * 6
));
@import "node_modules/bootstrap/scss/variables";
@import "node_modules/bootstrap/scss/bootstrap";
// Estilos adicionales que aprovechan las variables de Bootstrap
.hero-section {
padding: $spacer * 8 0;
background: linear-gradient(135deg, $primary, lighten($primary, 15%));
@include media-breakpoint-down(md) {
padding: $spacer * 4 0;
}
}
.card-premium {
@extend .card;
border: none;
box-shadow: $box-shadow-lg;
transition: all 0.3s ease;
&:hover {
transform: translateY(-4px);
box-shadow: 0 20px 40px rgba($dark, 0.1);
}
}
Workflow de desarrollo recomendado
Para un flujo de trabajo eficiente, combina la compilación Sass con la personalización mediante variables CSS:
// custom.scss - Enfoque híbrido
// 1. Personalización profunda con Sass
$primary: #2563eb;
$font-family-sans-serif: "Inter", sans-serif;
@import "node_modules/bootstrap/scss/bootstrap";
// 2. Variables CSS para ajustes dinámicos
:root {
--bs-primary-rgb: #{to-rgb($primary)};
--custom-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
--custom-transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
// 3. Clases que combinan ambos enfoques
.btn-enhanced {
@extend .btn, .btn-primary;
box-shadow: var(--custom-shadow);
transition: var(--custom-transition);
&:hover {
transform: translateY(-2px);
}
}
Esta configuración híbrida te permite aprovechar la potencia de Sass para personalizaciones estructurales profundas, mientras mantienes la flexibilidad de las variables CSS para ajustes dinámicos que pueden modificarse incluso después de la compilación. Es el equilibrio perfecto entre control total y flexibilidad práctica para proyectos profesionales que requieren personalización avanzada de Bootstrap.
Fuentes y referencias
Documentación oficial y recursos externos para profundizar en Bootstrap
Documentación oficial de Bootstrap
Alan Sastre
Ingeniero de Software y formador, CEO en CertiDevs
Ingeniero de software especializado en Full Stack y en Inteligencia Artificial. Como CEO de CertiDevs, Bootstrap es una de sus áreas de expertise. Con más de 15 años programando, 6K seguidores en LinkedIn y experiencia como formador, Alan se dedica a crear contenido educativo de calidad para desarrolladores de todos los niveles.
Más tutoriales de Bootstrap
Explora más contenido relacionado con Bootstrap y continúa aprendiendo con nuestros tutoriales gratuitos.
Aprendizajes de esta lección
- Comprender el uso de variables CSS nativas para personalizar colores, tipografía y espaciado en Bootstrap.
- Aprender a crear utilidades personalizadas que extiendan las capacidades del framework manteniendo su coherencia.
- Conocer la estructura y configuración básica para personalizar Bootstrap usando Sass.
- Saber modificar mapas de colores, breakpoints y componentes específicos mediante Sass.
- Integrar personalizaciones CSS y Sass para un flujo de trabajo eficiente y escalable.