Estilizar el viejo elemento de botón

Un botón es uno de esos elementos que se utilizan con mayor frecuencia en las páginas web. La etiqueta <button></button>se puede usar para iniciar un proceso como salida de datos, abrir una ventana modal, enviar un formulario, etc. En el material, cuya traducción publicamos, hablaremos sobre las complejidades de diseñar el elemento buttony cómo diseñar los botones para que funcionen bien en cualquier navegador. Además, los estilos de botones más utilizados se cubrirán aquí. Hablaremos aquí sobre algunas de las dificultades que surgen al trabajar con botones.



Estilos aplicados a botones predeterminados


Tal vez hablar sobre "estilos estándar" le parecerá a alguien una discusión de algunas cosas elementales, pero, de hecho, hablar de eso es bastante interesante. Aquí está la hoja de estilo estándar para botones del agente de usuario de Google Chrome.

.c-button {
    -webkit-writing-mode: horizontal-tb !important;
    -webkit-appearance: button;
    border-color: rgb(216, 216, 216) rgb(209, 209, 209) rgb(186, 186, 186);
    border-style: solid;
    border-width: 1px;
    padding: 1px 7px 2px;
    text-rendering: auto;
    color: initial;
    display: inline-block;
    text-align: start;
    margin: 0em;
    font: 400 11px system-ui;
}

Y así es como se ve un botón estándar cuando la salida del cual no cambia los estilos predeterminados.


Un botón simple al que se aplican los estilos estándar.

Primero, redefina la propiedadappearance. Se usa para estilos específicos de una plataforma en particular. La apariencia del botón con este enfoque se basa en los estilos utilizados en el sistema operativo del usuario.

.c-button {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none;
}

Ahora, después de restablecer la propiedad appearance, observe cómo se ven los botones en diferentes navegadores.


La propiedad de apariencia de estos botones no está configurada.

Luego, antes de pasar al estilo, necesitamos restablecer algunas propiedades más. Esta -border,border-radius,background.

.c-button {
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none;
  border: 0;
  border-radius: 0;
  background: #ccc;
}


Botón después de restablecer propiedades

Ahora que hemos restablecido los estilos de botón estándar, es hora de seguir adelante. A saber, quiero hablar sobre cómo diseñar botones en función de los requisitos para su diseño.

Estilizar botones regulares


Comencemos con un ejemplo básico, hablando sobre el diseño de botones regulares que muestran solo texto. La siguiente figura muestra la "anatomía" de un botón normal.


Color del texto, tamaño de fuente (tamaño de fuente), fondo (fondo), esquinas redondeadas (redondez), sangría (relleno)

.c-button {
  appearance: none;
  border: 0;
  border-radius: 5px;
  background: #4676D7;
  color: #fff;
  padding: 8px 16px;
  font-size: 16px;
}

Con el código CSS anterior, podemos obtener un botón similar al que se muestra en la figura anterior. Después de configurar el estilo básico del botón, debe cuidar la apariencia del botón en varios estados.


Estado normal del botón (Normal), enfocar (Enfocar), pasar el mouse sobre el botón (Desplazar), desactivar el botón (Desactivado)

▍Estilos aplicados a los botones cuando pasas el mouse sobre ellos y cuando se enfocan


Para indicar al usuario que el puntero del mouse está sobre el botón, es importante equipar el botón con un estilo diseñado para este evento. Lo mismo se aplica a cambiar la apariencia de un botón cuando recibe el foco en una situación en la que un usuario que usa un teclado trabaja con una página.

Este material indica que es importante agregar estilos que se apliquen al botón cuando pasa el mouse sobre él ( hover) y cuando recibe el foco ( focus).

Cuando se hoveragrega un estilo antes de un estilo focus, todos los estilos funcionan correctamente. El problema aparece cuando el estilo se focusagrega antes que el estilo hover. Cuando se hace clic con el mouse en un elemento, el estilo focusno se manifiesta de ninguna manera; solo la representación del botón determinada por el estilo es visible hover.


Bueno, si primero viene el estilo de desplazamiento, y luego el estilo de enfoque. Así

es como se ve la descripción correcta del estilo:

.c-button:hover {
  background: #1d49aa;
}

.c-button:focus {
  outline: none;
  box-shadow: 0 0 0 4px #cbd6ee;
}

▍ Ancho mínimo de botón


Para que el botón se vea bien, debe tener un cierto ancho. Es importante pensar en esto de antemano y tener en cuenta las etiquetas largas y cortas que pueden aparecer en los botones. Debido a la propiedad, min-widthpuede establecer el ancho mínimo del botón. Aquí está mi artículo donde esta y otras propiedades similares se discuten en detalle.

Echa un vistazo a la siguiente figura. Allí puede ver varios botones que contienen etiquetas de diferentes longitudes en inglés y árabe. Si no establece el ancho mínimo del botón, el botón, cuando la inscripción en él sea corta, será demasiado pequeño. Es mejor no permitir esto y usar la propiedad min-width.


Vale la pena establecer la propiedad del botón de ancho mínimo

.c-button {
    min-width: 100px;
    /*  */
}

▍ Sangría


Una idea puede parecer atractiva por la cual los botones no tienen sangría horizontal asignada. Después de todo, los botones tienen un cierto ancho, lo que significa que habrá suficiente espacio entre los bordes de los botones y las inscripciones contenidas en ellos. ¿Entonces? No, no así. La implementación de esta idea puede tener consecuencias negativas en los casos en que cambie la inscripción en el botón.

Echa un vistazo a la siguiente figura.


Se recomienda asignar sangrías internas a los botones.

Tenga en cuenta que si la sangría no se asigna al botón, la inscripción ubicada en él puede acercarse mucho a los bordes. Incluso si el botón tiene una propiedadmin-width. En la parte inferior de la imagen,paddingse utilizantanto la propiedadcomo la propiedadmin-width. Esto da más confianza de que el botón se verá bien en una situación en la que no se conoce de antemano la longitud de la inscripción que se muestra.

FamilyFont familia utilizada para inscripciones ubicadas en botones


Los elementos de formulario, por defecto, no heredan la familia de fuentes asignada a <html>o <body>. Es interesante notar que escribí el 70% de este artículo y me di cuenta de que, en primer lugar, no cambié la fuente del botón utilizado para fines de demostración, y en segundo lugar, no escribí nada al respecto.

Para resolver este problema, la propiedad font-familydebe establecerse en inherit.

.c-button {
    font-family: inherit;
    /*   */
}

▍ Estilo de botones deshabilitados


Para indicarle al usuario que el botón está deshabilitado, puede agregarle un atributo y darle disabledestilo al botón usando CSS.

Aquí está el HTML que describe el botón deshabilitado:

<button disabled></button>

Aquí está el código CSS para diseñar un botón de este tipo:

.c-button[disabled] {
    color: #d2d5db;
    background: #6c7589;
    cursor: not-allowed;
}

Cuando el botón está desactivado, no se puede enfocar desde el teclado y se elimina del árbol de accesibilidad de los elementos de la página.

▍ Vista externa del cursor del mouse cuando lo pasa sobre el botón


El puntero del mouse estándar sobre el botón parece una flecha. Me gusta esta respuesta en StackOverflow: “Los botones son un control de escritorio tradicional. Este es un entorno en el que nunca se usó un puntero de mano hasta el advenimiento de la era de Internet. Cuando el mismo control comenzó a usarse en las páginas web, los desarrolladores simplemente intentaron hacer que los botones se vean igual que en las aplicaciones de escritorio ".

Para anular el comportamiento habitual del puntero, se recomienda cambiar la flecha del cursor estándar a un cursor con forma de mano.


Cursor de flecha estándar y cursor de mano mejorado.

Ahora que hemos discutido los problemas básicos del estilo de los botones, aquí está el código CSS completo que incluye todo lo que mencionamos anteriormente:

.c-button {
  min-width: 100px;
  font-family: inherit;
  appearance: none;
  border: 0;
  border-radius: 5px;
  background: #4676d7;
  color: #fff;
  padding: 8px 16px;
  font-size: 1rem;
  cursor: pointer;
}

.c-button:hover {
  background: #1d49aa;
}

.c-button:focus {
  outline: none;
  box-shadow: 0 0 0 4px #cbd6ee;
}

En las siguientes secciones, hablaremos sobre los diferentes estilos y tipos de botones que puede usar en sus proyectos.

Botones de icono


A veces necesitas un botón para tener un icono determinado. Esto puede ser necesario para resaltar el botón o para informar mejor al usuario sobre la función del botón. Es importante que los botones con íconos sean accesibles para los usuarios con discapacidades.


Ejemplos de

botones de icono En la imagen anterior, hay botones de icono. El siguiente código muestra el atributo agregado al iconoaria-hidden, que le permite eliminarlo del árbol de accesibilidad. También agregué un atributofocusable="false"para evitar que el ícono se enfoque en IE.

Tenga en cuenta que utilicé el estilovertical-align: middlepara alinear el contenido del icono y el botón verticalmente.

Aquí está el código HTML para el botón en cuestión:

<button class="c-button">
    <svg aria-hidden="true" focusable="false" width="24" height="24" viewBox="0 0 24 24"><!--    --></svg>
    Add to fav
  </button>

Aquí está el código de estilo:

.c-button svg {
    display: inline-block;
    vertical-align: middle;
    fill: #fff;
    width: 20px;
    height: 20px;
    margin-right: 0.25rem;
}

Lo que acabamos de examinar puede funcionar hasta que decidamos ocultar el texto del botón y convertirlo en el botón en el que solo se encuentra el icono. ¿Cómo hacerlo? Primero debe ajustar el texto, por ejemplo, en un elemento span. Entonces puede hacer una mejora adicional en la apariencia del botón. Aquí está la descripción HTML del botón:

<button class="c-button c-button--icon">
    <svg aria-hidden="true" focusable="false" width="24" height="24" viewBox="0 0 24 24"><!--    --></svg>
    <span>Add to fav</span>
  </button>

Puede parecer que ahora es suficiente con ocultar el elemento spany el trabajo se realizará:

.c-button--icon span {
    display: none;
}

Aunque con este enfoque, el texto desaparece y el ícono permanece, esto es muy malo en términos de accesibilidad al contenido. El botón ya no es "visible" para los lectores de pantalla. Por ejemplo, VoiceOver en macOS informa que dicho botón es simplemente un "Botón", sin ningún detalle al respecto. Hay varias soluciones a este problema.

▍Usar iconos SVG


Prefiero usar iconos SVG. Se recomienda recopilar todas las descripciones SVG de elementos gráficos en un archivo e incluir cada icono en la etiqueta <svg>usando el elemento <use>. Aquí hay un ejemplo:

<svg class="c-icon" width="32" height="32" viewBox="0 0 20 20">
    <use xlink:href="icons.svg#facebook"></use>
</svg>

Aquí está el código para el icono SVG, cuya descripción se almacena en un archivo icons.svgy tiene un identificador #facebook. Este enfoque reduce la duplicación de código.

▍ Botón de tamaño con icono


Como el texto del botón ya no es visible y la propiedad CSS está configurada para el botón min-width, el ancho del botón no se corresponderá con el tamaño del icono. Para tener en cuenta esta característica, es mejor establecer explícitamente el ancho del botón del icono.


Un botón que tiene establecida la propiedad CSS de ancho mínimo y un botón que no tiene establecida esta propiedad

.c-button--icon {
  min-width: initial;
  text-align: center;
  padding: 10px 14px;
}

▍ Texto oculto visual


Un elemento, que usa la clase popular .sr-only, puede ocultarse visualmente al eliminarlo de la pantalla, pero dejándolo accesible para los lectores de pantalla.

Aquí está el código HTML:

<button class="c-button c-button--icon">
    <svg aria-hidden="true" focusable="false" width="24" height="24" viewBox="0 0 24 24"><!--    --></svg>
    <span class="sr-only">Add to fav</span>
  </button>

Aquí están los estilos:

.sr-only {
  border: 0; 
  clip: rect(0 0 0 0); 
  -webkit-clip-path: polygon(0px 0px, 0px 0px, 0px 0px);
  clip-path: polygon(0px 0px, 0px 0px, 0px 0px);
  height: 1px; 
  margin: -1px;
  overflow: hidden;
  padding: 0;
  position: absolute;
  width: 1px;
  white-space: nowrap;
}

▍ Establezca el tamaño de fuente en 0


Si establece la propiedad font-sizeen un valor 0, el elemento spanno ocupará ningún espacio de pantalla. Es decir, estará oculto.

.c-button--icon span {
    font-size: 0;
}

Pero aquí estoy inclinado hacia una solución que implica el uso de una clase .sr-only. Desde mi punto de vista, parece más lógico. Me parece que el método de ocultar texto configurando el tamaño de fuente en 0 parece una especie de truco.

▍Uso del atributo aria-label


Si no hay ningún elemento en el botón <span>, debe haber una forma de prescindir de él. Una de esas formas es usar un atributo aria-label. El atributo se asigna al elemento mismo <button>o al elemento <svg>.

<button class="c-button c-button--icon" aria-label="Add to fav">
    <svg aria-hidden="true" focusable="false" width="24" height="24" viewBox="0 0 24 24"><!--    --></svg>
  </button>

Si desea saber más sobre los botones con iconos, eche un vistazo a este material.

Botones que contienen varias líneas de texto.


En algunos casos, puede ser necesario que el botón contenga dos líneas de texto. A continuación se muestra un ejemplo de dicho botón.


Botón que contiene dos líneas de texto

Aquí hay un botón para un formulario de suscripción que contiene el texto principal y auxiliar. ¿Cómo hacer un botón así y al mismo tiempo no olvidar su accesibilidad para personas con discapacidad? Aquí está el HTML relevante:

<button class="c-button">
    <span>Subscribe to our newsletter</span>
    <span>240K+ subscribers</span>
</button>

El lector de pantalla "dirá" este botón como "Suscríbete a nuestro boletín 240K + suscriptores". Cuando el usuario escucha esto, puede confundirlo, ya que nada separará las dos líneas de texto que se muestran en el botón. Eche un vistazo a la captura de pantalla de la herramienta de Chrome para examinar la disponibilidad de elementos.


Explorando la disponibilidad de elementos en Chrome

Para no confundir a los usuarios, preferiría ocultar la segunda línea de texto de los lectores de pantalla. Puede hacer esto utilizando el atributoaria-hiddenen el elemento correspondiente<span>:

<button class="c-button">
    <span>Subscribe to our newsletter</span>
    <span aria-hidden="true">240K+ subscribers</span>
</button>

Si por alguna razón no puede cambiar el marcado HTML, hay otra forma de agregar texto adicional al botón. Encontré una solución interesante a este problema en el sitio web de Smashing Magazine. Consiste en colocar contenido utilizando pseudo-elementos. Con este enfoque, los lectores de pantalla no verán nada superfluo. Aquí está el CSS para esta solución:

.c-button--multiple span:after {
    content: "240K+ subscribers";
    display: block;
    font-weight: 400;
    margin-top: 0.25rem;
}

¿Enlaces (<a>) o botones (<botón>)?


¿Cuándo usar enlaces y cuándo - usar botones? Para comenzar, hablemos de cómo se diferencian entre sí.

▍Enlaces


La etiqueta <a>es un hipervínculo que le permite ir a otra página del sitio web o ir a una sección específica de la página vista por el usuario. Junto con la etiqueta <a>, puede utilizar los cuatro pseudo-: :hover, :focus, :activey :visited. Si consideramos los enlaces desde el punto de vista de la accesibilidad, entonces debemos decir que puede interactuar con ellos utilizando la tecla Enterdel teclado. Los enlaces son sonoros y lectores de pantalla.

▍Botones


Un elemento <button type="button">por sí solo, sin conectar el código JavaScript, no realiza ninguna acción. Puedes usar pseudo-clases con él :hover, :focusy :active. Si hablamos de accesibilidad, puede interactuar con el botón usando las teclas del teclado Entery . Los lectores de pantalla "leen" el contenido de los botones.

Si recordamos el diseño, sucede que una página web contiene botones del mismo estilo, que difieren en términos del código HTML utilizado para describirlos. Con esto en mente, el código CSS para diseñar una clase .c-buttondebe escribirse de modo que pueda usarse tanto para elementos <button>como para elementos <a>. Considere el siguiente ejemplo.


Uso de enlaces y botones

Tenga en cuenta que los "botones" de la página tienen el mismo estilo. Sin embargo, el primero de ellos es, de hecho, un elemento<a>, y el segundo es un elemento<button>. Esto significa que el botón no necesariamente se ve como un elemento en HTML<button>.

Hay dos adiciones al estilo.c-button. Estas son las propiedadestext-decoration: none;ytext-align: center;. De manera predeterminada, el texto de los enlaces está subrayado, por lo que queremos cambiar esto al diseñar la clase utilizada. Además, es importante para nosotros centrar el contenido del botón en los casos en que se use un elemento HTML que no sea para describir el botón<button>.

.c-button {
    /*   */
    /*     */
    text-decoration: none;
    text-align: center;
}

Element El elemento <button> no tiene que parecer un botón


Me gusta este ejemplo, en el que, teniendo en cuenta los requisitos de accesibilidad del contenido, se implementa el panel "acordeón". Inicialmente, suponiendo que JavaScript no esté disponible, el resultado de la representación de marcado se parece al siguiente.


Materiales de la página

cuando JavaScript no está disponible Aquí está el código HTML para un fragmento de dicho marcado:

<div class="accordion" data-aria-accordion>
  <h2 data-aria-accordion-heading>Heading of my panel</font></h2>
  <div data-aria-accordion-panel>
    <p>Content goes here</p>
  </div>
</div>

Si JavaScript está disponible, el marcado anterior describirá elementos que se pueden contraer y expandir. Esto se logra creando un botón y agregándolo al elemento <h2>.


Materiales de página en condiciones cuando la funcionalidad de JavaScript está disponible

En este caso, podemos decir que usar el elemento<button>es la opción correcta, ya que el botón resuelve el problema de expandir y contraer bloques de texto.

▍ Botón de arranque


Supongamos que tenemos un documento. Necesitamos describir un enlace para descargarlo. ¿Qué elemento debe usarse para resolver este problema? Aquí un enlace vendrá en nuestra ayuda! Si agrega un atributo al enlace download, al hacer clic en él se iniciará la descarga de los materiales relevantes.


Enlace para descargar el documento, diseñado como un botón

Aquí está el código para este enlace:

<a href="rtl-101.pdf" download>Download PDF</a>

Con este enfoque, tenemos a nuestra disposición un enlace, estilizado como un botón, que hace su trabajo utilizando solo estructuras HTML semánticas.

Botones de trazo



Un botón normal cuando pasa el mouse sobre él se convierte en un botón con un trazo.

La figura anterior muestra un botón que se convierte en un botón con un trazo cuando pasa el mouse sobre él. ¿Qué método se usa mejor para implementar un cambio similar en la apariencia de un botón? Para empezar, el estilo del botón debe incluir una propiedadborderque, de forma predeterminada, use un color transparente. Al proporcionar dicha propiedad, nos aseguramos de que los bordes del botón, al pasar el mouse sobre él, no se vuelvan a dibujar.

.c-button {
    border: 2px solid transparent;
    /*   */
}

.c-button:hover {
    background: transparent;
    color: #222;
    border-color: #4676d7;
}

Gracias a este enfoque, tenemos a nuestra disposición un botón alrededor del cual, al pasar el mouse sobre él, se muestran sus bordes. En este caso, el fondo del botón se vuelve transparente.

Botones de degradado


Cuando estaba trabajando en un artículo sobre elementos de posicionamiento, necesitaba un botón con relleno de degradado.

Necesitaba algo similar a la siguiente figura.


Botón de

degradado y su variante con un trazo Hay dos opciones para un botón: un botón de degradado y un botón con un trazo. Para lograr esa apariencia del botón, necesitaba que el botón de base (degradado) tuviera un borde transparente. Este borde solo se mostrará para un botón con un trazo.

.c-button {
      display: inline-block;
      color: #fff;
      background: linear-gradient(to bottom, #00acee, #0072e0);
      font-size: 18px;
      font-weight: 500;
      padding: 12px 26px;
      border-radius: 100px;
      /*  ,          */
      border: 3px solid transparent;
      text-decoration: none;
}

.c-button--outline {
  background: transparent;
  color: var(--color-brand-primary);
  border-color: var(--color-brand-primary);
}

Aquí todo parece ser razonable, pero en el curso del trabajo me encontré con un problema extraño. Incluso intenté resolverlo pidiendo ayuda a los usuarios de Twitter. Este problema se presenta en la siguiente figura.


Un botón normal, un botón con un degradado (el borde es realmente transparente; se muestra solo con fines de color), un botón con bordes extraños

Ahora que hemos descubierto cómo se ve un botón de degradado con un borde transparente, déjenme decirles las razones de las rarezas anteriores .

Cada elemento tiene una propiedadbackground-originque define el área de posicionamiento del fondo de pantalla, que se establece en el valor predeterminadopadding-box. Con este enfoque, se selecciona el tamaño del gradiente para que coincida con el tamaño del elemento, teniendo en cuenta el grosor del borde.

Intenté agregar un borde ancho al botón para observar lo que sucede. Observe cómo se repite el gradiente y que su tamaño coincide con la propiedad delpaddingbotón.


Botón con bordes anchos y degradado.

Para resolver este problema, el área de posicionamiento de la imagen de fondo debe establecerse utilizando el estilobackground-origin: border-box;, cambiando el valor predeterminadopadding-boxaborder-box:

.c-button {
      /*   */
      background-origin: border-box;
}

Ahora , si quieres experimentar, un ejemplo en CodePen.

¿Cuál es mejor: altura o relleno?


Cada botón tiene una altura. Puede controlar la altura de un botón configurando explícitamente su propiedad heighto configurando una propiedad paddingpara los lados superior e inferior del botón. Tenga en cuenta que los problemas que discutiremos a continuación son típicos principalmente para los elementos <a>.

▍ Altura fija


Supongamos que tenemos un botón con el siguiente estilo:

.c-button {
    /*   */
    min-width: 120px;
    height: 45px;
}

Con este enfoque, el texto no está centrado. Todo se parece al de abajo.


Botón, cuyo texto no está alineado en el centro

Para arreglar esto y alinear el texto, puede usar la propiedadpaddingo - la propiedadline-height. Al establecerloline-heighten un valor igual o cercano a la altura del botón, podemos alinear el texto en el centro.

.c-button {
    /*   */
    min-width: 120px;
    height: 45px;
    line-height: 45px;
}

Pero este método tiene desventajas:

  • No se garantiza que el texto del botón siempre esté correctamente centrado. Si cambia la fuente, su alineación puede romperse.
  • Al aumentar el valor especificado por la propiedad font-size, debe seleccionar un nuevo valor para la propiedad line-height.
  • La propiedad line-height puede funcionar de manera diferente para los textos que se muestran en diferentes idiomas. Esto es cierto para sitios multilingües.
  • Si hay un botón con dos líneas de texto, este método no es adecuado para alinear el contenido del botón.

▍ Sangría vertical


Si establece los mismos valores para las propiedades padding-topy padding-bottom, espere que el contenido del botón esté centrado. Como es? De hecho, depende de la situación específica.

Hay fuentes que se centran muy bien. Y hay quienes se comportan de manera diferente. A veces, para lograr el objetivo, uno de los valores de la sangría vertical debe modificarse ligeramente. Echa un vistazo al siguiente botón.


Intentando centrar el texto del botón

Aquí está el código CSS para diseñar este botón:

.c-button {
    /*   */
    min-width: 120px;
    padding: 16px 14px;
}

En este caso, el contenido del botón parece ligeramente sesgado. El valor de la sangría superior debe reducirse ligeramente:

.c-button {
    /*   */
    min-width: 120px;
    padding: 14px 14px 16px 14px; /* ,  , ,   */
}

Ajustar el contenido del botón en una etiqueta <span>


Durante los experimentos, descubrí que la alineación del texto de los botones de Adobe está un poco derribada. Así es como se ve.


Centrado un poco derribado.

Examiné estos botones y noté un patrón interesante. El contenido está envuelto en un elemento que<span>indica una altura fija para el botón.

<button class="c-button-adobe">
    <span>Save Changes</span>
</button>

Para un <button>elemento <span>, el elemento , por defecto, está centrado. Cuando la altura cambia, el contenido se centra automáticamente, sin la necesidad de una propiedad paddingu otra cosa. Aquí hay una demostración animada de este comportamiento.


Cambiar la altura de un botón y centrar automáticamente su contenido

Verdadero, si estamos hablando de un enlace que parece un botón, entonces el elemento<span>debe estar centrado. Para tener en cuenta esta característica, se puede utilizar el método de organización de elementosflexbox.

.c-button {
    /*   */
    display: inline-flex; *To keep the button inline, and flex container at the same time*
    align-items: center;
    justify-content: center;
}

Eso es todo. Quiero señalar que este artículo me ayudó al escribir esta sección .

Botones dentro de contenedores flexbox o grid


Aquí puede tener una pregunta sobre qué botones tienen que ver con los diseños de flex y grid. Déjame aclarar esta pregunta.

Trabajé en una sección de un proyecto. Necesitaba centrar verticalmente su contenido. Entonces utilicé el diseño flexible:

.c-hero {
    display: flex;
    flex-direction: column;
    justify-content: center;
}

Lo que hice fue un poco sorprendente.


Resultado del uso del diseño flexible

De manera predeterminada, cada elemento flexible se estira dentro del ancho del elemento principal. Esto es exactamente lo que sucedió con el botón que se muestra en la figura anterior. Para evitar este problema, debe configurar la propiedadalign-self:

.c-button {
    /*   */
    align-self: flex-start;
}

Así es como se verá el botón después de eso.


Un botón se ve mucho mejor.

Otro problema común ocurre cuando un botón se coloca en un contenedor flexible, en el que, de forma predeterminada, se establece una propiedadflex-direction: row. La altura del botón se ajustará a la altura del elemento principal. Para solucionar este problema, debe usar laalign-selfpropiedaddel botóno la propiedad del contenedor flexiblealign-items.


Botón estirado en altura

Aquí está el CSS:

.c-button {
    align-self: center;
}

Al establecer la alineación del botón con respecto al centro del contenedor, resolvemos el problema. Así es como se verá el mismo ejemplo ahora.


Resolviendo el problema de un botón estirado

Usando unidades em


La unidad de medida emse puede utilizar para configurar correctamente los tamaños de los botones. Esta unidad de medida es muy útil en tal situación. La unidad emes igual al font-sizeelemento ( pxo rem). Eche un vistazo al siguiente ejemplo:

.element {
    font-size: 16px;
    padding: 0.5em;
}

En este caso, el valor del relleno es igual 16 * 0.5 px.

Suponga que el proyecto usa botones de tres tamaños: regular, mediano y grande. Cuando especificar valores padding, width, height, marginunidades usadas de medición em, que le permite crear un botón, las dimensiones de las cuales es muy fácil de cambiar. Así es como se ve.


Botones de diferentes tamaños

Pero aquí están los fragmentos de código CSS que usa la unidad de medidaem:

.c-button {
  /*   */
  font-size: 1rem;
  min-width: 6.25em;
  border-radius: 0.3125em;
  padding: 0.625em 1em;
}

.c-button svg {
  width: 1.25em;
  height: 1.25em;
  margin-right: 0.25em;
}

Para botones de diferentes tipos, debe crear clases que especifiquen diferentes tamaños de fuente:

.c-button--md {
  font-size: 22px;
}

.c-button--lg {
  font-size: 30px;
}

Aquí hay un ejemplo del uso de botones similares en CodePen

Aquí está mi artículo sobre este tema. Te recomiendo que lo leas

Animacion y Transiciones


Para que al usuario le resulte más agradable trabajar con la página, es importante pensar en utilizar una transición al pasar el mouse sobre el botón. La forma más fácil de hacerlo es organizando un cambio de color de fondo. Aquí hay un ejemplo en CodePen donde puede ver la implementación de esta idea.

Resumen


Me complació mucho trabajar en este material. Me llevó más de un año escribirlo. Estoy feliz de que finalmente se publique. Espero que encuentres algo aquí que te sea útil.

¡Queridos lectores! ¿Conoces formas útiles de trabajar con botones que están más allá del alcance de este artículo?


All Articles