Armonía | En definitiva...

Estás viendo las entradas catalogadas dentro de la categoría "Accesibilidad".

Reemplazo accesible de textos por imágenes

Muchas veces, principalmente por motivos de diseño, necesitamos sustituir un pequeño párrafo, o un título, o cualquier pieza de texto por una imagen. Como ya sabemos, si la imagen no añade información al documento, lo ideal es colocarla mediante CSS, ya que dicha imagen formará parte del aspecto visual de la página y no de su contenido.

Para conseguir esto hay muchas técnicas, la primera en hacerse "popular" fue la ya conocidísima FIR, (Fahrner Image Replacement), que consiste en ocultar mediante CSS con un display:none; un elemento span contenido dentro de un elemento en bloque, normalmente un div, y posteriormente colocarle a dicho div la imagen que queramos a modo de background.

Esta técnica tiene algunos problemas, algunos más importantes que otros, pero en cuestión de accesibilidad los dos más importantes son dos. El primero es que los lectores de pantalla no leerán el texto, ya que lo hemos ocultado mediante display:none;, y la mayoría de lectores obvian los elementos ocultados de esta manera. El segundo, y no menos importante, es que en escenarios donde el navegador tenga activado el soporte CSS, pero desactivado el soporte para las imágenes, (o que por cualquier motivo la imagen no se haya podido cargar), no se mostrará nada, ya que el texto está oculto totalmente mediante CSS.

Aparte de esta técnica existen otras muchas, (Dave Shea hizo un gran resumen de ellas), cada cual con sus ventajas y sus beneficios, aunque la mayoría de ellas fallan en lo mismo que lo último que hemos comentado sobre FIR, cuando la imagen no se carga, el texto no puede verse.

Es por esto que, según mi modesta opinión, la mejor forma de conseguir un reemplazo de textos por imágenes de manera accesible es jugando con el posicionamiento de los elementos, y luego colocar un orden de aparición correcto mediante z-index. Esto que puede sonar un tanto confuso en realidad no lo es tanto. Veamos cómo conseguirlo.

Comenzaremos por el marcado XHTML. Para poder usar esta técnica vamos a necesitar tres elementos, (esto nos obligará muchas veces a tener que usar un span "extra" muy poco elegante, pero es el precio que hay que pagar). En nuestro caso vamos a usar un párrafo, un enlace, y el feo span:

<p class="reemplazado">
	<a href="#" title="Enlace de ejemplo"><span>¡Voy a ser sustituido!</span></a>
</p>

Para conseguir el reemplazo vamos a tener que jugar con el posicionamiento, tanto relativo como absoluto, de alguno de nuestros elementos. Lo primero que vamos a hacer es precisamente eso, posicionar y colocar nuestra imagen. Para ello vamos a colocar lo siguiente a nuestros elementos:

p.reemplazado {
	position: relative;
}

p.reemplazado a {
	background: url(imagen.png) no-repeat 0 0;
	display: block;
	height: 200px;
	width: 200px;
}

p.reemplazado a span {
	position: absolute;
}

Lo que hemos hecho ha sido lo siguiente. Primero hemos posicionado nuestro párrafo de manera relativa, lo que significa que vamos a poder posicionar sus elementos hijos, (en este caso el enlace), de forma absoluta pero desde la posición del párrafo y no de la ventana. Suena un poco complicado, ¿verdad? Para entender mejor las propiedades de posicionamiento de CSS recomiendo leer este tutorial de BarelyFitz Design.

Lo siguiente que hemos hecho ha sido colocar la imagen en nuestro enlace. Nuestra imagen tiene 200 pixels de alto y 200 de ancho, por lo que le hemos especificado esas medidas al enlace, y para que tengan efecto lo hemos transformado en un elemento en bloque, ya que por defecto los enlaces son elementos en línea. Una vez hecho esto solo nos queda colocar la imagen de fondo en nuestro enlace con la propiedad background.

Ahora le toca el turno a nuestro feo span. A este lo que le hemos hecho es simplemente posicionarlo de forma absoluta con position:absolute;. La posición top y left vamos a dejarla intacta, aunque podríamos modificarla al gusto siempre que no hagamos que se salga de las medidas de nuestra imagen.

Si probamos esto veremos como la imagen esta colocada perfectamente, y nuestro texto esta situado por encima de la imagen... Mmmm, un momento, ¡esto no es lo que queríamos! ¡Me han timado! A ver, veamos, ¿qué puede estar ocurriendo? ¡Ah, ya veo, falta el "toque mágico"!

p.reemplazado {
	position: relative;
	z-index: 1;
}

p.reemplazado a {
	background: url(imagen.png) no-repeat 0 0;
	display: block;
	height: 200px;
	width: 200px;
}

p.reemplazado a span {
	position: absolute;
	z-index: -1;
}

Ahí está lo importante del asunto, usar los z-index para determinar el orden de visualización de los elementos posicionados. Con esto lo que hemos hecho es decir que nuestro feo span con el texto quede por detrás del párrafo, y consecuentemente de la imagen que hemos usado.

Por último cabría recordar que podemos, (o debemos, según se mire), estilizar el texto del enlace, para que, dado el caso, se muestre de una manera agradable a aquellos usuarios que no puedan ver la imagen.

A mi modo de ver esta es la mejor forma de conseguir un reemplazo de textos por imágenes, aunque usemos un span tan poco elegante. Es una manera sencilla y accesible de conseguirlo, aunque bien es cierto que no es válida para todas las circunstancias, pero bueno, hay muchas técnicas estupendas por ahí, y si no para eso están los expertos, para conseguir técnicas nuevas.

Diseño de páginas web accesibles

  • Viernes, 28 de Octubre de 2005 a las 16:44 CET
  • Guardado en: Accesibilidad

Portada del libro "Diseño de páginas web accesibles"

Gracias a Rodrigo ahora tengo en casa un ejemplar del libro Diseño de páginas web accesibles, editado por la Consejería de Trabajo, Consumo y Política Social de la Región de Murcia.

El libro, con un diseño muy bonito, es una traducción de las Pautas de accesibilidad al contenido en la Web 1.0, de WAI-W3C. Una forma atractiva de tener a mano en casa un documento importantísimo para todos aquellos que estamos metidos en esto del desarrollo web.

Accesibilidad y Usabilidad en eConozco

  • Jueves, 13 de Octubre de 2005 a las 22:54 CET
  • Guardado en: Accesibilidad

El amigo MC, de Accesibilidad Web, ha creado un grupo sobre accesibilidad y usabilidad en eConozco, una potente herramienta de red social, más concretamente una red de contactos profesionales.

Os recomiendo que si no conoceis esta herramienta os deis una vuelta y os apunteis al grupo desde este enlace de invitación. Creo que con esto todos salimos ganando.

Foro Accesibilidad

  • Domingo, 04 de Septiembre de 2005 a las 01:00 CET
  • Guardado en: Accesibilidad

Desde el blog de Pablo Viojo me entero de que MC, de Accesibilidad Web ha puesto en marcha un foro sobre accesibilidad con la intención de crear un lugar de encuentro colectivo de interesados y entendidos del principio de accesibilidad en el diseño de aplicaciones informáticas.

Yo ya estoy registrado, y desde aquí os animo a que participeis y deis vuestras impresiones y opiniones sobre los temas que allí se traten, que seguro merece la pena.

Formularios y mensajes de error

  • Domingo, 24 de Julio de 2005 a las 19:49 CET
  • Guardado en: XHTML
    Warning: sprintf() [function.sprintf]: Too few arguments in /home/armoniaspiralstatic/armonia.spiral-static.org/ecrire/tools/multicat/functions.php on line 85

    Warning: sprintf() [function.sprintf]: Too few arguments in /home/armoniaspiralstatic/armonia.spiral-static.org/ecrire/tools/multicat/functions.php on line 85

    Warning: sprintf() [function.sprintf]: Too few arguments in /home/armoniaspiralstatic/armonia.spiral-static.org/ecrire/tools/multicat/functions.php on line 85

    Warning: sprintf() [function.sprintf]: Too few arguments in /home/armoniaspiralstatic/armonia.spiral-static.org/ecrire/tools/multicat/functions.php on line 85

Una parte muy a tener en cuenta a la hora de desarrollar nuestras aplicaciones Web son los formularios. Estos han de ser simples, consistentes, comprensibles, accesibles, etc. En este artículo de hoy voy a enseñaros la forma en la que suelo hacer mis formularios, y los motivos por los que he elegido determinados detalles que acostumbro a usar.

Para hacer más sencilla la comprensión de todo esto he creado un sencillo ejemplo con un mismo formulario dividido en tres estados distintos, donde cada uno de ellos muestra una etapa de la "vida de un formulario".

Primera etapa: Formulario en estado normal

La primera etapa de todo formulario es aquella en la que nos lo encontramos por primera vez, impoluto, limpio completamente, esperando ser cumplimentado y enviado.

Es una etapa muy importante, ya que debemos conseguir que de un simple vistazo el formulario sea comprensible para el usuario. Y por si fuera poco, hemos de usar nuestro lenguaje de marcado favorito de forma correcta, preocupándonos además por la accesibilidad del formulario.

Hay diversas cosas que suelo realizar siempre que hago un formulario. Una de ellas es englobarlo con el elemento fieldset con un atributo title bien descriptivo, y colocándole su correspondiente legend:


<fieldset title="Formulario general en estado normal que realiza una función determinada">
  <legend>Formulario general en estado normal</legend>
</fieldset>

Otra cosa imprescindible es el uso de los label. A todos los controles del formulario, salvo a los botones, les coloco su label correspondiente. Debo destacar que normalmente acostumbro a englobar todo el control con el label además de usar el atributo for de este, me explico:

<label for="cajaTexto1">Caja de Texto 1 <span class="obligatorio">(Obligatorio)</span><br />
  <input type="text" id="cajaTexto1" name="cajaTexto1" maxlength="255" title="Caja de Texto. (Campo obligatorio, con un límite de 255 caracteres.)" />
</label>

Como podeis ver, toda la caja de texto se encuentra englobada dentro de un label, y este a su vez hace uso del atributo for para referenciar a la caja de texto. Hay personas que sólo hacen uso del atributo for, pero hay algunos agentes de usuario que todavía no soportan esta forma de referenciación, así que procuramos mantener ambas formas para evitar incompatibilidades.

Si os fijais, la caja de texto usa el atributo maxlength, que nos permite limitar el número de caracteres que van a poder introducirse en ella. Si se conoce este límite, es más que recomendable hacer uso de este atributo, para ahorrarnos sustos si, por ejemplo, los datos van a guardarse en una Base de Datos y al usuario le da por meter un capítulo entero de El Quijote.

Además también es recomendable dotar a todos y cada uno de los controles del formulario del atributo title, explicando brevemente qué se debe hacer en ese control, y si es posible, informar de las limitaciones: obligatorio o no, tipos de datos que acepta, (sólo números, sólo letras, etc.) Con respecto a este mismo tema, en el texto del label, y para que el usuario tenga acceso a esta información a golpe de vista, suelo añadir también de forma muy breve, las limitaciones del campo. Las englobo en un span para poder manejarlas posteriormente de forma sencilla con CSS.

Por destacar otro detalle, en el ejemplo podéis ver que en el desplegable hago uso de optgroup para dividir los grupos de elementos que componen el control. Es importante que useis este elemento si vuestros desplegables necesitan subdividir en grupos los elementos, nada de usar option con guiones ni nada de eso.

<label for="combo">Desplegable <span class="obligatorio">(Obligatorio)</span><br />
  <select id="combo" name="combo" title="Desplegable con 5 opciones divididas en 2 grupos. (Obligatorio elegir una opción)">
    <optgroup label="Grupo 1">
      <option selected="selected" value="1">Opción 1</option>
      <option value="2">Opción 2</option>
    </optgroup>
    <optgroup label="Grupo 2">
      <option value="3">Opción 3</option>
      <option value="4">Opción 4</option>
      <option value="5">Opción 5</option>
    </optgroup>
  </select>
</label>

Ver ejemplo para el formulario en estado normal

Segunda etapa: Formulario con mensajes de error

Esta etapa, obviamente, no siempre va a ocurrir, pero debemos tener especial cuidado a la hora de controlarla, porque un formulario con mensajes de error poco claros, e incluso liosos o inexistentes, hará que todo el proceso se vaya al garete.

Mis formularios suelen tener tres formas de aviso distintas para los errores:

  • Mensaje general con una lista de puntos a comprobar
  • Estilos CSS distintos en los controles incorrectos
  • Mensaje informativo breve junto a cada control incorrecto

Todos estos mensajes han de destacar de forma muy clara por encima del aspecto normal del formulario, para que así el usuario pueda localizarlos y comprenderlos sin el menor esfuerzo.

Si observais el ejemplo, lo podreis ver claramente. Tonos rojos para todos los mensajes, un grosor de borde significativo para los controles incorrectos, y un pequeño texto junto a cada uno de ellos.

Mirando el código del mensaje general justo al comienzo del fieldset os dareis cuenta de que he usado el elemento big con un span interno que contiene un texto llamativo que luego oculto con CSS. Esto lo hago pensando en los usuarios que no tienen los estilos CSS activados. Puesto que no se percataran de los estilos con tonos rojos y demás, les doy un elemento "distinto" y un texto impactante para que su atención se centre sobre el mensaje de forma más sencilla.

<div class="mensaje error">
  <p><big><span>*** !ATENCIÓN!</span> Encabezado error</big></p>
  <p>Etiam porta semper nisl. Aenean lacus risus, condimentum id, pharetra in, dictum vel, quam. Maecenas non mauris ut dolor cursus dignissim.</p>
  <ul title="Lista de puntos a verificar">
    <li>Debes rellenar el campo obligatorio "Caja de Texto 1"</li>
    <li>El campo "Caja de Texto 2" no tiene un formato correcto. Sólo se aceptan caracteres alfanuméricos</li>
  </ul>
  <hr />
</div>

Ver ejemplo para el formulario con mensajes de error

Tercera etapa: Formulario ejecutado de forma satisfactoria

Esta es una etapa meramente informativa, y no es absolutamente necesario, ya que un formulario puede terminar con una redirección a otra página, con un mensaje simple porque no se necesite tener el formulario de nuevo, etc.

De todas formas la estructura es exactamente igual que la del mensaje general de errores de la etapa anterior, salvo que con unos estilos distintos en tonos "menos preocupantes" que el rojo. También, del mismo modo que antes, pienso en los usuarios con CSS desactivado colocando un mensaje llamativo que capte su atención incluso sin estilos.

Ver ejemplo para el formulario ejecutado satisfactoriamente

CSS también hace las cosas accesibles

  • Domingo, 06 de Febrero de 2005 a las 18:05 CET
  • Guardado en: CSS
    Warning: sprintf() [function.sprintf]: Too few arguments in /home/armoniaspiralstatic/armonia.spiral-static.org/ecrire/tools/multicat/functions.php on line 85

Normalmente se le asocián los temas de accesibilidad en la Web solamente al HTML o XHTML que escribimos. Puede parecer bastante lógico, pero en realidad no es exclusivamente así. Nuestros estilos CSS también pueden mejorar la accesibilidad de nuestro sitio.

En Técnicas CSS para las Pautas de Accesibilidad al Contenido en la Web 1.0 tenemos una serie de consejos y técnicas que podemos aplicar a nuestros estilos y mejorar así la accesibilidad en los documentos Web que generemos.

Enlaces sobre accesskey

  • Sábado, 29 de Enero de 2005 a las 21:51 CET
  • Guardado en: Accesibilidad

De nuevo gracias al amigo posavasos descubro cosas interesantes. En un e-Mail que me ha mandado esta tarde me ha pasado un par de enlaces muy interesantes sobre la propiedad accesskey y las teclas más acertadas para usar con ella.

Legibilidad en la Web

  • Domingo, 23 de Enero de 2005 a las 17:39 CET
  • Guardado en: Accesibilidad

A raiz de un e-Mail que me envió un lector del blog, (el amigo posavasos, al cual le agradezco desde aquí su aportación), he modificado un poco mi CSS para que el contraste entre el color de fondo y el color del texto fuese el suficiente como para leer con total comodidad.

El e-mail de posavasos me ha llevado a investigar un poco más sobre este tema, y, gracias a unos enlaces que me adjuntaba, he podido encontrar algo de información interesante sobre los contrastes de colores para mejorar la legibilidad.

Según parece, el nivel correcto para une lectura cómoda en la Web se mide en base a dos valores: el brillo del color y la diferencia de color. Ambos valores se obtienen a través de unas fórmulas matemáticas, cuyo resultado nos indicarán si estan o no dentro de los valores adecuados.

Fórmula de Brillo de Color

El W3C sugiere la siguiente fórmula para calcular el valor del Brillo del Color. Para considerarse correcto, la diferencia entre el valor de brillo del color de fondo y el valor de brillo del primero plano debería ser mayor que 125.

((Valor de Rojo × 299) + (Valor de Verde × 587) + (Valor de Azul × 114)) / 1000

Para este blog, por ejemplo, el color del texto, (#403e3e), y el color de fondo, (#fff), poseen una diferencia de 192, por lo que está dentro de los valores permitidos. Vamos a calcularlo:

Valor de brillo para #fff = ((255 × 299) + (255 × 587) + (255 × 114)) / 1000

Valor de brillo para #fff = ((76245) + (149685) + (29070)) / 1000

Valor de brillo para #fff = (255000) / 1000
	
Valor de brillo para #fff = 255

Como podemos ver, para el color blanco, (#fff), el valor de Brillo es 255. Ahora calcularemos el valor de Brillo para nuestro color de primer plano, (#403e3e).

Valor de brillo para #403e3e = ((64 × 299) + (62 × 587) + (62 × 114)) / 1000

Valor de brillo para #403e3e = ((19136) + (36394) + (7068)) / 1000

Valor de brillo para #403e3e = (62598) / 1000
	
Valor de brillo para #403e3e = 63   (*** Sale 62,598 Redondeamos hacia arriba)

Ahora, para saber si la diferencia entre los valores de Brillo de nuestro color de fondo y nuestro color de texto es correcta solo tenemos que restar los resultados.

Diferencia = Valor de Brillo color fondo - Valor de Brillo color primer plano
	
Diferencia = 255 - 63
	
Diferencia = 192

Como el resultado debería ser mayor que 125, y en mi caso es asi, se puede considerar que la diferencia de brillo entre el color de fondo y el color del texto es correcta.

Fórmula de Diferencia de Color

El W3C sugiere la siguiente fórmula para calcular la Diferencia de Color entre dos colores. Para considerarse correcta, esta diferencia debería ser mayor que 500.

(Máximo(valor Rojo 1, valor Rojo 2) - Mínimo (valor Rojo 1, valor Rojo 2)) + (Máximo (valor Verde 1, valor Verde 2) - Mínimo (valor Verde 1, valor Verde 2)) + (Máximo (valor Azul 1, valor Azul 2) - Mínimo (valor Azul 1, valor Azul 2))

Vamos a calcular ahora si la diferencia de colores entre el fondo y el texto es correcta en este blog:

Diferencia entre #fff y #403e3e = (Máximo(255, 64) - Mínimo (255, 64))
 + (Máximo (255, 62) - Mínimo (255, 62)) 
 + (Máximo (255, 62) - Mínimo (255, 62))
	
Diferencia entre #fff y #403e3e = (255 - 64) + (255 - 62) + (255 - 62)
	
Diferencia entre #fff y #403e3e = (191) + (193) + (193)
	
Diferencia entre #fff y #403e3e = 577

Como podemos ver, el resultado es 577, y según la recomendación del W3C debe ser mayor que 500, el valor es correcto.

Los cálculos son relativamente sencillos, pero un poco tediosos, por lo que existen diversas herramientas on-line que nos dan los resultados con solo darles los valores.

Espero que os haya sido de utilidad. Y vuelvo a agradecer a posavasos su e-Mail, el cual me ha abierto un poco los ojos en este tema.

Paginación:

Búsqueda

Acerca de este blog

Armonía es el blog personal de Juan G. Hurtado, (C. V.). Aquí se tratarán muchos temas, pero sobre todo los relacionados con la programación, la tecnología, el desarrollo y los estándares en la World Wide Web.

Si quieres puedes visitar también las galerias de fotos guardadas en su cuenta Flickr, o su colección de enlaces en del.icio.us.

Velas en la oscuridad Mano del autor del blog en blanco y negro Trozo del paisaje desde la ventana del autor del blog Palma de la mano del autor del blog en blanco y negro

Lectura

CSS Mastery, de Andy Budd
Portada del libro Bulleproof Web Design
Muy buen libro, escrito por Andy Budd en el que nos muestra un repaso muy bien detallado por infinidad de técnicas ingeniosas para conseguir que nuestras hojas de estilo "hagan magia"
[Leer revisión]
Bulletproof Web Design, de Dan Cedelhorm
Portada del libro Bulleproof Web Design
Un libro genial en el que Dan Cedelhorm nos enseña cómo blindar nuestras páginas para evitar que se "rompan" ante configuraciones no habituales de los navegadores de los visitantes, (aparte de otras muchas cosas)
[Leer revisión]
Agile Web Development With Rails, de Dave Thomas y David Heinemeier
Portada del libro Agile Web Development With Rails
Una perfecta introducción a Ruby on Rails, el framework de desarrollo Web que está causando furor en estos momentos...
[Leer revisión]

Contacto

  • e-Mail: juan.g.hurtado@gmail.com
  • Jabber: juan.g.hurtado@jabberes.org
  • Skype: juan.g.hurtado
  • Messenger: the_micro_cuts@hotmail.com