Botones

Los botones permiten iniciar acciones o navegar a otras páginas. Las etiquetas de los botones expresan qué acción ocurrirá cuando la persona usuaria interactúe con él.


Uso

Cuándo usar

  • Para desencadenar una acción o evento (ej. enviar un formulario, abrir un menú o confirmar una operación).
  • Como guía para avanzar o retroceder a través de flujos interactivos.
  • Para enlaces de llamado a la acción (CTAs) que precisen mayor jerarquía visual y utilicen estilos de botón.

Cuándo no usar

  • Para navegar a un nuevo destino externo o interno, utilizar un Enlace o un enlace con estilos de botón.
  • Para un botón que desencadena opciones, considerar un Desplegable.

Tamaños

Existen 3 tamaños de botones: grandes, medianos y chicos; el botón grande es el tamaño de botón predeterminado.

Tamaños de botones

Tipos

Cada tipo de botón tiene una función específica dentro de la interfaz, estableciendo una jerarquía a partir del color y el relleno.

Botón primario (primary)

Es el botón de mayor jerarquía, reservado para la acción clave en un flujo. Se recomienda utilizar un único botón primario por página.

Botón primario

Botón secundario (secondary)

Es el botón de segunda mayor jerarquía, y se utiliza para acciones complementarias/secundarias en un flujo.

Botón secundario

Botón terciario (tertiary)

Es el botón con menor jerarquía, y se utiliza para acciones repetitivas y/o acciones que no están relacionadas al flujo principal.

Botón terciario

Botón de éxito (success)

Se utiliza como botón de confirmación en flujos con pasos o instancias definitivas, como una acción con consecuencia positiva.

Botón de exito

Botón de peligro (danger)

Se utiliza para acciones que podrían tener efectos destructivos o acciones que no pueden deshacerse (por ejemplo, eliminar o quitar).

Botón de peligro

Botón claro (light)

Se usa para garantizar la visibilidad y legibilidad de las acciones en las interfaces con fondos oscuros.

Botón claro

Botones con borde (outlined)

A diferencia del resto de los botones, éstos están delineados, lo que les otorga menos jerarquía visual que los botones rellenos. Son utilizados para acciones de menor énfasis, y pueden combinarse con otros estilos de botones.

Botón outlined

Botón de acción para tabla

Se utiliza dentro de la celda de una Tabla, economizando el espacio disponible. No cuenta con relleno ni borde.

Botón de acción para tabla

Uso de íconos

El botón puede incluir un ícono para reforzar la acción pretendida. También es posible utilizar un botón sólo con ícono.

Cómo usar los íconos

Ejemplos de uso

Cómo sí usar los íconos
check

Utilizar librerías que estén integradas a Obelisco, como Material Symbols o Boxicons.

Cómo no usar los íconos
check

No utilizar íconos de librerías que no estén en Obelisco.

Posición

  • Ícono inicial (leading icon): se posiciona antes de la etiqueta y sirve de refuerzo visual. Esta posición se debe al orden de lectura de la persona usuaria.
  • Ícono final (trailing icon): se posiciona luego de la etiqueta, y se utiliza en botones con acciones que denotan continuidad. En este caso, es recomendable usar un ícono de flecha o de chevrón.

Ejemplos de uso

Ejemplo de uso de cómo sí usar los íconos
check

Utilizar solo 1 ícono de soporte, como ícono inicial o como ícono final.

Ejemplo de uso de cómo no usar los íconos
check

No utilizar 2 íconos de soporte al mismo tiempo.

Patrones de uso o combinación de botones

Existen reglas para el uso y la combinación de botones según su nivel de importancia en cada contexto. Esto se basa en el concepto de "espacios jerarquizados ", que implica asignar prioridades a los botones según su función dentro de una interfaz, asegurando que los elementos más relevantes sean más visibles y accesibles para las personas usuarias.

Niveles de jerarquía

Los niveles de jerarquía como primary, secondary y tertiary se asignan según el contexto de uso y la sección de contenido. Sin embargo, para evitar sobrecargar visualmente una pantalla, las acciones repetitivas dentro de una misma sección se trabajarán con botones outlined. Esto permite mantener una jerarquía clara y equilibrar el peso visual sin necesidad de mezclar diferentes niveles de botones en un mismo espacio.

Grupo para acciones primarias

Para contextos con acciones primarias y/o acciones principales. Normalmente, existe una única sección o agrupación de botones primarios por página. Por ejemplo, en el último paso de un formulario, antes de enviar los datos, puede haber 2 acciones: una para ver al detalle toda la información cargada, y una para enviar la información de manera definitiva; estas 2 acciones comparten el mismo nivel jerárquico, pero una tiene prioridad dentro de este nivel.

Grupo para acciones primarias

Grupo para acciones secundarias

Recomendado para contextos con acciones secundarias como el patrón de navegación por pasos como "Continuar" y "Volver". En caso de que sea una acción de finalización del proceso, como "Confirmar inscripción", se reemplaza el botón secundario relleno (secondary filled) por el botón primario relleno (primary filled).

Grupo para acciones secundarias

Grupo con botones de peligro

Se usan en contextos de acciones destructivas o modales de peligro. Dentro de este grupo, se debe utilizar el estilo relleno (filled) del botón de peligro.

Grupo con botones de peligro

Grupo para acciones terciarias

Para contextos de acciones terciarias. Por ejemplo, en un formulario se puede utilizar el tertiary filled para editar una sub-sección, y botones outlined dentro de la subsección para adjuntar documentación o editar un campo específico.

Grupo para acciones terciarias

Grupo para fondos oscuros

Para contextos de acciones primarias en fondos oscuros. Se utiliza el light outlined en vez del primary outlined, ya que, este último tiene bajo contraste en fondos oscuros.

Grupo para fondos oscuros

Alineación

Se refiere a cómo se alinean los botones en relación al contenedor en el que se encuentra o a la página. La alineación de los accionables depende del contexto de uso y el espacio sobre el que interactúa la persona usuaria.

En dispositivos mobile y tablet, donde el contenido toma una estructura de columna, el cómo se reorganizan los botones depende de si se trata de una acción principal y general, o de una acción que solo refiere a un bloque de contenido.

Los accionables que cumplen la función de acción principal, normalmente adoptan la alineación en columna y de ancho completo. Por otro lado, los que hacen referencia a un bloque de contenido o son parte de una subsección, normalmente adoptan la alineación en fila y alineados a la izquierda.

Alineación a la izquierda

Para páginas donde el contenido requiere de una acción, que no hace referencia a continuidad o a navegación progresiva, es recomendable alinear las acciones principales a la izquierda, para reforzar el flujo de lectura y el orden de enfoque.

Alineación a la izquierda

Alineación a la derecha

En los modales y formularios, en donde la acción principal implica un paso de navegación hacia adelante, los botones primarios siempre aparecen a la derecha.

Alineación a la derecha

Alineación a la derecha

Para acciones repetitivas que afectan a un bloque de contenido en la misma página, es recomendable utilizar un botón terciario alineado al título de la sección.

Alineación a la derecha parte 2

Alineación para dispositivos mobile

En dispositivos mobile la alineación depende del contexto de uso del botón. Existen 3 tipos de disposición para los accionables: en columna y de ancho completo, en fila y de ancho completo, y en fila y alineados a la izquierda.

  • En columna y de ancho completo: permite 1 accionable por línea, uno debajo del otro.
  • En fila y de ancho completo: permite 2 accionables en la misma línea, que toman el 100 % del espacio disponible.
  • En fila y alineados a la izquierda: 2 accionables en la misma línea, que se ajustan al largo de su contenido.
Alineación mobile

Contenido

El texto de la etiqueta debe ser corto, conciso y descriptivo. Utilizar etiquetas como "Hacé click acá" o "Más info" no visibiliza lo que sucederá al interactuar con el botón. La etiqueta del botón siempre debe comenzar con un verbo que refleje la acción consecuente, por ejemplo,"Adjuntar archivo".

Ejemplos de uso

Buena práctica en botones ejemplo 1
check

Utilizar hasta 3 palabras como etiqueta dentro de un botón.

Mala práctica en botones ejemplo 1
close

No utilizar más de 3 palabras como etiqueta dentro de un botón.

Buena práctica en botones ejemplo 2
check

Identificar una única acción por botón.

Mala práctica en botones ejemplo 2
close

No identificar más de 2 acciones en un mismo botón.

Buena práctica en botones ejemplo 3
check

Respetar el uso de mayúsculas al comienzo de la etiqueta.

Mala práctica en botones ejemplo 3
close

No escribir la etiqueta utilizando mayúsculas sostenidas o solo minúsculas.

Tipos


<button type="button" class="btn btn-primary">Primario</button>
<button type="button" class="btn btn-secondary">Secundario</button>
<button type="button" class="btn btn-tertiary">Terciario</button>
<button type="button" class="btn btn-success">Éxito</button>
<button type="button" class="btn btn-danger">Error</button>
<button type="button" class="btn btn-light">Light</button>


<button type="button" class="btn btn-outline-primary">Primario</button>
<button type="button" class="btn btn-outline-secondary">Secundario</button>
<button type="button" class="btn btn-outline-tertiary">Terciario</button>
<button type="button" class="btn btn-outline-success">Éxito</button>
<button type="button" class="btn btn-outline-danger">Error</button>
<button type="button" class="btn btn-outline-light">Light</button>

En caso de requerir que un elemento anchor adopte el estilo de un botón, simplemente pueden utilizarse las clases correspondientes de botones.


<a class="btn btn-primary" href="#" target="_blank" rel="noopener noreferrer">
  Enlace
</a>
<a class="btn btn-outline-primary" href="#" target="_blank" 
rel="noopener noreferrer">
  Enlace
</a>

Tamaños


<button type="button" class="btn btn-primary btn-sm">Chico</button>
<button type="button" class="btn btn-primary">Mediano</button>
<button type="button" class="btn btn-primary btn-lg">Grande</button>

Estado Deshabilitado


<button type="button" class="btn btn-primary" disabled>Primario</button>
<button type="button" class="btn btn-secondary" disabled>Secundario</button>
<button type="button" class="btn btn-tertiary" disabled>Terciario</button>
<button type="button" class="btn btn-success" disabled>Éxito</button>
<button type="button" class="btn btn-danger" disabled>Error</button>
<button type="button" class="btn btn-light" disabled>Light</button>

Expandible


<button type="button" class="btn btn-primary btn-block">
  Botón expandible
</button>

Con icono

// Botón con texto e icono a la izquierda
<button type="button" class="btn btn-primary btn-sm">
  <i class="bx bx-plus o-icon"></i> Botón
</button>

<button type="button" class="btn btn-primary">
  <i class="bx bx-plus o-icon"></i> Botón
</button>

<button type="button" class="btn btn-primary btn-lg">
  <i class="bx bx-plus o-icon"></i> Botón
</button>

// Botón con texto e icono a la derecha
<button type="button" class="btn btn-primary btn-sm">
  Botón
  <span class="material-symbols-rounded o-icon" aria-hidden="true"> arrow_forward </span>
</button>

<button type="button" class="btn btn-primary">
  Botón
  <span class="material-symbols-rounded o-icon" aria-hidden="true"> arrow_forward </span>
</button>

<button type="button" class="btn btn-primary btn-lg">
  Botón
  <span class="material-symbols-rounded o-icon" aria-hidden="true"> arrow_forward </span>
</button>

// Botón sin texto, con icono
<button type="button" class="btn btn-primary btn-sm" aria-label="Botón">
  <span class="material-symbols-rounded o-icon" aria-hidden="true">add</span>
</button>

<button type="button" class="btn btn-primary" aria-label="Botón">
  <span class="material-symbols-rounded o-icon" aria-hidden="true">add</span>
</button>

<button type="button" class="btn btn-primary btn-lg" aria-label="Botón">
  <span class="material-symbols-rounded o-icon" aria-hidden="true">add</span>
</button>

Con spinner


<button type="button" class="btn btn-primary" disabled>
  <div class="spinner-border text-primary spinner-border-sm" role="status">
    <span class="sr-only">Cargando...</span>
  </div>
  Cargando
</button>
<button type="button" class="btn btn-secondary" disabled>
  <div class="spinner-border text-secondary spinner-border-sm" role="status">
    <span class="sr-only">Cargando...</span>
  </div>
  Cargando
</button>
<button type="button" class="btn btn-tertiary" disabled>
  <div class="spinner-border text-tertiary spinner-border-sm" role="status">
    <span class="sr-only">Cargando...</span>
  </div>
  Cargando
</button>
<button type="button" class="btn btn-success" disabled>
  <div class="spinner-border text-success spinner-border-sm" role="status">
    <span class="sr-only">Cargando...</span>
  </div>
  Cargando
</button>
<button type="button" class="btn btn-danger" disabled>
  <div class="spinner-border text-danger spinner-border-sm" role="status">
    <span class="sr-only">Cargando...</span>
  </div>
  Cargando
</button>
<button type="button" class="btn btn-light" disabled>
  <div class="spinner-border text-light spinner-border-sm" role="status">
    <span class="sr-only">Cargando...</span>
  </div>
  Cargando
</button>

Botón con borde y spinner


<button type="button" class="btn btn-outline-primary" disabled>
  <div class="spinner-border text-primary spinner-border-sm" role="status">
    <span class="sr-only">Cargando...</span>
  </div>
  Cargando
</button>
<button type="button" class="btn btn-outline-secondary" disabled>
  <div class="spinner-border text-secondary spinner-border-sm" role="status">
    <span class="sr-only">Cargando...</span>
  </div>
  Cargando
</button>
<button type="button" class="btn btn-outline-tertiary" disabled>
  <div class="spinner-border text-tertiary spinner-border-sm" role="status">
    <span class="sr-only">Cargando...</span>
  </div>
  Cargando
</button>
<button type="button" class="btn btn-outline-success" disabled>
  <div class="spinner-border text-success spinner-border-sm" role="status">
    <span class="sr-only">Cargando...</span>
  </div>
  Cargando
</button>
<button type="button" class="btn btn-outline-danger" disabled>
  <div class="spinner-border text-danger spinner-border-sm" role="status">
    <span class="sr-only">Cargando...</span>
  </div>
  Cargando
</button>
<button type="button" class="btn btn-outline-light" disabled>
  <div class="spinner-border text-secondary spinner-border-sm" role="status">
    <span class="sr-only">Cargando...</span>
  </div>
  Cargando
</button>

Botón XS - Icono


<button type="button" class="btn btn-xs" aria-label="Editar">
  <span
    class="material-symbols-rounded o-icon"
    aria-hidden="true"
  >
    edit
  </span>
</button>
<button type="button" class="btn btn-xs" aria-label="Editar">
  <i class="bx bxs-trash-alt o-icon"></i>
</button>
<button type="button" class="btn btn-xs" aria-label="Editar">
  <span
    class="material-symbols-rounded o-icon"
    aria-hidden="true"
  >
    visibility
  </span>
</button>
<button type="button" class="btn btn-xs" aria-label="Editar">
  <i class="bx bxs-download o-icon"></i>
</button>


Anatomía

El botón se compone de 4 elementos.

Anatomia del botón
ElementoCarácter
ContenedorObligatorio. Puede ser relleno o con borde.
Ícono inicial (leading icon)Opcional, siempre y cuando haya una etiqueta.
Ícono final (trailing icon)Opcional, siempre y cuando haya una etiqueta.
EtiquetaOpcional, siempre y cuando haya un ícono.

Estados

Predeterminado (default)

Estado predeterminado de los botones en una interfaz.

Estado predeterminado del boton

Sobre (hover)

Estado que adopta el botón cuando un cursor pasa sobre él, cambiando su apariencia para indicar su interactividad a la persona usuaria. En este caso tanto los botones rellenos como los de borde se ven idénticos.

Estado sobre del boton

En Foco (focus)

Es un principio de accesibilidad que asegura que cualquier elemento interactivo en una interfaz sea claramente visible cuando recibe la atención del usuario, especialmente al ser navegado con el teclado. En Obelisco se utiliza un borde o anillo (focus ring) por fuera del componente en un color distintivo. En este caso tanto los botones rellenos como los de borde se ven idénticos.

Estado en foco del boton

Deshabilitado (disabled)

Estado que indica que el botón no está disponible para la interacción, lo que significa que no puede activarse ni recibir foco. Es recomendable minimizar este tipo de botón porque presenta problemas de accesibilidad.

Estado deshabilitado del boton

Cargando (loading)

Estado que indica que una acción está en progreso y aún no ha finalizado. Se representa visualmente con un Spinner, deshabilitando temporalmente el botón para evitar interacciones adicionales mientras se completa el proceso. Para reforzar el significado de la acción se puede configurar la variante de spinner correspondiente con la de cada botón.

Estado cargando del boton

Espaciado

El espacio recomendado entre botones para cada tamaño garantiza un espacio clickeable/tappeable óptimo.

Espaciado del boton

Navegación alternativa

El componente de botón está construido para ser reconocido por herramientas de asistencia como la navegación por teclado o lectores por voz.

TABENTER

Utilizando el tab la persona usuaria puede navegar a través de elementos de la interfaz. Además, con el enter, puede accionar los elementos sobre los que esté posicionada como botones, enlaces, entre otros.

Navegacion alternativa del botón

Etiquetado descriptivo

En caso de utilizar un botón solo con ícono y sin etiqueta, se debe colocar una etiqueta semántica (aria-label) en el código con el texto descriptivo de la acción.

<button type="button" class="btn btn-xs" aria-label="Editar">
  <span class="material-symbols-rounded o-icon" aria-hidden="true">
    edit
  </span>
</button>

Criterios WCAG aplicados

Success Criterion 1.1.1 Non-text Content (Level A)

Todo el contenido no textual que se presenta al usuario tiene una alternativa de texto que sirve para el propósito equivalente. Esto es válido para botones que sólo tienen un ícono.

Success Criterion 1.3.1 Info and Relationships (Level A)

La información, la estructura y las relaciones transmitidas a través de la presentación pueden determinarse mediante programación o están disponibles en el texto.

Success Criterion 1.4.3 Contrast (Minimum) (Level AA)

La presentación visual de texto y de imágenes de texto tiene una relación de contraste de por lo menos 4.5:1, excepto textos grandes e imágenes de texto grande que tienen un contraste de por lo menos 3:1, textos o imágenes que son parte de un componente inactivo de interfaz de usuario o son pura decoración, o logotipos.

Success Criterion 1.4.11 Non-Text Contrast (Level AA)

La presentación visual de elementos de la interfaz de usuario y objetos gráficos tiene por lo menos una relación de contraste de 3:1 con respecto a los colores adyacentes.

Success Criterion 2.4.7 Focus Visible (Level AA)

Cualquier interfaz de usuario operable por teclado tiene un modo de operación donde el indicador de enfoque del teclado es visible.

Success Criterion 2.5.8 Target Size (Minimum) (Level AA)

El tamaño del objetivo para entradas mediante puntero es de al menos 24 por 24 píxeles CSS.

Navegación de pie de página