Descripciones emergentes

facebook-svg gplus-svg twitter-svg

Las descripciones emergentes son estos cuadraditos de texto que aparecen al pasar con el ratón por encima de algún elemento html.

Crear descripciones emergentes con CSS3 es coser y cantar. Para esto utilizamos el pseudo-elemento ::before cuyo contenido content: attr(data-tooltip), donde data-tooltip es un atributo personalizado.

Para quien no lo sepa, en HTML5 podemos utilizar atributos personalizados. El nombre de estos atributos empieza con data- y la especificación w3.org los considera zonas de almacenamiento privado para los datos ( privados en el sentido que el usuario no las puede ver ).

<div id="miDiv" data-test="el valor del atributo" >

Estos atributos nos vienen de maravilla en javascript.

function miFuncion() {
  var miTip = document.getElementById("miDiv").getAttribute("data-test");
  console.log(miTip);
}

O todavÍa mejor:

function miFuncion() {
  var miTip = document.getElementById("miDiv").dataset.test;
  console.log(miTip);
}

Lea: John Resig HTML5 data- Attributes

También los podemos utilizar en CSS3 con los pseudo-elementos ::before y ::after, y esto es lo que haremos a continuación.

[data-tooltip]::before {content:attr(data-test);}

Un ejemplo sencillo

El HTML

En el siguiente ejemplo en el HTML tenemos un párrafo <p class = "emergente"> con algunas palabras que queremos explicar, como por ejemplo "hidalgo".
Estas palabras aparecen dentro de un elemento <span>, y la descripción que queremos que aparezca en pantalla es el valor del atributo data-tooltip de este.

<span data-tooltip = "Generalmente se refiere . . .">hidalgo</span>

En un lugar de la Mancha de cuyo nombre no quiero acordarme, no ha mucho tiempo que vivía un hidalgo de los de lanza en astillero, adarga antigua, rocín flaco y galgo corredor. Una olla de algo más vaca que carnero, salpicón las más noches, duelos y quebrantos los sábados, lentejas los viernes, algún palomino de añadidura los domingos, consumían las tres partes de su hacienda.

El CSS

Queremos que la descripción ( el valor del atributo data-tooltip ) de "hidaldo" aparezca cada vez que el usuario pase con el ratón por encima de la palabra ( hover ). Para esto construimos un pseudo-elememto ::before que contenga esta descripción.

[data-tooltip]::before {
   content : attr(data-tooltip);
   display:none;
   position: absolute;
  }

El contenido ( content ) de este pseudo-elemento es el valor del atributo data-tooltip.
El display de la descripción emergente es none, ya que tiene que aparecer solo cuando el usuario pasa con el ratón por encima del elemento <span>.
La posición es position: absolute; ya que queremos que flote por encima del texto. Las demás reglas de estilo dependen del gusto de cada uno.

Al pasar por encima el display del pseudoelemento ::before cambia a block, y el pseudo-elemento ::before aparece.

[data-tooltip]:hover::before {
   display : block;
   }

Utilizamos el el pseudo-elemento ::after para dibujar aquel triangulito que apunta hacia la palabra, y le damos casi el mismo estilo que a ::before.

Cómo dibujar un triangulo utilizando CSS


[data-tooltip]{ 
position:relative; 
border-bottom: 1px dotted #09C;
cursor:pointer;
}
[data-tooltip]::before {
content : attr(data-tooltip);
background-color:rgba(0,0,0,.75);
color:white;
-webkit-font-smoothing: antialiased;
width:150px;
padding:10px;
height:auto;
border-radius:3px;
display:none;
position:absolute;
bottom:25px;
left:calc(100% - 75%);
pointer-events: none;
z-index:99;
 }
[data-tooltip]::after{
content:"";
height:1px;
width:1px;
border:10px solid transparent;
border-top-color:rgba(0,0,0,.75);
position:absolute;
bottom:4px;
left:50%;
display: none;
}
[data-tooltip]:hover::before,
[data-tooltip]:hover::after
{ display:block;} 

En un lugar de la Mancha de cuyo nombre no quiero acordarme, no ha mucho tiempo que vivía un hidalgo de los de lanza en astillero, adarga antigua, rocín flaco y galgo corredor. Una olla de algo más vaca que carnero, salpicón las más noches, duelos y quebrantos los sábados, lentejas los viernes, algún palomino de añadidura los domingos, consumían las tres partes de su hacienda.

Descripciones emergentes animadas

En el CSS3 podemos animar los elementos HTML y no estaría nada mal animar a las descripciones emergentes, para que no aparezcan así de repente. Por lástima la propiedad display no es animable, en cambio la propiedad opacity ( opacidad ) sí que lo es, asi que tenemos que hacer algunos cambios:


.animado [data-tooltip]::before {
display:block;
opacity:0;
pointer-events: none;
}
.animado [data-tooltip]::after{
opacity:0;
pointer-events: none;
}

La propiedad pointer-events – nueva en CSS3 – permite controlar como se comportan los elementos html respecto a los eventos del ratón.
En nuestro caso, el pseudo-elemento ::before es hijo de <span data-tooltip...>, y aunque totalmente transparente, al pasar con el ratón por encima, hace iniciar la animación demasiado lejos de la palabra. Para que esto no pase utilizamos pointer-events: none, para inhabilitar los eventos del ratón encima del pseudo-elemento.

En este momento la propiedad pointer-events está bien soportada en los principals navegadores.
Lea este articulo CSS-tricks: pointer-events

Para animar la opacidad de los pseudo-elementos ::before y ::after utilizamos dos fotogramas @keyframes que animan la opacidad de 0 ( totalmente transparente ) a 1 ( totalmente opaco ).
La animación dura 1 segundo ( animation-duration: 1s; ).

/* define la animación */ 
.animado [data-tooltip]:hover::before,
.animado [data-tooltip]:hover::after {
    animation-name: toolTip;
    animation-duration: 1s;
}
/* define las fotogramas de la animación*/
@keyframes toolTip {
  0%   {opacity:0;}
  100% {opacity:1;}
  }

En producción tenemos que utilizar prefijos!!!

Al final, muy importante: una regla más: cuando la animación acabe, la opacidad de los dos pseudo-elementos ::before y ::after tiene que ser opacity:1. De otra manera la descripción emergente vuelve de nuevo transparente.

.animado [data-tooltip]:hover::before,
.animado [data-tooltip]:hover::after
{opacity:1;} 

En un lugar de la Mancha de cuyo nombre no quiero acordarme, no ha mucho tiempo que vivía un hidalgo de los de lanza en astillero, adarga antigua, rocín flaco y galgo corredor. Una olla de algo más vaca que carnero, salpicón las más noches, duelos y quebrantos los sábados, lentejas los viernes, algún palomino de añadidura los domingos, consumían las tres partes de su hacienda.