Saltar al contenido principal Saltar a la navegación de la documentación

Navegación y pestañas

Documentación y ejemplos de cómo usar los componentes de navegación incluidos en Bootstrap.

Nav base

La navegación disponible en Bootstrap comparte marcado y estilos generales, desde la clase base .nav hasta los estados activo y deshabilitado. Intercambia clases modificadoras para cambiar entre cada estilo.

El componente base .nav está construido con Flexbox y proporciona una base sólida para construir todo tipo de componentes de navegación. Incluye algunas sobrescrituras de estilo (para trabajar con listas), algo de padding en los enlaces para áreas de clic más grandes, y estilos básicos para el estado deshabilitado.

El componente base .nav no incluye ningún estado .active. Los siguientes ejemplos incluyen la clase, principalmente para demostrar que esta clase en particular no activa ningún estilo especial.

Para transmitir el estado activo a las tecnologías de asistencia, usa el atributo aria-current — usando el valor page para la página actual, o true para el elemento actual en un conjunto.

html
<ul class="nav">
  <li class="nav-item">
    <a class="nav-link active" aria-current="page" href="#">Active</a>
  </li>
  <li class="nav-item">
    <a class="nav-link" href="#">Link</a>
  </li>
  <li class="nav-item">
    <a class="nav-link" href="#">Link</a>
  </li>
  <li class="nav-item">
    <a class="nav-link disabled" aria-disabled="true">Disabled</a>
  </li>
</ul>

Las clases se usan en todas partes, por lo que tu marcado puede ser muy flexible. Usa <ul>s como arriba, <ol> si el orden de tus elementos es importante, o crea el tuyo propio con un elemento <nav>. Como el .nav usa display: flex, los enlaces de navegación se comportan igual que los elementos de navegación, pero sin el marcado adicional.

html
<nav class="nav">
  <a class="nav-link active" aria-current="page" href="#">Active</a>
  <a class="nav-link" href="#">Link</a>
  <a class="nav-link" href="#">Link</a>
  <a class="nav-link disabled" aria-disabled="true">Disabled</a>
</nav>

Estilos disponibles

Cambia el estilo del componente .navs con modificadores y utilidades. Mezcla y combina según sea necesario, o construye el tuyo propio.

Alineación horizontal

Cambia la alineación horizontal de tu nav con utilidades de flexbox. Por defecto, los navs están alineados a la izquierda, pero puedes cambiarlos fácilmente a alineación centrada o a la derecha.

Centrada con .justify-content-center:

html
<ul class="nav justify-content-center">
  <li class="nav-item">
    <a class="nav-link active" aria-current="page" href="#">Active</a>
  </li>
  <li class="nav-item">
    <a class="nav-link" href="#">Link</a>
  </li>
  <li class="nav-item">
    <a class="nav-link" href="#">Link</a>
  </li>
  <li class="nav-item">
    <a class="nav-link disabled" aria-disabled="true">Disabled</a>
  </li>
</ul>

Alineada a la derecha con .justify-content-end:

html
<ul class="nav justify-content-end">
  <li class="nav-item">
    <a class="nav-link active" aria-current="page" href="#">Active</a>
  </li>
  <li class="nav-item">
    <a class="nav-link" href="#">Link</a>
  </li>
  <li class="nav-item">
    <a class="nav-link" href="#">Link</a>
  </li>
  <li class="nav-item">
    <a class="nav-link disabled" aria-disabled="true">Disabled</a>
  </li>
</ul>

Vertical

Apila tu navegación cambiando la dirección del elemento flex con la utilidad .flex-column. ¿Necesitas apilarlos en algunos viewports pero no en otros? Usa las versiones responsive (ej., .flex-sm-column).

html
<ul class="nav flex-column">
  <li class="nav-item">
    <a class="nav-link active" aria-current="page" href="#">Active</a>
  </li>
  <li class="nav-item">
    <a class="nav-link" href="#">Link</a>
  </li>
  <li class="nav-item">
    <a class="nav-link" href="#">Link</a>
  </li>
  <li class="nav-item">
    <a class="nav-link disabled" aria-disabled="true">Disabled</a>
  </li>
</ul>

Como siempre, la navegación vertical también es posible sin <ul>s.

html
<nav class="nav flex-column">
  <a class="nav-link active" aria-current="page" href="#">Active</a>
  <a class="nav-link" href="#">Link</a>
  <a class="nav-link" href="#">Link</a>
  <a class="nav-link disabled" aria-disabled="true">Disabled</a>
</nav>

Pestañas

Toma la navegación base de arriba y añade la clase .nav-tabs para generar una interfaz con pestañas. Úsalas para crear regiones con pestañas con nuestro plugin de JavaScript de pestañas.

html
<ul class="nav nav-tabs">
  <li class="nav-item">
    <a class="nav-link active" aria-current="page" href="#">Active</a>
  </li>
  <li class="nav-item">
    <a class="nav-link" href="#">Link</a>
  </li>
  <li class="nav-item">
    <a class="nav-link" href="#">Link</a>
  </li>
  <li class="nav-item">
    <a class="nav-link disabled" aria-disabled="true">Disabled</a>
  </li>
</ul>

Pills

Toma ese mismo HTML, pero usa .nav-pills en su lugar:

html
<ul class="nav nav-pills">
  <li class="nav-item">
    <a class="nav-link active" aria-current="page" href="#">Active</a>
  </li>
  <li class="nav-item">
    <a class="nav-link" href="#">Link</a>
  </li>
  <li class="nav-item">
    <a class="nav-link" href="#">Link</a>
  </li>
  <li class="nav-item">
    <a class="nav-link disabled" aria-disabled="true">Disabled</a>
  </li>
</ul>

Subrayado

Toma ese mismo HTML, pero usa .nav-underline en su lugar:

html
<ul class="nav nav-underline">
  <li class="nav-item">
    <a class="nav-link active" aria-current="page" href="#">Active</a>
  </li>
  <li class="nav-item">
    <a class="nav-link" href="#">Link</a>
  </li>
  <li class="nav-item">
    <a class="nav-link" href="#">Link</a>
  </li>
  <li class="nav-item">
    <a class="nav-link disabled" aria-disabled="true">Disabled</a>
  </li>
</ul>

Rellenar y justificar

Obliga a los contenidos de tu .nav a extenderse a todo el ancho disponible con una de dos clases modificadoras. Para rellenar proporcionalmente todo el espacio disponible con tus .nav-items, usa .nav-fill. Ten en cuenta que todo el espacio horizontal está ocupado, pero no todos los elementos del nav tienen el mismo ancho.

html
<ul class="nav nav-pills nav-fill">
  <li class="nav-item">
    <a class="nav-link active" aria-current="page" href="#">Active</a>
  </li>
  <li class="nav-item">
    <a class="nav-link" href="#">Much longer nav link</a>
  </li>
  <li class="nav-item">
    <a class="nav-link" href="#">Link</a>
  </li>
  <li class="nav-item">
    <a class="nav-link disabled" aria-disabled="true">Disabled</a>
  </li>
</ul>

Cuando usas una navegación basada en <nav>, puedes omitir .nav-item de forma segura ya que solo se requiere .nav-link para dar estilo a los elementos <a>.

html
<nav class="nav nav-pills nav-fill">
  <a class="nav-link active" aria-current="page" href="#">Active</a>
  <a class="nav-link" href="#">Much longer nav link</a>
  <a class="nav-link" href="#">Link</a>
  <a class="nav-link disabled" aria-disabled="true">Disabled</a>
</nav>

Para elementos de igual ancho, usa .nav-justified. Todo el espacio horizontal será ocupado por los enlaces de navegación, pero a diferencia del .nav-fill anterior, cada elemento de navegación tendrá el mismo ancho.

html
<ul class="nav nav-pills nav-justified">
  <li class="nav-item">
    <a class="nav-link active" aria-current="page" href="#">Active</a>
  </li>
  <li class="nav-item">
    <a class="nav-link" href="#">Much longer nav link</a>
  </li>
  <li class="nav-item">
    <a class="nav-link" href="#">Link</a>
  </li>
  <li class="nav-item">
    <a class="nav-link disabled" aria-disabled="true">Disabled</a>
  </li>
</ul>

Similar al ejemplo de .nav-fill usando una navegación basada en <nav>.

html
<nav class="nav nav-pills nav-justified">
  <a class="nav-link active" aria-current="page" href="#">Active</a>
  <a class="nav-link" href="#">Much longer nav link</a>
  <a class="nav-link" href="#">Link</a>
  <a class="nav-link disabled" aria-disabled="true">Disabled</a>
</nav>

Trabajando con utilidades flex

Si necesitas variaciones de navegación responsive, considera usar una serie de utilidades de flexbox. Aunque son más verbosas, estas utilidades ofrecen mayor personalización a través de breakpoints responsive. En el ejemplo a continuación, nuestra navegación estará apilada en el breakpoint más bajo, luego se adaptará a un diseño horizontal que rellena el ancho disponible a partir del breakpoint pequeño.

html
<nav class="nav nav-pills flex-column flex-sm-row">
  <a class="flex-sm-fill text-sm-center nav-link active" aria-current="page" href="#">Active</a>
  <a class="flex-sm-fill text-sm-center nav-link" href="#">Longer nav link</a>
  <a class="flex-sm-fill text-sm-center nav-link" href="#">Link</a>
  <a class="flex-sm-fill text-sm-center nav-link disabled" aria-disabled="true">Disabled</a>
</nav>

Sobre accesibilidad

Si estás usando navegaciones para proporcionar una barra de navegación, asegúrate de añadir un role="navigation" al contenedor padre más lógico del <ul>, o envuelve un elemento <nav> alrededor de toda la navegación. No añadas el role al <ul> mismo, ya que esto evitaría que sea anunciado como una lista real por las tecnologías de asistencia.

Ten en cuenta que las barras de navegación, incluso si están visualmente estilizadas como pestañas con la clase .nav-tabs, no deben recibir los atributos role="tablist", role="tab" o role="tabpanel". Estos solo son apropiados para interfaces con pestañas dinámicas, como se describe en el ARIA Authoring Practices Guide tabs pattern. Consulta el comportamiento de JavaScript para interfaces con pestañas dinámicas en esta sección para ver un ejemplo. El atributo aria-current no es necesario en interfaces con pestañas dinámicas ya que nuestro JavaScript maneja el estado seleccionado añadiendo aria-selected="true" en la pestaña activa.

Usando dropdowns

Añade menús desplegables con un poco de HTML adicional y el plugin de JavaScript de desplegables.

Pestañas con dropdowns

html
<ul class="nav nav-tabs">
  <li class="nav-item">
    <a class="nav-link active" aria-current="page" href="#">Active</a>
  </li>
  <li class="nav-item dropdown">
    <a class="nav-link dropdown-toggle" data-bs-toggle="dropdown" href="#" role="button" aria-expanded="false">Dropdown</a>
    <ul class="dropdown-menu">
      <li><a class="dropdown-item" href="#">Action</a></li>
      <li><a class="dropdown-item" href="#">Another action</a></li>
      <li><a class="dropdown-item" href="#">Something else here</a></li>
      <li><hr class="dropdown-divider"></li>
      <li><a class="dropdown-item" href="#">Separated link</a></li>
    </ul>
  </li>
  <li class="nav-item">
    <a class="nav-link" href="#">Link</a>
  </li>
  <li class="nav-item">
    <a class="nav-link disabled" aria-disabled="true">Disabled</a>
  </li>
</ul>

Pills con dropdowns

html
<ul class="nav nav-pills">
  <li class="nav-item">
    <a class="nav-link active" aria-current="page" href="#">Active</a>
  </li>
  <li class="nav-item dropdown">
    <a class="nav-link dropdown-toggle" data-bs-toggle="dropdown" href="#" role="button" aria-expanded="false">Dropdown</a>
    <ul class="dropdown-menu">
      <li><a class="dropdown-item" href="#">Action</a></li>
      <li><a class="dropdown-item" href="#">Another action</a></li>
      <li><a class="dropdown-item" href="#">Something else here</a></li>
      <li><hr class="dropdown-divider"></li>
      <li><a class="dropdown-item" href="#">Separated link</a></li>
    </ul>
  </li>
  <li class="nav-item">
    <a class="nav-link" href="#">Link</a>
  </li>
  <li class="nav-item">
    <a class="nav-link disabled" aria-disabled="true">Disabled</a>
  </li>
</ul>

CSS

Variables

Añadido en v5.2.0

Como parte del enfoque evolutivo de variables CSS de Bootstrap, los navs ahora usan variables CSS locales en .nav, .nav-tabs, y .nav-pills para una personalización en tiempo real mejorada. Los valores de las variables CSS se establecen mediante Sass, por lo que la personalización con Sass también sigue siendo compatible.

En la clase base .nav:

--#{$prefix}nav-link-padding-x: #{$nav-link-padding-x};
--#{$prefix}nav-link-padding-y: #{$nav-link-padding-y};
@include rfs($nav-link-font-size, --#{$prefix}nav-link-font-size);
--#{$prefix}nav-link-font-weight: #{$nav-link-font-weight};
--#{$prefix}nav-link-color: #{$nav-link-color};
--#{$prefix}nav-link-hover-color: #{$nav-link-hover-color};
--#{$prefix}nav-link-disabled-color: #{$nav-link-disabled-color};

En la clase modificadora .nav-tabs:

--#{$prefix}nav-tabs-border-width: #{$nav-tabs-border-width};
--#{$prefix}nav-tabs-border-color: #{$nav-tabs-border-color};
--#{$prefix}nav-tabs-border-radius: #{$nav-tabs-border-radius};
--#{$prefix}nav-tabs-link-hover-border-color: #{$nav-tabs-link-hover-border-color};
--#{$prefix}nav-tabs-link-active-color: #{$nav-tabs-link-active-color};
--#{$prefix}nav-tabs-link-active-bg: #{$nav-tabs-link-active-bg};
--#{$prefix}nav-tabs-link-active-border-color: #{$nav-tabs-link-active-border-color};

En la clase modificadora .nav-pills:

--#{$prefix}nav-pills-border-radius: #{$nav-pills-border-radius};
--#{$prefix}nav-pills-link-active-color: #{$nav-pills-link-active-color};
--#{$prefix}nav-pills-link-active-bg: #{$nav-pills-link-active-bg};
Añadido en v5.3.0

En la clase modificadora .nav-underline:

--#{$prefix}nav-underline-gap: #{$nav-underline-gap};
--#{$prefix}nav-underline-border-width: #{$nav-underline-border-width};
--#{$prefix}nav-underline-link-active-color: #{$nav-underline-link-active-color};

Variables Sass

$nav-link-padding-y:                .5rem;
$nav-link-padding-x:                1rem;
$nav-link-font-size:                null;
$nav-link-font-weight:              null;
$nav-link-color:                    var(--#{$prefix}link-color);
$nav-link-hover-color:              var(--#{$prefix}link-hover-color);
$nav-link-transition:               color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out;
$nav-link-disabled-color:           var(--#{$prefix}secondary-color);
$nav-link-focus-box-shadow:         $focus-ring-box-shadow;

$nav-tabs-border-color:             var(--#{$prefix}border-color);
$nav-tabs-border-width:             var(--#{$prefix}border-width);
$nav-tabs-border-radius:            var(--#{$prefix}border-radius);
$nav-tabs-link-hover-border-color:  var(--#{$prefix}secondary-bg) var(--#{$prefix}secondary-bg) $nav-tabs-border-color;
$nav-tabs-link-active-color:        var(--#{$prefix}emphasis-color);
$nav-tabs-link-active-bg:           var(--#{$prefix}body-bg);
$nav-tabs-link-active-border-color: var(--#{$prefix}border-color) var(--#{$prefix}border-color) $nav-tabs-link-active-bg;

$nav-pills-border-radius:           var(--#{$prefix}border-radius);
$nav-pills-link-active-color:       $component-active-color;
$nav-pills-link-active-bg:          $component-active-bg;

$nav-underline-gap:                 1rem;
$nav-underline-border-width:        .125rem;
$nav-underline-link-active-color:   var(--#{$prefix}emphasis-color);

Comportamiento de JavaScript

Usa el plugin de JavaScript de pestañas—inclúyelo individualmente o a través del archivo compilado bootstrap.js—para extender nuestras pestañas y píldoras de navegación y crear paneles con pestañas de contenido local.

Este es un contenido de marcador de posición del contenido asociado a la pestaña Home. Al hacer clic en otra pestaña, se alternará la visibilidad de esta para la siguiente. El JavaScript de las pestañas intercambia clases para controlar la visibilidad y el estilo del contenido. Puedes usarlo con pestañas, pills y cualquier otra navegación basada en .nav.

Este es un contenido de marcador de posición del contenido asociado a la pestaña Profile. Al hacer clic en otra pestaña, se alternará la visibilidad de esta para la siguiente. El JavaScript de las pestañas intercambia clases para controlar la visibilidad y el estilo del contenido. Puedes usarlo con pestañas, pills y cualquier otra navegación basada en .nav.

Este es un contenido de marcador de posición del contenido asociado a la pestaña Contact. Al hacer clic en otra pestaña, se alternará la visibilidad de esta para la siguiente. El JavaScript de las pestañas intercambia clases para controlar la visibilidad y el estilo del contenido. Puedes usarlo con pestañas, pills y cualquier otra navegación basada en .nav.

Este es un contenido de marcador de posición del contenido asociado a la pestaña Disabled.

<ul class="nav nav-tabs" id="myTab" role="tablist">
  <li class="nav-item" role="presentation">
    <button class="nav-link active" id="home-tab" data-bs-toggle="tab" data-bs-target="#home-tab-pane" type="button" role="tab" aria-controls="home-tab-pane" aria-selected="true">Home</button>
  </li>
  <li class="nav-item" role="presentation">
    <button class="nav-link" id="profile-tab" data-bs-toggle="tab" data-bs-target="#profile-tab-pane" type="button" role="tab" aria-controls="profile-tab-pane" aria-selected="false">Profile</button>
  </li>
  <li class="nav-item" role="presentation">
    <button class="nav-link" id="contact-tab" data-bs-toggle="tab" data-bs-target="#contact-tab-pane" type="button" role="tab" aria-controls="contact-tab-pane" aria-selected="false">Contact</button>
  </li>
  <li class="nav-item" role="presentation">
    <button class="nav-link" id="disabled-tab" data-bs-toggle="tab" data-bs-target="#disabled-tab-pane" type="button" role="tab" aria-controls="disabled-tab-pane" aria-selected="false" disabled>Disabled</button>
  </li>
</ul>
<div class="tab-content" id="myTabContent">
  <div class="tab-pane fade show active" id="home-tab-pane" role="tabpanel" aria-labelledby="home-tab" tabindex="0">...</div>
  <div class="tab-pane fade" id="profile-tab-pane" role="tabpanel" aria-labelledby="profile-tab" tabindex="0">...</div>
  <div class="tab-pane fade" id="contact-tab-pane" role="tabpanel" aria-labelledby="contact-tab" tabindex="0">...</div>
  <div class="tab-pane fade" id="disabled-tab-pane" role="tabpanel" aria-labelledby="disabled-tab" tabindex="0">...</div>
</div>

Para adaptarse a tus necesidades, esto funciona con marcado basado en <ul>, como se muestra arriba, o con cualquier marcado propio arbitrario. Ten en cuenta que si estás usando <nav>, no debes añadir role="tablist" directamente a él, ya que esto sobrescribiría el role nativo del elemento como punto de referencia de navegación. En su lugar, cambia a un elemento alternativo (en el ejemplo a continuación, un simple <div>) y envuelve el <nav> alrededor de él.

<nav>
  <div class="nav nav-tabs" id="nav-tab" role="tablist">
    <button class="nav-link active" id="nav-home-tab" data-bs-toggle="tab" data-bs-target="#nav-home" type="button" role="tab" aria-controls="nav-home" aria-selected="true">Home</button>
    <button class="nav-link" id="nav-profile-tab" data-bs-toggle="tab" data-bs-target="#nav-profile" type="button" role="tab" aria-controls="nav-profile" aria-selected="false">Profile</button>
    <button class="nav-link" id="nav-contact-tab" data-bs-toggle="tab" data-bs-target="#nav-contact" type="button" role="tab" aria-controls="nav-contact" aria-selected="false">Contact</button>
    <button class="nav-link" id="nav-disabled-tab" data-bs-toggle="tab" data-bs-target="#nav-disabled" type="button" role="tab" aria-controls="nav-disabled" aria-selected="false" disabled>Disabled</button>
  </div>
</nav>
<div class="tab-content" id="nav-tabContent">
  <div class="tab-pane fade show active" id="nav-home" role="tabpanel" aria-labelledby="nav-home-tab" tabindex="0">...</div>
  <div class="tab-pane fade" id="nav-profile" role="tabpanel" aria-labelledby="nav-profile-tab" tabindex="0">...</div>
  <div class="tab-pane fade" id="nav-contact" role="tabpanel" aria-labelledby="nav-contact-tab" tabindex="0">...</div>
  <div class="tab-pane fade" id="nav-disabled" role="tabpanel" aria-labelledby="nav-disabled-tab" tabindex="0">...</div>
</div>

El plugin de pestañas también funciona con píldoras.

Este es un contenido de marcador de posición del contenido asociado a la pestaña Home. Al hacer clic en otra pestaña, se alternará la visibilidad de esta para la siguiente. El JavaScript de las pestañas intercambia clases para controlar la visibilidad y el estilo del contenido. Puedes usarlo con pestañas, pills y cualquier otra navegación basada en .nav.

Este es un contenido de marcador de posición del contenido asociado a la pestaña Profile. Al hacer clic en otra pestaña, se alternará la visibilidad de esta para la siguiente. El JavaScript de las pestañas intercambia clases para controlar la visibilidad y el estilo del contenido. Puedes usarlo con pestañas, pills y cualquier otra navegación basada en .nav.

Este es un contenido de marcador de posición del contenido asociado a la pestaña Contact. Al hacer clic en otra pestaña, se alternará la visibilidad de esta para la siguiente. El JavaScript de las pestañas intercambia clases para controlar la visibilidad y el estilo del contenido. Puedes usarlo con pestañas, pills y cualquier otra navegación basada en .nav.

Este es un contenido de marcador de posición del contenido asociado a la pestaña Disabled.

<ul class="nav nav-pills mb-3" id="pills-tab" role="tablist">
  <li class="nav-item" role="presentation">
    <button class="nav-link active" id="pills-home-tab" data-bs-toggle="pill" data-bs-target="#pills-home" type="button" role="tab" aria-controls="pills-home" aria-selected="true">Home</button>
  </li>
  <li class="nav-item" role="presentation">
    <button class="nav-link" id="pills-profile-tab" data-bs-toggle="pill" data-bs-target="#pills-profile" type="button" role="tab" aria-controls="pills-profile" aria-selected="false">Profile</button>
  </li>
  <li class="nav-item" role="presentation">
    <button class="nav-link" id="pills-contact-tab" data-bs-toggle="pill" data-bs-target="#pills-contact" type="button" role="tab" aria-controls="pills-contact" aria-selected="false">Contact</button>
  </li>
  <li class="nav-item" role="presentation">
    <button class="nav-link" id="pills-disabled-tab" data-bs-toggle="pill" data-bs-target="#pills-disabled" type="button" role="tab" aria-controls="pills-disabled" aria-selected="false" disabled>Disabled</button>
  </li>
</ul>
<div class="tab-content" id="pills-tabContent">
  <div class="tab-pane fade show active" id="pills-home" role="tabpanel" aria-labelledby="pills-home-tab" tabindex="0">...</div>
  <div class="tab-pane fade" id="pills-profile" role="tabpanel" aria-labelledby="pills-profile-tab" tabindex="0">...</div>
  <div class="tab-pane fade" id="pills-contact" role="tabpanel" aria-labelledby="pills-contact-tab" tabindex="0">...</div>
  <div class="tab-pane fade" id="pills-disabled" role="tabpanel" aria-labelledby="pills-disabled-tab" tabindex="0">...</div>
</div>

Y con píldoras verticales. Idealmente, para pestañas verticales, también deberías añadir aria-orientation="vertical" al contenedor de la lista de pestañas.

Este es un contenido de marcador de posición del contenido asociado a la pestaña Home. Al hacer clic en otra pestaña, se alternará la visibilidad de esta para la siguiente. El JavaScript de las pestañas intercambia clases para controlar la visibilidad y el estilo del contenido. Puedes usarlo con pestañas, pills y cualquier otra navegación basada en .nav.

Este es un contenido de marcador de posición del contenido asociado a la pestaña Profile. Al hacer clic en otra pestaña, se alternará la visibilidad de esta para la siguiente. El JavaScript de las pestañas intercambia clases para controlar la visibilidad y el estilo del contenido. Puedes usarlo con pestañas, pills y cualquier otra navegación basada en .nav.

Este es un contenido de marcador de posición del contenido asociado a la pestaña Disabled.

Este es un contenido de marcador de posición del contenido asociado a la pestaña Messages. Al hacer clic en otra pestaña, se alternará la visibilidad de esta para la siguiente. El JavaScript de las pestañas intercambia clases para controlar la visibilidad y el estilo del contenido. Puedes usarlo con pestañas, pills y cualquier otra navegación basada en .nav.

Este es un contenido de marcador de posición del contenido asociado a la pestaña Settings. Al hacer clic en otra pestaña, se alternará la visibilidad de esta para la siguiente. El JavaScript de las pestañas intercambia clases para controlar la visibilidad y el estilo del contenido. Puedes usarlo con pestañas, pills y cualquier otra navegación basada en .nav.

<div class="d-flex align-items-start">
  <div class="nav flex-column nav-pills me-3" id="v-pills-tab" role="tablist" aria-orientation="vertical">
    <button class="nav-link active" id="v-pills-home-tab" data-bs-toggle="pill" data-bs-target="#v-pills-home" type="button" role="tab" aria-controls="v-pills-home" aria-selected="true">Home</button>
    <button class="nav-link" id="v-pills-profile-tab" data-bs-toggle="pill" data-bs-target="#v-pills-profile" type="button" role="tab" aria-controls="v-pills-profile" aria-selected="false">Profile</button>
    <button class="nav-link" id="v-pills-disabled-tab" data-bs-toggle="pill" data-bs-target="#v-pills-disabled" type="button" role="tab" aria-controls="v-pills-disabled" aria-selected="false" disabled>Disabled</button>
    <button class="nav-link" id="v-pills-messages-tab" data-bs-toggle="pill" data-bs-target="#v-pills-messages" type="button" role="tab" aria-controls="v-pills-messages" aria-selected="false">Messages</button>
    <button class="nav-link" id="v-pills-settings-tab" data-bs-toggle="pill" data-bs-target="#v-pills-settings" type="button" role="tab" aria-controls="v-pills-settings" aria-selected="false">Settings</button>
  </div>
  <div class="tab-content" id="v-pills-tabContent">
    <div class="tab-pane fade show active" id="v-pills-home" role="tabpanel" aria-labelledby="v-pills-home-tab" tabindex="0">...</div>
    <div class="tab-pane fade" id="v-pills-profile" role="tabpanel" aria-labelledby="v-pills-profile-tab" tabindex="0">...</div>
    <div class="tab-pane fade" id="v-pills-disabled" role="tabpanel" aria-labelledby="v-pills-disabled-tab" tabindex="0">...</div>
    <div class="tab-pane fade" id="v-pills-messages" role="tabpanel" aria-labelledby="v-pills-messages-tab" tabindex="0">...</div>
    <div class="tab-pane fade" id="v-pills-settings" role="tabpanel" aria-labelledby="v-pills-settings-tab" tabindex="0">...</div>
  </div>
</div>

Accesibilidad

Las interfaces con pestañas dinámicas, como se describe en el ARIA Authoring Practices Guide tabs pattern, requieren role="tablist", role="tab", role="tabpanel", y atributos aria- adicionales para transmitir su estructura, funcionalidad y estado actual a los usuarios de tecnologías de asistencia (como lectores de pantalla). Como buena práctica, recomendamos usar elementos <button> para las pestañas, ya que son controles que desencadenan un cambio dinámico, en lugar de enlaces que navegan a una nueva página o ubicación.

De acuerdo con el patrón de ARIA Authoring Practices, solo la pestaña actualmente activa recibe el foco del teclado. Cuando se inicializa el plugin de JavaScript, establecerá tabindex="-1" en todos los controles de pestañas inactivos. Una vez que la pestaña actualmente activa tiene el foco, las teclas del cursor activan la pestaña anterior/siguiente. Las teclas Home y End activan la primera y la última pestaña, respectivamente. El plugin cambiará el roving tabindex en consecuencia. Sin embargo, ten en cuenta que el plugin de JavaScript no distingue entre listas de pestañas horizontales y verticales cuando se trata de interacciones con las teclas del cursor: independientemente de la orientación de la lista de pestañas, tanto el cursor arriba como el izquierdo van a la pestaña anterior, y el cursor abajo y el derecho van a la pestaña siguiente.

En general, para facilitar la navegación con teclado, se recomienda hacer que los paneles de pestañas también sean enfocables, a menos que el primer elemento que contenga contenido significativo dentro del panel de pestañas ya sea enfocable. El plugin de JavaScript no intenta manejar este aspecto: cuando sea apropiado, tendrás que hacer que tus paneles de pestañas sean explícitamente enfocables añadiendo tabindex="0" en tu marcado.

El plugin de JavaScript de pestañas no admite interfaces con pestañas que contienen menús dropdown, ya que causan problemas tanto de usabilidad como de accesibilidad. Desde el punto de vista de usabilidad, el hecho de que el elemento disparador de la pestaña mostrada actualmente no sea inmediatamente visible (ya que está dentro del menú dropdown cerrado) puede causar confusión. Desde el punto de vista de accesibilidad, actualmente no hay una forma sensata de mapear este tipo de construcción a un patrón WAI ARIA estándar, lo que significa que no puede hacerse fácilmente comprensible para los usuarios de tecnologías de asistencia.

Usando atributos data

Puedes activar una navegación de pestañas o píldoras sin escribir ningún JavaScript simplemente especificando data-bs-toggle="tab" o data-bs-toggle="pill" en un elemento. Usa estos atributos data en .nav-tabs o .nav-pills.

<!-- Nav tabs -->
<ul class="nav nav-tabs" id="myTab" role="tablist">
  <li class="nav-item" role="presentation">
    <button class="nav-link active" id="home-tab" data-bs-toggle="tab" data-bs-target="#home" type="button" role="tab" aria-controls="home" aria-selected="true">Home</button>
  </li>
  <li class="nav-item" role="presentation">
    <button class="nav-link" id="profile-tab" data-bs-toggle="tab" data-bs-target="#profile" type="button" role="tab" aria-controls="profile" aria-selected="false">Profile</button>
  </li>
  <li class="nav-item" role="presentation">
    <button class="nav-link" id="messages-tab" data-bs-toggle="tab" data-bs-target="#messages" type="button" role="tab" aria-controls="messages" aria-selected="false">Messages</button>
  </li>
  <li class="nav-item" role="presentation">
    <button class="nav-link" id="settings-tab" data-bs-toggle="tab" data-bs-target="#settings" type="button" role="tab" aria-controls="settings" aria-selected="false">Settings</button>
  </li>
</ul>

<!-- Tab panes -->
<div class="tab-content">
  <div class="tab-pane active" id="home" role="tabpanel" aria-labelledby="home-tab" tabindex="0">...</div>
  <div class="tab-pane" id="profile" role="tabpanel" aria-labelledby="profile-tab" tabindex="0">...</div>
  <div class="tab-pane" id="messages" role="tabpanel" aria-labelledby="messages-tab" tabindex="0">...</div>
  <div class="tab-pane" id="settings" role="tabpanel" aria-labelledby="settings-tab" tabindex="0">...</div>
</div>

Vía JavaScript

Habilita pestañas navegables vía JavaScript (cada pestaña necesita activarse individualmente):

const triggerTabList = document.querySelectorAll('#myTab button')
triggerTabList.forEach(triggerEl => {
  const tabTrigger = new bootstrap.Tab(triggerEl)

  triggerEl.addEventListener('click', event => {
    event.preventDefault()
    tabTrigger.show()
  })
})

Puedes activar pestañas individuales de varias maneras:

const triggerEl = document.querySelector('#myTab button[data-bs-target="#profile"]')
bootstrap.Tab.getInstance(triggerEl).show() // Select tab by name

const triggerFirstTabEl = document.querySelector('#myTab li:first-child button')
bootstrap.Tab.getInstance(triggerFirstTabEl).show() // Select first tab

Efecto de fundido

Para hacer que las pestañas aparezcan con un efecto de fundido, añade .fade a cada .tab-pane. El primer panel de pestaña también debe tener .show para hacer visible el contenido inicial.

<div class="tab-content">
  <div class="tab-pane fade show active" id="home" role="tabpanel" aria-labelledby="home-tab" tabindex="0">...</div>
  <div class="tab-pane fade" id="profile" role="tabpanel" aria-labelledby="profile-tab" tabindex="0">...</div>
  <div class="tab-pane fade" id="messages" role="tabpanel" aria-labelledby="messages-tab" tabindex="0">...</div>
  <div class="tab-pane fade" id="settings" role="tabpanel" aria-labelledby="settings-tab" tabindex="0">...</div>
</div>

Métodos

Todos los métodos de la API son asíncronos e inician una transición. Vuelven al llamador tan pronto como la transición comienza, pero antes de que termine. Además, una llamada a un método en un componente en transición será ignorada. Obtén más información en nuestra documentación de JavaScript.

Activa tu contenido como un elemento tab.

Puedes crear una instancia de tab con el constructor, por ejemplo:

const bsTab = new bootstrap.Tab('#myTab')
Método Descripción
dispose Destruye la pestaña de un elemento.
getInstance Método estático que te permite obtener la instancia de tab asociada a un elemento DOM, puedes usarlo así: bootstrap.Tab.getInstance(element).
getOrCreateInstance Método estático que devuelve una instancia de tab asociada a un elemento DOM o crea una nueva en caso de que no haya sido inicializada. Puedes usarlo así: bootstrap.Tab.getOrCreateInstance(element).
show Selecciona la pestaña dada y muestra su panel asociado. Cualquier otra pestaña que hubiera sido seleccionada previamente queda deseleccionada y su panel asociado se oculta. Vuelve al llamador antes de que el panel de pestaña se haya mostrado realmente (es decir, antes de que ocurra el evento shown.bs.tab).

Eventos

Al mostrar una pestaña nueva, los eventos se disparan en el siguiente orden:

  1. hide.bs.tab (en la pestaña activa actual)
  2. show.bs.tab (en la pestaña que se va a mostrar)
  3. hidden.bs.tab (en la pestaña activa anterior, la misma que para el evento hide.bs.tab)
  4. shown.bs.tab (en la pestaña recién activada que se acaba de mostrar, la misma que para el evento show.bs.tab)

Si ninguna pestaña estaba ya activa, entonces los eventos hide.bs.tab y hidden.bs.tab no se dispararán.

Tipo de evento Descripción
hide.bs.tab Este evento se dispara cuando se va a mostrar una pestaña nueva (y por tanto la pestaña activa anterior se va a ocultar). Usa event.target y event.relatedTarget para apuntar a la pestaña activa actual y a la nueva pestaña que pronto estará activa, respectivamente.
hidden.bs.tab Este evento se dispara después de que se muestra una pestaña nueva (y por tanto la pestaña activa anterior queda oculta). Usa event.target y event.relatedTarget para apuntar a la pestaña activa anterior y a la nueva pestaña activa, respectivamente.
show.bs.tab Este evento se dispara al mostrar la pestaña, pero antes de que la nueva pestaña se haya mostrado. Usa event.target y event.relatedTarget para apuntar a la pestaña activa y a la pestaña activa anterior (si está disponible) respectivamente.
shown.bs.tab Este evento se dispara al mostrar la pestaña después de que una pestaña se haya mostrado. Usa event.target y event.relatedTarget para apuntar a la pestaña activa y a la pestaña activa anterior (si está disponible) respectivamente.
const tabEl = document.querySelector('button[data-bs-toggle="tab"]')
tabEl.addEventListener('shown.bs.tab', event => {
  event.target // newly activated tab
  event.relatedTarget // previous active tab
})
Traducción mantenida por Esdocu. Visita esdocu.com para ver más documentaciones traducidas.