Estilo do elemento bom botão antigo

Um botão é um desses elementos mais frequentemente usados ​​em páginas da web. A tag <button></button>pode ser usada para iniciar um processo como saída de dados, abrir uma janela modal, enviar um formulário e assim por diante. No material, cuja tradução publicamos, falaremos sobre os meandros do estilo do elemento buttone como projetar os botões para que funcionem bem em qualquer navegador. Além disso, os estilos de botão mais usados ​​serão abordados aqui. Falaremos aqui sobre algumas das dificuldades que surgem ao trabalhar com botões.



Estilos aplicados aos botões padrão


Talvez falar sobre "estilos padrão" pareça para alguém uma discussão sobre algumas coisas elementares, mas, de fato, falar sobre isso é bastante interessante. Aqui está a folha de estilo padrão para botões do agente do usuário do 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;
}

E aqui está a aparência de um botão padrão quando a saída não altera os estilos padrão.


Um botão simples ao qual os estilos padrão são aplicados.Primeiro

, redefina a propriedadeappearance. É usado para criar estilos específicos para uma plataforma específica. A aparência do botão com essa abordagem é baseada nos estilos usados ​​no sistema operacional do usuário.

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

Agora, depois de redefinir a propriedade appearance, veja como os botões ficam em diferentes navegadores.


A propriedade de aparência desses botões é definida como nenhuma.Em

seguida, antes de avançarmos para o estilo, precisamos redefinir mais algumas propriedades. Este -border,border-radius,background.

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


Botão após redefinir propriedades

Agora que redefinimos os estilos de botão padrão, é hora de seguir em frente. Ou seja, quero falar sobre como estilizar botões com base nos requisitos para seu design.

Estilo de botões regulares


Vamos começar com um exemplo básico, falando sobre o estilo de botões regulares que exibem apenas texto. A figura a seguir mostra a "anatomia" de um botão regular.


Cor do texto (Cor do texto), tamanho da fonte (Tamanho da fonte), plano de fundo (plano de fundo), cantos arredondados (redondeza), recuo (preenchimento)

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

Tendo o código CSS acima, podemos obter um botão semelhante ao mostrado na figura anterior. Depois que o estilo básico do botão estiver definido, você precisará cuidar da aparência do botão em vários estados.


Estado normal do botão (Normal), obtendo o foco (Foco), passando o mouse sobre o botão (Passar o mouse), desativando o botão (Desativado)

AppliedEstilos aplicados aos botões quando você passa o mouse sobre eles e quando eles obtêm o foco


Para indicar ao usuário que o ponteiro do mouse está sobre o botão, é importante equipar o botão com um estilo projetado para este evento. O mesmo se aplica à alteração da aparência de um botão quando ele recebe foco em uma situação em que um usuário que usa um teclado trabalha com uma página.

Este material indica que é importante adicionar estilos aplicados ao botão quando você passa o mouse sobre ele ( hover) e quando recebe foco ( focus).

Quando um estilo é hoveradicionado antes de um estilo focus, todos os estilos funcionam corretamente. O problema aparece quando o estilo é focusadicionado antes do estilo hover. Quando um elemento é clicado com o mouse, o estilo focusnão se manifesta de forma alguma; apenas a representação do botão determinada pelo estilo é visível hover.


Bem, se primeiro vier o estilo de foco, e depois o estilo de foco,

veja a descrição correta do estilo:

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

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

▍ Largura mínima do botão


Para que o botão tenha uma boa aparência, ele deve ter uma certa largura. É importante pensar sobre isso com antecedência e levar em consideração os rótulos longos e curtos que podem aparecer nos botões. Devido à propriedade, min-widthvocê pode definir a largura mínima do botão. Aqui está o meu artigo em que essa e outras propriedades semelhantes são discutidas em detalhes.

Veja a figura a seguir. Lá você pode ver vários botões contendo etiquetas de diferentes comprimentos em inglês e árabe. Se você não definir a largura mínima do botão, o botão, quando a inscrição for curta, será muito pequeno. É melhor para não permitir isso e usar a propriedade min-width.


Vale a pena definir a propriedade do botão de largura mínima

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

Ent Recuo


Uma ideia pode parecer atraente, pela qual os botões não recebem recuo horizontal. Afinal, os botões têm uma certa largura, o que significa que haverá espaço suficiente entre as bordas dos botões e as inscrições contidas neles. Assim? Não, não assim. A implementação dessa idéia pode ter consequências negativas nos casos em que a inscrição no botão muda.

Veja a figura a seguir.


Recomenda-se atribuir recuos internos aos botões.Tenha em

atenção que, se o recuo não estiver atribuído ao botão, a inscrição localizada nele poderá se aproximar muito das bordas. Mesmo se o botão tiver uma propriedademin-width. Na parte inferior da imagem, a propriedadepaddinge a propriedade são usadasmin-width. Isso dá mais confiança de que o botão ficará bem em uma situação em que o comprimento da inscrição exibida nele não seja conhecido antecipadamente.

FamilyFontes usadas para inscrições localizadas nos botões


Os elementos do formulário, por padrão, não herdam a família de fontes atribuída a <html>ou <body>. É interessante notar que escrevi 70% deste artigo e percebi que, primeiro, não alterei a fonte do botão usado para fins de demonstração e, em segundo lugar, não escrevi nada sobre isso.

Para resolver este problema, a propriedade font-familydeve ser definida como inherit.

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

▍ Botões de estilo desativados


Para indicar ao usuário que o botão está desativado, você pode adicionar um atributo a ele disablede estilizar o botão usando CSS.

Aqui está o HTML que descreve o botão desativado:

<button disabled></button>

Aqui está o código CSS para estilizar esse botão:

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

Quando o botão está desativado, ele não consegue obter o foco do teclado e é removido da árvore de acessibilidade dos elementos da página.

ViewVisão externa do cursor do mouse quando você passa o mouse sobre o botão


O ponteiro do mouse padrão sobre o botão se parece com uma seta. Gosto desta resposta no StackOverflow: “Os botões são um controle de área de trabalho tradicional. Este é um ambiente em que um ponteiro de mão nunca foi usado até o advento da era da Internet. Quando o mesmo controle começou a ser usado nas páginas da web, os desenvolvedores simplesmente tentaram fazer com que os botões parecessem os mesmos dos aplicativos de desktop ”.

Para substituir o comportamento usual do ponteiro, é recomendável alterar a seta do cursor padrão para um cursor em forma de mão.


Cursor de seta padrão e cursor de mão aprimorado.

Agora que discutimos as questões básicas do estilo dos botões, aqui está o código CSS completo que inclui tudo o que mencionamos acima:

.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;
}

Nas seções a seguir, falaremos sobre os diferentes estilos e tipos de botões que você pode usar em seus projetos.

Botões de ícone


Às vezes, você precisa de um botão para ter um determinado ícone. Isso pode ser necessário para destacar o botão ou para melhor informar o usuário sobre a função do botão. É importante que os botões do ícone estejam acessíveis aos usuários com deficiência.


Exemplos de

botões de ícones Na imagem anterior, existem botões de ícones. O código abaixo mostra o atributo adicionado ao íconearia-hidden, o que permite removê-lo da árvore de acessibilidade. Também adicionei um atributofocusable="false"para impedir que o ícone se concentre no IE.

Observe que usei o estilovertical-align: middlepara alinhar verticalmente o conteúdo do ícone e do botão.

Aqui está o código HTML do botão em questão:

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

Aqui está o código do estilo:

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

O que acabamos de examinar pode funcionar até decidirmos ocultar o texto do botão e torná-lo o botão no qual apenas o ícone está localizado. Como fazer isso? Primeiro, você precisa agrupar o texto, por exemplo, em um elemento span. Em seguida, você pode melhorar ainda mais a aparência do botão. Aqui está a descrição HTML do botão:

<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>

Pode parecer que agora basta ocultar o elemento spane o trabalho será feito:

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

Embora com essa abordagem, o texto desapareça e o ícone permaneça, isso é muito ruim em termos de acessibilidade do conteúdo. O botão não está mais "visível" para os leitores de tela. Por exemplo, o VoiceOver no macOS relata que esse botão é simplesmente um "botão", sem detalhes sobre ele. Existem várias soluções para esse problema.

SingUsando ícones SVG


Eu prefiro usar ícones SVG. Recomenda-se a recolher todas as descrições em SVG de elementos gráficos em um arquivo e incluir cada ícone na tag <svg>usando o elemento <use>. Aqui está um exemplo:

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

Aqui está o código para o ícone SVG, cuja descrição é armazenada em um arquivo icons.svge possui um identificador #facebook. Essa abordagem reduz a duplicação de código.

▍Botão de tamanho com ícone


Como o texto do botão não está mais visível e a propriedade CSS está definida para o botão min-width, a largura do botão não corresponderá ao tamanho do ícone. Para levar esse recurso em consideração, é melhor definir explicitamente a largura do botão do ícone.


Um botão que possui a propriedade CSS de largura mínima definida e um botão que não possui essa propriedade definida

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

Text Texto oculto visual


Um elemento, usando a classe popular .sr-only, pode ser oculto visualmente removendo-o da tela, mas deixando-o acessível para os leitores de tela.

Aqui está o 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>

Aqui estão os 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;
}

▍ Defina o tamanho da fonte como 0


Se você definir a propriedade font-sizecomo um valor 0, o elemento spannão ocupará nenhum espaço na tela. Ou seja, ficará oculto.

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

Mas aqui estou inclinado a uma solução que envolva o uso de uma classe .sr-only. Do meu ponto de vista, parece mais lógico. O método de ocultar o texto definindo o tamanho da fonte como 0, parece-me, parece uma espécie de hack.

▍Uso do atributo ária-label


Se não houver elemento no botão <span>, deve haver uma maneira de passar sem ele. Uma dessas maneiras é usar um atributo aria-label. O atributo é atribuído ao próprio elemento <button>ou ao 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>

Se você quiser saber mais sobre os botões com ícones - dê uma olhada neste material.

Botões contendo várias linhas de texto


Em alguns casos, pode ser necessário que o botão contenha duas linhas de texto. Um exemplo desse botão é mostrado abaixo.


Botão que contém duas linhas de texto

Aqui está um botão para um formulário de inscrição que contém o texto principal e o auxiliar. Como fazer esse botão e, ao mesmo tempo, não esquecer sua acessibilidade para pessoas com deficiência? Aqui está o HTML relevante:

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

O leitor de tela "dublará" esse botão como "Assine nossa newsletter com mais de 240 mil inscritos". Quando o usuário ouve isso, pode confundi-lo, pois nada separará as duas linhas de texto exibidas no botão. Dê uma olhada na captura de tela da ferramenta Chrome para examinar a disponibilidade de itens.


Explorando a disponibilidade de elementos no Chrome

Para não confundir os usuários, prefiro ocultar a segunda linha de texto dos leitores de tela. Você pode fazer isso usando o atributoaria-hiddenno elemento correspondente<span>:

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

Se, por algum motivo, você não puder alterar a marcação HTML, existe outra maneira de adicionar texto adicional ao botão. Encontrei uma solução interessante para esse problema no site da Smashing Magazine. Consiste em colocar conteúdo usando pseudo-elementos. Com essa abordagem, os leitores de tela não verão nada supérfluo. Aqui está o CSS para esta solução:

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

Links (<a>) ou botões (<botão>)?


Quando usar links e quando - usando botões? Para começar, vamos falar sobre como eles diferem um do outro.

▍Links


A tag <a>é um hiperlink que permite acessar outra página do site ou uma seção específica da página visualizada pelo usuário. Junto com a tag <a>, você pode usar os quatro pseudo-: :hover, :focus, :activee :visited. Se considerarmos os links do ponto de vista da acessibilidade, devemos dizer que você pode interagir com eles usando a tecla Enterdo teclado. Os links são dublados e leitores de tela.

▍Botões


Um elemento <button type="button">por si só, sem conectar o código JavaScript a ele, não executa nenhuma ação. Você pode usar pseudo-classes com ele :hover, :focuse :active. Se falamos de acessibilidade, você pode interagir com o botão usando as teclas do teclado Entere . Os leitores de tela "leem" o conteúdo dos botões.

Se recordarmos o design, acontece que uma página da Web contém botões do mesmo estilo, diferindo em termos do código HTML usado para descrevê-los. Com isso em mente, o código CSS para denominar uma classe .c-buttondeve ser escrito para que possa ser usado para elementos <button>e elementos <a>. Considere o seguinte exemplo.


Usando links e botões

Observe que os “botões” na página têm o mesmo estilo. No entanto, o primeiro deles é, de fato, um elemento<a>, e o segundo é um elemento<button>. Isso significa que o botão não necessariamente se parece com um elemento em HTML<button>.

Existem duas adições ao estilo.c-button. Estas são as propriedadestext-decoration: none;etext-align: center;. Por padrão, o texto dos links está sublinhado, portanto, queremos mudar isso estilizando a classe usada. Além disso, é importante centralizar o conteúdo do botão nos casos em que um elemento HTML que não seja usado para descrever o botão<button>.

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

Element O elemento <button> não precisa se parecer com um botão


Gosto deste exemplo, no qual, levando em consideração os requisitos de acessibilidade do conteúdo, o painel “acordeão” é implementado. Inicialmente, supondo que o JavaScript não esteja disponível, o resultado da renderização da marcação é semelhante ao abaixo.


Materiais da página

quando o JavaScript não está disponível Aqui está o código HTML de um fragmento dessa marcação:

<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>

Se o JavaScript estiver disponível, a marcação acima descreverá elementos que podem ser recolhidos e expandidos. Isso é possível criando um botão e adicionando-o ao elemento <h2>.


Materiais da página em condições em que a funcionalidade JavaScript está disponível

Nesse caso, podemos dizer que usar o elemento<button>é a escolha certa, pois o botão resolve o problema de expandir e recolher blocos de texto.

▍Botão de inicialização


Suponha que tenhamos um documento. Precisamos descrever um link para fazer o download. Qual elemento deve ser usado para resolver este problema? Aqui um link virá em nosso auxílio! Se você adicionar um atributo ao link download, clicar nele iniciará o download dos materiais relevantes.


Link para baixar o documento, criado como um botão

Aqui está o código para este link:

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

Com essa abordagem, temos à disposição um link, estilizado como um botão, que faz seu trabalho usando apenas estruturas HTML semânticas.

Botões Curso



Um botão normal quando você passa o mouse sobre ele se torna um botão com um toque.

A figura anterior mostra um botão que se torna um botão com um toque quando você passa o mouse sobre ele. Qual método é melhor usado para implementar uma alteração semelhante na aparência de um botão? Para iniciantes, o estilo do botão deve incluir uma propriedadeborderque, por padrão, use uma cor transparente. Ao fornecer essa propriedade, garantimos que as bordas do botão, ao passar o mouse sobre ela, não sejam redesenhadas.

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

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

Graças a essa abordagem, temos à disposição um botão em torno do qual, quando você passa o mouse sobre ela, suas bordas são exibidas. Nesse caso, o fundo do botão fica transparente.

Botões Gradiente


Quando eu estava trabalhando em um artigo sobre elementos de posicionamento, precisava de um botão com preenchimento gradiente.

Eu precisava de algo semelhante à figura a seguir.


Botão de gradiente e sua variante com um toque.

Aqui estão duas opções para o botão - um botão de gradiente e um botão com um toque. Para obter essa aparência do botão, eu precisava do botão base (gradiente) para ter uma borda transparente. Essa borda será mostrada apenas para um botão com um toque.

.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);
}

Tudo parece razoável aqui, mas, no decorrer do trabalho, encontrei um problema estranho. Até tentei resolvê-lo pedindo ajuda aos usuários do Twitter. Este problema é apresentado na figura a seguir.


Um botão comum, um botão com gradiente (a borda é realmente transparente; é mostrado apenas para fins de cor), um botão com bordas estranhas

Agora que descobrimos como é um botão de gradiente com uma borda transparente, deixe-me falar sobre os motivos das esquisitices acima .

Cada elemento possui uma propriedadebackground-originque define a área de posicionamento do papel de parede, definida como o valor padrãopadding-box. Com essa abordagem, o tamanho do gradiente é selecionado para corresponder ao tamanho do elemento, levando em consideração a espessura da borda.

Tentei adicionar uma borda larga ao botão para observar o que acontece. Observe como o gradiente se repete e que seu tamanho corresponde à propriedade dopaddingbotão.


Botão com bordas largas e gradiente.Para

resolver esse problema, a área de posicionamento da imagem de plano de fundo deve ser definida usando o estilobackground-origin: border-box;, alterando o valor padrãopadding-boxparaborder-box:

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

Agora , se você quiser experimentar, um exemplo no CodePen.

Qual é o melhor - altura ou estofamento?


Cada botão tem uma altura. Você pode controlar a altura de um botão, definindo sua propriedade explicitamente heightou definindo uma propriedade paddingpara os lados superior e inferior do botão. Observe que os problemas que discutiremos abaixo são típicos principalmente para elementos <a>.

▍ altura fixa


Suponha que tenhamos um botão com o seguinte estilo:

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

Com essa abordagem, o texto não está centralizado. Tudo se parece com o abaixo.


Botão, cujo texto não está alinhado no centro

Para corrigir isso e alinhar o texto, você pode usar a propriedadepaddingou a propriedadeline-height. Ao definirline-heightum valor igual ou próximo à altura do botão, podemos alinhar o texto no centro.

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

Mas este método tem desvantagens:

  • Não é garantido que o texto do botão esteja sempre centralizado corretamente. Se você alterar a fonte, seu alinhamento poderá ser interrompido.
  • Ao aumentar o valor especificado pela propriedade font-size, você precisa selecionar um novo valor para a propriedade line-height.
  • A propriedade line-height pode funcionar de maneira diferente para textos exibidos em idiomas diferentes. Isso vale para sites multilíngues.
  • Se houver um botão com duas linhas de texto, esse método não é adequado para alinhar o conteúdo do botão.

▍ Recuo vertical


Se você definir os mesmos valores para as propriedades padding-tope padding-bottom, espere que o conteúdo do botão seja centralizado. Do jeito que é? De fato, depende da situação específica.

Existem fontes que centralizam muito bem. E há quem se comporte de maneira diferente. Às vezes, para atingir a meta, um dos valores da indentação vertical precisa ser ligeiramente alterado. Dê uma olhada no próximo botão.


Tentando centralizar o texto do botão

Aqui está o código CSS para estilizar este botão:

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

Nesse caso, o conteúdo do botão parece um pouco tendencioso. O valor do travessão superior deve ser ligeiramente reduzido:

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

Quebrando o conteúdo do botão em uma tag <span>


Durante os experimentos, descobri que o alinhamento do texto dos botões da Adobe está um pouco danificado. Aqui está como fica.


Centrando um pouco,

eu examinei esses botões e notei um padrão interessante. O conteúdo é agrupado em um elemento que<span>indica uma altura fixa para o botão.

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

Para um <button>elemento <span>, o elemento , por padrão, é centralizado. Quando a altura muda, o conteúdo é centralizado automaticamente, sem a necessidade de uma propriedade paddingou qualquer outra coisa. Aqui está uma demonstração animada desse comportamento.


Alterando a altura de um botão e centralizando automaticamente seu conteúdo

Verdadeiro, se estamos falando de um link que se parece com um botão, o elemento<span>precisa estar centralizado. Para levar esse recurso em consideração, pode-se usar o método de organizar elementosflexbox.

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

Isso é tudo. Quero observar que este artigo me ajudou ao escrever esta seção .

Botões dentro de contêineres flexbox ou de grade


Aqui você pode ter uma pergunta sobre o que os botões têm a ver com os layouts flex e grid. Deixe-me esclarecer esta questão.

Eu trabalhei em uma seção de um projeto. Eu precisava centralizar verticalmente seu conteúdo. Então, eu usei o layout flexível:

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

O que eu fiz foi um pouco surpreendente.


Resultado do uso do layout flexível

Por padrão, cada elemento flexível é esticado dentro da largura do elemento pai. Foi exatamente o que aconteceu com o botão mostrado na figura anterior. Para evitar esse problema, você precisa configurar a propriedadealign-self:

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

É assim que o botão ficará depois disso.


O botão parece muito

melhor.Outro problema comum ocorre quando o botão é colocado em um contêiner flexível, no qual, por padrão, a propriedade está definidaflex-direction: row. A altura do botão será ajustada para a altura do elemento pai. Para corrigir esse problema, você precisa usar aalign-selfpropriedadebuttonou a propriedade flex containeralign-items.


Botão esticado em altura

Aqui está o CSS:

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

Ao definir o alinhamento do botão em relação ao centro do contêiner, resolvemos o problema. É assim que o mesmo exemplo será exibido agora.


Resolvendo o problema de um botão esticado

Usando unidades em


A unidade de medida empode ser usada para configurar corretamente os tamanhos dos botões. Essa unidade de medida é muito útil em tal situação. A unidade emé igual ao font-sizeelemento ( pxou rem). Veja o seguinte exemplo:

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

Nesse caso, o valor do preenchimento é igual 16 * 0.5 px.

Suponha que o projeto use botões de três tamanhos: regular, médio e grande. Quando especificar valores padding, width, height, marginunidades usadas de medição em, ele permite que você criar um botão, as dimensões de que é muito fácil de mudança. Aqui está como fica.


Botões de tamanhos diferentes

Mas aqui estão os fragmentos de código CSS que usam a unidade 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 botões de tipos diferentes, você precisa criar classes que especificam tamanhos de fonte diferentes:

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

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

Aqui está um exemplo do uso de botões semelhantes no CodePen

Aqui está o meu artigo sobre este tópico. Eu recomendo que você leia

Animação e Transições


Para tornar mais agradável para o usuário trabalhar com a página, é importante pensar em usar uma transição ao passar o mouse sobre o botão. A maneira mais fácil de fazer isso é organizando uma alteração na cor de fundo. Aqui está um exemplo no CodePen, onde você pode ver a implementação dessa ideia.

Sumário


Fiquei muito satisfeito por trabalhar neste material. Levei mais de um ano para escrevê-lo. Fico feliz que seja finalmente publicado. Espero que você encontre aqui algo que seja útil para você.

Queridos leitores! Você conhece alguma maneira útil de trabalhar com botões que estão fora do escopo deste artigo?


All Articles