39
loading...
This website collects cookies to deliver better user experience
For an English version of this article, visit this other DEV post
img
al contenedor principal del dibujo:<div role="img">
<!-- HTML de la imagen -->
</div>
alt
.aria-label
al dibujo y añadiendo el texto alternativo ahí:<div aria-label="El texto alternativo iría aquí">
<!-- HTML de la imagen -->
</div>
aria-labelledby
:<div aria-labelledby="alt-imagen">
<div id="alt-imagen">El texto alternativo va aquí</div>
<!-- HTML de la imagen -->
</div>
#alt-imagen {
clip: rect(0 0 0 0);
clip-path: inset(50%);
height: 1px;
overflow: hidden;
position: absolute;
white-space: nowrap;
width: 1px;
}
<img />
nativo si la imagen no se carga correctamente en la página.px
, cm
, pt
, etc. De este modo nuestra imagen tendrá un tamaño fijo y no escalará del todo bien (aunque mejor que las imágenes raster ya que lo nuestro será un dibujo vectorial), pero podremos usar cualquier propiedad y valor CSS.%
, vmin
, em
, etc. si queremos que sea escalable.box-shadow
o border
).clip-path
puede tener valores relativos con polygon()
pero no con path()
).<div>
para todas las partes de nuestro dibujo y especialmente no para el contenedor principal. La pregunta debería ser "¿qué elemento HTML debemos usar?"Nota del autor: comprendo que mi elección de elementos semánticos puede ser discutible. Intentaré ser lo más neutral/objetivo posible.
<article>
y <figure>
/<figcaption>
. Mientras que el segundo parece una elección obvia, el primero tiene algunas ventajas semánticas, como veremos pronto.<figure>
. Un contenido autónomo con un subtítulo opcional (<figcaption>
) que puede usarse para el texto alternativo:<figure aria-labelledby="alt-imagen">
<figcaption id="alt-imagen">Aquí va el texto alternativo</figcaption>
<!-- HTML de la imagen -->
</figure>
<article>
: una composición completa, autónoma e independiente, con la intención de ser reusada y distribuida. ¡Precisamente lo que es el dibujo CSS!<article>
<!-- HTML de la imagen -->
</article>
<article>
dentro de otro <article>
, pero eso no es correcto. Un artículo puede contener otro artículo. Cuando hay artículos anidados, el artículo interior debe estar relacionado con el artículo exterior.<article aria-labelledby="image-alt"
aria-describedby="image-info">
<!-- Todo el `<header>` se escondería de forma accesible -->
<header>
<h2 id="image-alt">Título/Texto alternativo</h2>
<p id="image-info">
<address>
Creado por
<a href="https://twitter.com/alvaro_montoro">
Alvaro Montoro
</a>
</address>
el
<time datetime="2021-06-10">10 de Junio de 2021</time>
</p>
</header>
<!-- HTML de la imagen -->
</article>
prefers-reduced-motion
que permite a los desarrolladores hacer precisamente eso.@media (prefers-reduced-motion) {
.animado {
animation: none;
}
}
prefers-contrast
: para indicar si el usuario quiere un contraste más alto o más bajo.prefers-color-scheme
: para detectar si el usuario prefiere un tema oscuro o claro (muy común para mostrar el modo noche/día.)forced colors
: especifica si un usuario ha elegido una paleta de colores limitada.
@media (prefers-contrast: more) {
/* more: contrastes más altos, bordes, sin transparencias... */
/* less: contrastes de color más bajos */
}
@media (prefers-colors-scheme: dark) {
/* dark: dibujos con más contraste frente a fondos oscuros */
/* light: dibujos con más contraste frente a fondos claros */
}
@media (forced-colors: active) {
/* sobreescribir propiedades como box-shadow, añadir bordes, etc. */
}
box-shadow
se fuerza a none
en el modo de colores forzados, y tendríamos que buscar alternativas.aspect-ratio
. Con ella podemos definir la relación de aspecto preferida para la imagen, que el navegador usará para calcular el tamaño y aplicarlo automáticamente:/* Este dibujo CSS será cuadrado */
#miArteCSS {
aspect-ratio: 1 / 1;
}
/* Este dibujo CSS será el doble de alto que de ancho */
#miArteCSS {
aspect-ratio: 1 / 2;
}