Como aplicar a estilização de flex item para a tag legend de forma acessível

Olá, dev!! 👋

Você já se pegou com dificuldade em aplicar estilização de flex item à uma tag legend?

Se a resposta for sim, você provavelmente deve ter utilizado uma abordagem que limitou a acessibibilidade do seu formulário.

Se a respota for não, que sorte ein! haha

Durante este post eu irei mencionar técnicas para você deixar seus formulários mais acessíveis aquando utilizando da tag legend juntamente com o fieldset.

Estilização

.flex {
  display: flex;
  flex-direction: column;
  gap: 2rem;
}

Problema

Como aplicar a estilização de flex item para a tag legend?

<fieldset class="flex ...">
  <legend>Informações do evento</legend>
  
  <!-- conteúdo -->
</fieldset>

👎 Soluções ao problema (não recomendado)

<fieldset>
  <div class="flex ...">
    <legend>Informações do evento</legend>

    <!-- conteúdo -->
  </div>
</fieldset>
<fieldset class="flex ...">
  <div>
    <legend>Informações do evento</legend>
  </div>

  <!-- conteúdo -->
</fieldset>

As seguintes soluções são, de fato, soluções válidas, porém inacessíveis.

Ambas as maneiras quebram a relação entre o fieldset e o legend, tornando o formulário menos acessível e de difícl leitura para screen readers.


👍 Soluções mais acessíveis (recomendado)

De acordo com Steve Faulkner, chefe do departamento de acessibilidade na TPGi, membro da W3C Web Platforms Working Group e da W3C ARIA Working Group, existem atualmente abordagens mais acessíveis para a solução desse "bug".

A seguintes estratégias são:

1. Utilizando margin-bottom

<fieldset class="flex ...">
  <legend style="margin-bottom: 2rem;">Informações do evento</legend>
  
  <!-- conteúdo -->
</fieldset>

2. Ocultando legend

<fieldset class="flex ...">
  <legend>Informações do evento</legend> <!-- Será oculta -->
  <h2 aria-hidden="true">Informações do evento</h2>

  <!-- conteúdo -->
</fieldset>
legend:not(:focus):not(:active) {
  position: absolute;
  overflow: hidden;
  clip: rect(0 0 0 0);
  clip-path: inset(50%);
  width: 1px;
  height: 1px;
  white-space: nowrap;
}

Obs: A tag h2 pode ser substituída por alguma outra tag desde que não seja legend

3. Utilizando aria-labelledby

<fieldset class="flex ..." aria-labelledby="fieldset-label">
  <h2 id="fieldset-label">Informações do evento</h2>

  <!-- conteúdo -->
</fieldset>

Obs: A tag h2 pode ser substituída por alguma outra tag desde que não seja legend


Espero que depois desse post vocês possam aplicar essas técnicas na prática e tornarem os seus formulários mais acessíveis e user-friendly para usuários portadores de deficiências visuais.

Baseado em: https://www.tpgi.com/fields

Portfolio: https://miguelrocha.dev/ Github: @mmroch4 https://github.com/mmroch4 LinkedIn: https://www.linkedin.com/in/miguelmartinsrocha/