Addaw, ir a inicio Donar

Técnica CSS WCAG 2.2

C43Usar scroll-padding de CSS para desocultar el contenido

En resumen

Esta técnica muestra cómo usar las propiedades CSS padding y scroll-padding para reservar espacio bajo un elemento de posición fija (por ejemplo, un aviso de cookies anclado abajo) de modo que los enlaces y controles que quedan debajo se desplacen a la vista al recibir el foco del teclado. Beneficia a quienes navegan con teclado y ayuda a cumplir el criterio 2.4.11 Foco no oscurecido (mínimo).

Aplicabilidad

Todas las tecnologías compatibles con CSS.

Descripción

El objetivo de esta técnica es garantizar que los componentes de la interfaz de usuario (por ejemplo: enlaces, botones y campos de formulario) que inicialmente quedan completamente ocultos por un componente de posición fija sigan siendo accesibles para los usuarios. En este ejemplo, se consigue utilizando las propiedades CSS padding y scroll-padding para crear espacio debajo del pie de página del sitio y permitir que el enlace del pie se desplace hasta quedar visible cuando recibe el foco con el teclado.

Ejemplos

Usar scroll-padding de CSS para desocultar el contenido

Este ejemplo muestra una situación en la que hay un banner de posición fija en la parte inferior de la pantalla que tapa el pie de página del sitio, el cual contiene un enlace. Este tipo de banner de posición fija es un diseño habitual en los avisos de consentimiento de cookies.

Ejemplo práctico: Usar scroll-padding de CSS para desocultar el contenido.

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  <title>Using CSS scroll-padding to un-obscure content</title>
  <style>
    ...
    :root{
      --height-dialog: 400px;
      --breathing-room: 20px;
      --scroll-padding: calc(var(--height-dialog) + var(--breathing-room));      
    }
    .wrapper {
      display:grid;
      gap:1rem;
      grid-template-columns:repeat(9, 1fr);
      grid-template-rows:8rem auto minmax(10rem, max-content);
      min-block-size: 100vh;
    }
    .wrapper > * {
      border:1px solid var(--black);
      padding:1rem;
    }
    header {
      grid-column:1 / -1;
      grid-row:1;
    }
    main {
      grid-column:1 / 8;
    }
    aside {
      grid-column:8 / 10;
    }
    footer {
      grid-column:1 / -1;
    }
    @media (max-width:50rem) {
      main {
       grid-column:1 / -1;
      }
      aside {
        grid-column:1 / -1;
      }
    }
    .fixed-position-banner {
      background:var(--banner-background);
      border:3px solid var(--banner-border);
      margin-block-end:0.5rem;
      padding:1rem 1rem 5rem;
      position:relative;
      width:calc(100vw - 1rem);
    }
    @media (min-width: 50rem) {
      html {
        padding-bottom:var(--height-dialog);
        scroll-padding-bottom:var(--scroll-padding);
      }
     .fixed-position-banner {
        margin-block-end:0;
        position:fixed;
        inset:auto 0 0 0;
      }
    } 
    ...
  </style>
</head>
<body>
  <dialog class="fixed-position-banner">
    <h2 tabindex="-1">Fixed-Position Banner</h2>
    <button aria-label="close fixed-position banner" class="close-banner" type="button">
      ...
    </button>
  </dialog>
  <div class="wrapper">
    <header>
      <p>Header Content</p>
    </header>
    <main>
      <h1>Main Content</h1>
    </main>
    <aside>
      <h2>Sidebar Content</h2>
      <p><a href="https://example.com">Here's an example link in the sidebar</a>.</p>
    </aside>
    <footer>
      <h2>Footer Content</h2>
      <p><a href="https://example.com">Here's an example link in the footer</a>.</p>
    </footer>
  </div>
  <script>
    window.addEventListener('DOMContentLoaded', () => {
      const elFixedBanner = document.querySelector('dialog');
      const elCloseBannerBtn = document.querySelector(".close-banner");
      elFixedBanner.show();
      const getDialogHeight = () => {
        const height = elFixedBanner.offsetHeight;
        document.documentElement.style.setProperty('--height-dialog', `${height}px`);
        document.documentElement.style.setProperty('--breathing-room', `${height ? 20 : 0}px`);
      }
      const observer = new ResizeObserver(getDialogHeight);
      observer.observe(elFixedBanner);
      elCloseBannerBtn.addEventListener("click", function(e){
        elFixedBanner.close();
      }, false);
    });
  </script>	
</body>
</html>

Pruebas

Procedimiento

Para cada componente de la interfaz de usuario que puede recibir el foco del teclado:

  1. Comprobar que el componente de la interfaz de usuario no queda completamente oculto cuando recibe el foco del teclado.
  2. Comprobar que ninguna parte del componente de la interfaz de usuario queda oculta cuando recibe el foco del teclado.

Resultados esperados

  • La comprobación n.º 1 es verdadera.
  • Para el criterio de conformidad 2.4.12 Foco No Oscurecido (Mejorado) (nivel AAA), la comprobación n.º 2 también es verdadera.

Recursos

  1. W3C - CSS padding.
  2. W3C - CSS: la propiedad scroll-padding.

Cómo lo comprobamos en ADDAW

En las auditorías de accesibilidad de ADDAW revisamos cada criterio de conformidad siguiendo este catálogo de técnicas: comprobamos si la web aplica una técnica suficiente y documentamos cada fallo común con capturas y el código afectado, para que el equipo de desarrollo sepa exactamente qué corregir. Los informes siguen la metodología del Observatorio de Accesibilidad y la norma UNE-EN 301 549.

Solicitar una auditoría

Fuente y licencia

Traducción al español, no oficial, realizada por ADDAW a partir de la técnica C43 del documento «Techniques for WCAG 2.2» del W3C (versión del repositorio público del W3C a 22/10/2026). Copyright © W3C® (MIT, ERCIM, Keio, Beihang). Se publica conforme a la licencia de documentos del W3C. El texto normativo de referencia es el original en inglés; si detecta un error en la traducción, escríbanos.

Financiado por la unión europea Gobierno de españa red.es Plan de recuperación transformación y resilencia kit digital