Componentes
Aprende cómo y por qué construimos casi todos nuestros componentes de forma responsiva y con clases base y modificadoras.
Clases base
Los componentes de Bootstrap se construyen en gran medida con una nomenclatura de
base-modificador. Agrupamos tantas propiedades compartidas como sea posible en una clase base, como
.btn, y luego agrupamos los estilos individuales de cada variante en clases modificadoras, como
.btn-primary o .btn-success.
Para construir nuestras clases modificadoras, usamos los bucles @each de Sass
para iterar sobre un mapa de Sass. Esto es especialmente útil para generar variantes de un componente a partir
de nuestros $theme-colors y crear variantes responsivas para cada punto de interrupción. A medida
que personalices estos mapas de Sass y recompiles, verás automáticamente tus cambios reflejados en estos
bucles.
Consulta nuestra documentación de mapas y bucles de Sass para saber cómo personalizar estos bucles y extender el enfoque de base-modificador de Bootstrap a tu propio código.
Modificadores
Muchos de los componentes de Bootstrap se construyen con un enfoque de clases
base-modificador. Esto significa que la mayor parte del estilo se contiene en una clase base (p. ej.,
.btn) mientras que las variaciones de estilo se limitan a clases modificadoras (p. ej.,
.btn-danger). Estas clases modificadoras se construyen a partir del mapa
$theme-colors para facilitar la personalización del número y nombre de nuestras clases
modificadoras.
Aquí hay dos ejemplos de cómo iteramos sobre el mapa $theme-colors para
generar modificadores para los componentes .alert y .list-group.
// Generate contextual modifier classes for colorizing the alert.
@each $state, $value in $theme-colors {
$alert-background: shift-color($value, $alert-bg-scale);
$alert-border: shift-color($value, $alert-border-scale);
$alert-color: shift-color($value, $alert-color-scale);
@if (contrast-ratio($alert-background, $alert-color) < $min-contrast-ratio) {
$alert-color: mix($value, color-contrast($alert-background), abs($alert-color-scale));
}
.alert-#{$state} {
@include alert-variant($alert-background, $alert-border, $alert-color);
}
}
// List group contextual variants
//
// Add modifier classes to change text and background color on individual items.
// Organizationally, this must come after the `:hover` states.
@each $state, $value in $theme-colors {
$list-group-variant-bg: shift-color($value, $list-group-item-bg-scale);
$list-group-variant-color: shift-color($value, $list-group-item-color-scale);
@if (contrast-ratio($list-group-variant-bg, $list-group-variant-color) < $min-contrast-ratio) {
$list-group-variant-color: mix($value, color-contrast($list-group-variant-bg), abs($list-group-item-color-scale));
}
@include list-group-item-variant($state, $list-group-variant-bg, $list-group-variant-color);
}
Responsivo
Estos bucles de Sass tampoco se limitan a mapas de colores. También puedes generar
variaciones responsivas de tus componentes. Toma por ejemplo nuestra alineación responsiva de los menús
desplegables, donde mezclamos un bucle @each para el mapa de Sass $grid-breakpoints
con una inclusión de media query.
// We deliberately hardcode the `bs-` prefix because we check
// this custom property in JS to determine Popper's positioning
@each $breakpoint in map-keys($grid-breakpoints) {
@include media-breakpoint-up($breakpoint) {
$infix: breakpoint-infix($breakpoint, $grid-breakpoints);
.dropdown-menu#{$infix}-start {
--bs-position: start;
&[data-bs-popper] {
right: auto;
left: 0;
}
}
.dropdown-menu#{$infix}-end {
--bs-position: end;
&[data-bs-popper] {
right: 0;
left: auto;
}
}
}
}
Si modificas tus $grid-breakpoints, tus cambios se aplicarán a todos los
bucles que iteren sobre ese mapa.
$grid-breakpoints: (
xs: 0,
sm: 576px,
md: 768px,
lg: 992px,
xl: 1200px,
xxl: 1400px
);
Para más información y ejemplos sobre cómo modificar nuestros mapas y variables de Sass, consulta la sección de Sass de la documentación del Grid.
Creando los tuyos propios
Te animamos a adoptar estas directrices cuando construyas con Bootstrap para crear tus propios componentes. Nosotros mismos hemos extendido este enfoque a los componentes personalizados de nuestra documentación y ejemplos. Componentes como nuestros callouts se construyen igual que los componentes que proporcionamos, con clases base y modificadoras.
<div class="callout">...</div>
En tu CSS, tendrías algo como lo siguiente, donde la mayor parte del estilo se hace
mediante .callout. Luego, los estilos únicos de cada variante se controlan mediante la clase
modificadora.
// Base class
.callout {}
// Modifier classes
.callout-info {}
.callout-warning {}
.callout-danger {}
Para los callouts, ese estilo único es solo un border-left-color. Al combinar
esa clase base con una de las clases modificadoras, obtienes tu familia completa de componentes: