Addaw, ir a inicio Donar

Técnica CSS WCAG 2.2

C38Hacer que etiquetas y campos de formulario se apilen cuando falta espacio

Nombre oficial en el W3C: Usar width, max-width y flexbox de CSS para ajustar las etiquetas y los campos de entrada

En pocas palabras

En pantallas anchas, la etiqueta de un campo suele ir a la izquierda y el campo a la derecha. Cuando la pantalla se estrecha o se amplía, deben pasar a ponerse uno debajo de otro. Se consigue con Flexbox y con anchos flexibles en CSS.

Por qué es importante

Si la etiqueta y el campo tienen anchos fijos, al ampliar al 400 % no caben juntos. El campo se sale de la pantalla y hay que desplazarse de lado para rellenarlo.

En un formulario de cita previa, la persona con baja visión puede no ver qué campo está escribiendo o pasar por alto alguno.

Cómo se hace

  1. Envuelva cada pareja de etiqueta y campo en un contenedor con display: flex y flex-wrap: wrap.
  2. Dé a la etiqueta y al campo un ancho base flexible, por ejemplo flex: 1 1 12em.
  3. Limite el campo con max-width: 100% para que nunca sea más ancho que la pantalla.
  4. Evite anchos fijos en píxeles en input, select y textarea.
  5. Mantenga la etiqueta antes del campo en el HTML, para que el orden de lectura no cambie.

Cómo comprobarlo

  1. Abra el formulario en una ventana de 1280 píxeles de ancho y amplíe al 400 %.
  2. Compruebe que cada etiqueta queda encima de su campo cuando no caben juntos.
  3. Confirme que ningún campo se sale de la pantalla y que no aparece barra horizontal.
  4. Rellene el formulario con el teclado para verificar que todo sigue siendo usable.

Ejemplo

Campo de un formulario de cita previa que se apila bajo su etiqueta en pantallas estrechas.

<style>
  .fila { display: flex; flex-wrap: wrap; gap: .5em; }
  .fila label { flex: 1 1 10em; }
  .fila input { flex: 2 1 14em; max-width: 100%; }
</style>
<div class="fila">
  <label for="dni">DNI o NIE</label>
  <input id="dni" type="text" autocomplete="off">
</div>
Ver el texto completo del W3C (traducción al español)

Esta es una traducción no oficial al español de la técnica C38 de Techniques for WCAG 2.2, del W3C. Puede contener errores. El único documento oficial y normativo es la versión original en inglés, publicada en el sitio web del W3C.

Aplicabilidad

CSS y HTML.

Descripción

El objetivo de esta técnica es poder presentar etiquetas y campos de entrada sin introducir una barra de desplazamiento horizontal a una anchura equivalente a 320 píxeles CSS en el caso de contenido pensado para desplazarse verticalmente. Cuando el espacio de la ventana gráfica es limitado y la etiqueta y el campo de entrada no pueden situarse uno junto al otro en horizontal, pasan a alinearse en vertical. Para ello se utilizan las propiedades CSS width, max-width y flexbox, que se adaptan al espacio disponible.

Los diseños adaptables pueden añadir o quitar columnas o bloques de la disposición, y cada parte de la disposición puede ser más ancha o más estrecha en distintos puntos. Esta técnica garantiza que las etiquetas y los campos de entrada no se salgan de su área de disposición, incluso en diseños de una sola columna, donde provocarían desplazamiento horizontal.

El planteamiento básico para ajustar las etiquetas y los campos de entrada consiste en:

  1. Definir el tamaño de las regiones de la disposición mediante propiedades de flexbox y consultas de medios (media queries) para tamaños concretos de la ventana gráfica, de modo que se agranden, se reduzcan o se ajusten en varias líneas según el espacio disponible y respondan a los niveles de zoom;
  2. Colocar las regiones de la disposición dentro del contenedor flexbox como una fila de elementos flexbox adyacentes, que pueden pasar a nuevas filas cuando sea necesario, de forma muy parecida a como se ajustan las palabras de un párrafo.
  3. Definir las propiedades width y max-width de las etiquetas y los campos de entrada, de modo que se agranden o se reduzcan en el espacio disponible y respondan a los niveles de zoom.

Todas las etiquetas y campos de entrada requieren cierto cuidado en el diseño: hay que asegurarse de que el tamaño original se ajusta al mayor de los espacios disponibles para obtener buenos resultados visuales en una amplia gama de tamaños de ventana gráfica y niveles de zoom. Para obtener ayuda sobre flexbox, consulte el artículo de MDN sobre Flexbox.

Ejemplos

Ajustar etiquetas, campos de entrada y disposición flexbox con HTML y CSS.

El siguiente ejemplo utiliza HTML y CSS para ajustar etiquetas y campos de entrada dentro de contenedores de distintas anchuras, incluida la ventana gráfica. Las regiones de la disposición cambian de tamaño cuando se modifica la ventana gráfica. A continuación, las etiquetas y los campos de entrada ajustan su tamaño para caber dentro de los contenedores de las regiones de la disposición.

El nivel de zoom puede aumentarse hasta el 400 % sin que haga falta desplazamiento horizontal. Este ejemplo concreto utiliza un tamaño en porcentaje para width y max-width en las etiquetas y los campos de entrada. Se aplica max-width para corregir, de forma compatible con todos los navegadores, que los elementos se salgan de la rejilla, ya que los elementos reemplazados, como select, tienen un dimensionado intrínseco.

<style>
/* Fitting Inputs Styling */
.form-group {
  display: flex;
  flex-flow: row wrap;
  margin: 0 -1rem 1rem -1rem;
}
[class*="form-col"] {
  flex: 0 1 100%;
  padding: 0 1rem;
}
@media (min-width: 576px) {
  .form-col-4 {
    flex: 0 0 33.33333%;
    max-width: 33.33333%;
  }
  .form-col-8 {
    flex: 0 0 66.66667%;
    max-width: 66.66667%;
  }
  .offset-form-col-4 {
    margin-left: 33.33333%;
  }
}
input {
  display: block;
  width: 100%;
}
label, select {
  display: block;
  width: 100%;
  max-width: 100%;
}
</style>
<div class="form-group">
  <div class="form-col-4">
    <label for="fname">First Name</label>
  </div>
  <div class="form-col-8">
    <input type="text" id="fname" autocomplete="given-name">
  </div>
</div>
<div class="form-group">
  <div class="form-col-4">
    <label for="lname">Last Name</label>
  </div>
  <div class="form-col-8">
    <input type="text" id="lname" autocomplete="family-name">
  </div>
</div>
<div class="form-group">
  <div class="form-col-4">
   <label for="favorite-fruit">Favorite fruit</label>
  </div>
  <div class="form-col-8">
    <select id="favorite-fruit">
      <option>Banana</option>
      <option>Pineapple</option>
      <option>Strawberry</option>
    </select>
  </div>
</div>
<div class="form-group">
  <div class="offset-form-col-4 form-col-8">
    <button type="submit">Submit</button>
  </div>
</div>

Ejemplo práctico: Usar etiquetas y campos de entrada ajustables para el reajuste (reflow)

Pruebas

Procedimiento

  1. Mostrar la página web en un agente de usuario capaz de hacer zoom al 400 % y establecer las dimensiones de la ventana gráfica (en píxeles CSS) en 1280 de ancho y 1024 de alto.
  2. Ampliar con zoom al 400 %.
  3. Para el contenido que se desplaza verticalmente, todas las etiquetas y campos de entrada caben en su espacio disponible sin desplazamiento horizontal.

Nota: si el navegador no es capaz de ampliar al 400 %, puede reducir la anchura del navegador proporcionalmente. Por ejemplo, con un zoom del 300 %, la ventana gráfica debería tener 960 px de ancho.

Resultados esperados

La comprobación n.º 3 es verdadera.

Cómo lo comprobamos en ADDAW

En cada auditoría de ADDAW revisamos esta técnica página a página y le entregamos los errores con capturas y la forma de corregirlos.

Solicitar una auditoría

Basado en la técnica C38 del W3C (WCAG 2.2). Explicación y ejemplos: ADDAW. Traducción no oficial del texto del W3C © W3C, licencia de documentos del W3C. ¿Ha visto un error? Escríbanos.