Propriedade align-self: Alinhando um item individualmente

Sobrescreva o alinhamento de um item específico no eixo cruzado.

Você já aprendeu que a propriedade align-items (aplicada ao Contêiner Flex) alinha todos os Itens Flex ao longo do eixo cruzado. Mas e se você quiser que apenas um item específico tenha um alinhamento diferente dos outros? É para isso que serve a propriedade align-self.

A propriedade align-self é aplicada diretamente a um Item Flex individual e permite que ele sobrescreva o valor de align-items definido no seu Contêiner Flex.

Pense no align-self como um "pedido especial" de um músico (flex-item) para o diretor da orquestra (flex-container). O diretor pode ter dito para todos os músicos ficarem em uma certa posição (align-items), mas um músico específico pode pedir para se posicionar de forma diferente (align-self), e seu pedido será atendido.

Como funciona align-self

  • Aplicado ao Item Flex: align-self é uma propriedade de Item Flex.
  • Sobrescreve align-items: O valor de align-self em um item individual tem prioridade sobre o valor de align-items definido no Contêiner Flex.
  • Valores: align-self aceita os mesmos valores que align-items:
    1. auto (padrão): O item herda o valor de align-items do seu pai. Se o pai não tiver align-items definido, o padrão é stretch.
    2. stretch: O item é "esticado" para preencher todo o espaço disponível ao longo do eixo cruzado.
    3. flex-start: O item é agrupado no início do eixo cruzado.
    4. flex-end: O item é agrupado no fim do eixo cruzado.
    5. center: O item é agrupado no centro do eixo cruzado.
    6. baseline: O item é alinhado com base em sua linha de base de texto.

Exemplo Prático:

<!DOCTYPE html>
<html lang="pt-BR">
<head>
  <meta charset="UTF-8">
  <title>Propriedade Align-self</title>
  <style>
    body {
      font-family: Arial, sans-serif;
      margin: 20px;
      background-color: #f4f4f4;
    }

    .flex-container {
      display: flex;
      background-color: #e0e0e0;
      border: 2px solid #333;
      padding: 10px;
      height: 200px; /* Altura fixa para o contêiner para ver o alinhamento vertical */
      margin-bottom: 20px;
      align-items: flex-start; /* align-items padrão para o contêiner */
    }

    .flex-item {
      background-color: lightblue;
      border: 1px solid blue;
      padding: 15px;
      margin: 5px;
      color: #333;
      font-weight: bold;
      text-align: center;
      width: 80px; /* Largura fixa para os itens */
      height: 60px; /* Altura fixa para os itens */
      line-height: 60px; /* Para centralizar texto verticalmente */
    }

    /* --- Exemplos de align-self --- */

    .self-stretch {
      align-self: stretch; /* Sobrescreve align-items: flex-start */
      height: auto; /* Para permitir o stretch */
      background-color: lightcoral;
    }

    .self-center {
      align-self: center; /* Sobrescreve align-items: flex-start */
      background-color: lightgreen;
    }

    .self-end {
      align-self: flex-end; /* Sobrescreve align-items: flex-start */
      background-color: lightgoldenrodyellow;
    }

    .self-baseline {
      align-self: baseline; /* Sobrescreve align-items: flex-start */
      background-color: lightsalmon;
      font-size: 1.5em; /* Para demonstrar o baseline */
      line-height: 1.2;
    }

    /* Exemplo com flex-direction: column */
    .container-column {
      flex-direction: column;
      width: 300px; /* Largura fixa para o contêiner */
      height: 300px;
      align-items: flex-start; /* align-items padrão para o contêiner */
    }
    .container-column .flex-item {
      height: 80px;
      width: 60px;
      line-height: 80px;
    }
    .container-column .self-center {
      align-self: center; /* Centraliza horizontalmente */
    }
  </style>
</head>
<body>
  <h1>Propriedade `align-self`</h1>

  <h2>Contêiner com `align-items: flex-start`</h2>
  <div class="flex-container">
    <div class="flex-item">Item Padrão</div>
    <div class="flex-item self-stretch">Item Stretch</div>
    <div class="flex-item self-center">Item Center</div>
    <div class="flex-item self-end">Item End</div>
    <div class="flex-item self-baseline">Item Baseline</div>
  </div>
  <p>Observe como cada item com `align-self` sobrescreve o `align-items: flex-start` do contêiner.</p>

  <h2>Contêiner com `flex-direction: column` e `align-items: flex-start`</h2>
  <div class="flex-container container-column">
    <div class="flex-item">Item Padrão</div>
    <div class="flex-item self-center">Item Center</div>
    <div class="flex-item">Outro Item</div>
  </div>
  <p>Aqui, `align-self: center` centraliza o item horizontalmente, pois o eixo cruzado é horizontal.</p>
</body>
</html>

Resultado:

  • Você verá que, apesar do Contêiner Flex ter align-items: flex-start;, os itens com align-self aplicado se alinharão de forma diferente, de acordo com o valor de align-self.
  • Observe como align-self: stretch; faz o item preencher a altura (ou largura, se flex-direction: column;) disponível.
  • Veja como align-self: baseline; alinha o texto do item, não a caixa.

Boas Práticas:

  • Sobrescrita Individual: Use align-self quando você precisa de um alinhamento específico para um ou alguns itens, sem afetar o comportamento geral definido por align-items no contêiner.
  • Consistência: Evite usar align-self em todos os itens se o objetivo é um alinhamento uniforme. Nesses casos, é melhor usar align-items no contêiner.
  • Eixo Cruzado: Lembre-se que align-self (assim como align-items) opera no eixo cruzado. Se flex-direction: row;, ele alinha verticalmente. Se flex-direction: column;, ele alinha horizontalmente.
  • auto: O valor auto é útil se você quiser que um item siga o align-items do pai, mas em algum momento você pode querer sobrescrevê-lo.

Dominar align-self adiciona uma camada extra de controle ao seu arsenal Flexbox, permitindo ajustes finos no alinhamento de itens individuais para layouts mais complexos e personalizados.