Foros del Web » Creando para Internet » CSS »

Duda sobre HSL transition (arcoiris).

Estas en el tema de Duda sobre HSL transition (arcoiris). en el foro de CSS en Foros del Web. Vamos a poner el tema en contexto. Hay una función CSS que aplica colores según una paleta que varía en tono, saturación y brillo. Es ...
  #1 (permalink)  
Antiguo 26/10/2012, 12:19
(Desactivado)
 
Fecha de Ingreso: noviembre-2002
Ubicación: Ciudad Autónoma de Buenos Aires
Mensajes: 2.367
Antigüedad: 22 años
Puntos: 317
Pregunta Duda sobre HSL transition (arcoiris).

Vamos a poner el tema en contexto.

Hay una función CSS que aplica colores según una paleta que varía en tono, saturación y brillo. Es la hsl(), y para entenderla hay que imaginar un círculo con radios sucesivos que degradan a través de todos los colores.
En este sitio hay una imagen con la descripción

http://demosthenes.info/blog/61/An-E...-Color-In-CSS3

Los valores de saturation y lightness se escriben en formato de porcentaje, de 0 a 100. Pero hue es el que justifica el gráfico circular, porque se escribe en grados que van desde 0 hasta casi 360. Ya que a los 360° (como en cualquier circunsferencia) se vuelve a 0. En este caso, se vuelve al rojo del inicio.

Existe también en CSS 3 una animación de tipo script llamada transition, que usa los valores

Código:
transition: [propiedad a cambiar], [duración de cambio en seg.], [modo de cambio];
Sirve -en principio- cuando tenemos propiedades asignadas a un elemento, y ante un (p.e.) :hover les queremos cambiar los valores; pero de manera gradual, paso a paso desde los originales hasta los nuevos, asignando el tiempo entre ambos.

Esto funciona perfecto en valores lineales. Si tenemos una fuente de 10px y la queremos llevar a 50px en 4 segundos, el CSSscript la va a "agrandar" a diez pixeles por segundo.

¿Pero qué pasa con los valores angulares?.
El cálculo es más complejo. Porque es un número "cerrado", y cuando termina empieza de nuevo como si fuese un "lineal infinito".

El estandar CSS lo reconoce como tal. En el caso de hue (primer valor de hsl();) después de 359° vuelve a 0°, y por lo tanto acepta valores negativos, donde -120 es igual a 240.

Pero transition no lo entiende.
Debería hacerlo, y al final, no. Los navegadores convierten el formato a color decimal (o hexadecimal) y después hacen las cuentas de transición.
Así, convertido a lineal, no podemos hacer el efecto de "transición arcoiris", que es pasar un elemento por todos los colores desde 0° a 359°. Lo más que podemos llegar es a "180°".

Para entenderlo mejor, usemos un caso extremo : vayamos de hsl(2, 100%, 50%) a hsl(358, 100%, 50%). En vez de recorrer todo el espectro desde 2 hasta 358 en sentido horario, en la práctica va a tomar el camino corto, que sería el antihorario de solamente 4°. Y se vería siempre el mismo rojo (o casi).

Les dejo una herramienta que hice para ver los caminos que toman estos colores en un minuto, está hecha para Mozilla, por el tema de los prefijos moz, pero si lo quieren probar con otros se los cambian.
Se inicia poniendo la manito (el puntero) sobre el título, y al sacarla se resetea. Hay una lista de colores de referencia y un escript para mostrar los valores que asigna cada segundo el CSS (es para FF y Chr, no sé Op). Ah!, y un relojito CSS para tomar el tiempo.

Código:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<meta http-equiv=Content-Type content="text/html; charset=utf-8">
<title>TEXTO ARCOIRIS.</title>
<script type="text/javascript">
var cuenta;

function leer() {
clearTimeout(cuenta);

var texto = document.getElementsByTagName("h1")[0]; 
var colorTexto = document.defaultView.getComputedStyle(texto, null).getPropertyValue("color");

document.getElementById("lista").value += colorTexto +"\n";

cuenta = setTimeout(leer, 1000);
}

</script>
<style type="text/css">
body {font-size: 100%; background-color: silver; }
h1 {font: 900 5em/3em sans-serif; height: 2em; text-align:center; cursor: -moz-grab; 
margin: -1em 0 0; 
		color: hsl(0, 100%, 50%); }
h1:hover {	color: hsl(180, 100%, 50%); 
-moz-transition: color 60s linear; }

#reloj {position: absolute; width: 1.2em; overflow: hidden; border: 1px solid black; 
font: bold 0.6em/0.6em monospace; color: black; height: .7em; right: 10px; }
#cuenta {white-space: nowrap; margin-left: 0; background: lime; overflow: hidden; 
color: black; padding-top: 0.12em; }
h3 , textarea {float: left; width: 45%; margin-right: 10px; }

h1:hover #cuenta{margin-left: -106em; -moz-transition: margin-left 60s linear; }
}
</style>
</head>
<body>

<h1 onmouseover="leer()" onmouseout="clearTimeout(cuenta)">FOROS DEL WEB
<div id=reloj><div id=cuenta>
00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
</div></div></h1>

<textarea id="lista" cols=50 rows=70></textarea>
<h3 style="color: hsl(0, 100%, 50%);" >0 FOROS DEL WEB -359</h3>
<h3 style="color: hsl(60, 100%, 50%);" >60 FOROS DEL WEB -300</h3>
<h3 style="color: hsl(120, 100%, 50%);" >120 FOROS DEL WEB -240</h3>
<h3 style="color: hsl(180, 100%, 50%);" >180 FOROS DEL WEB -180</h3>
<h3 style="color: hsl(240, 100%, 50%);" >240 FOROS DEL WEB -120</h3>
<h3 style="color: hsl(300, 100%, 50%);" >300 FOROS DEL WEB -60</h3>
<h3 style="color: hsl(359, 100%, 50%);" >359 FOROS DEL WEB 0</h3>
<input type=button value="BORRA LISTA COLORES."
onclick="document.getElementById('lista').value = ''" >


</body>
</html>
Ahora sí, la pregunta : ¿Hay alguna manera (aunque sea proyecto) de decirle a transition en qué dirección moverse?. ¿O para hacer la transición "arcoiris" tenemos que morir en javascript?.

Gracias.

furoya
  #2 (permalink)  
Antiguo 26/10/2012, 13:08
Avatar de pitufoweb  
Fecha de Ingreso: enero-2008
Ubicación: Un Mundo Raro
Mensajes: 1.148
Antigüedad: 16 años, 10 meses
Puntos: 181
Respuesta: Duda sobre HSL transition (arcoiris).

Que bien!

Voy a jugar un rato con tu código para ver si de casualidad encuentro algo.


A simple vista he notado un par de errores en el código (que no tiene nada que ver con el problema).

1. Hay una llave que sobra justo antes de </style>

2. tienes los div's dentro del H1 y creo que no es correcto.


Saludos
__________________
------------- " La felicidad no llega de afuera, nace desde dentro. " -------------
  #3 (permalink)  
Antiguo 26/10/2012, 13:21
(Desactivado)
 
Fecha de Ingreso: noviembre-2002
Ubicación: Ciudad Autónoma de Buenos Aires
Mensajes: 2.367
Antigüedad: 22 años
Puntos: 317
Respuesta: Duda sobre HSL transition (arcoiris).

Uy, lo edité mil veces mientras hacía los experimentos. La llave se me quedó de alguno. Gracias por avisar.

Eso del div no estoy seguro. Tiene lógica desde el punto de vista de la diagramación, pero es una caja de bloque que puede servir para agregarle cualquier cosa a un título; desde una ilustración ... a un flash.

Seguro va a aparecer alguien que sepa y nos saca de la duda.
  #4 (permalink)  
Antiguo 26/10/2012, 14:14
Avatar de pzin
Moderata 😈
 
Fecha de Ingreso: julio-2002
Ubicación: Islas Canarias
Mensajes: 10.489
Antigüedad: 22 años, 3 meses
Puntos: 2114
Respuesta: Duda sobre HSL transition (arcoiris).

Nunca he usado @keyframes, pero dado que se pueden hacer animaciones de forma secuencial, ¿no podría resultar para que pase por tal y cual grado?

Código CSS:
Ver original
  1. @keyframes rueda {
  2.   0% {
  3.     color: hsl(0, 100%, 50%);
  4.   }
  5.   50% {
  6.     color: hsl(180, 100%, 50%);
  7.   }
  8.   100% {
  9.     color: hsl(360, 100%, 50%);
  10.   }
  11. }

Supongo, que no lo sé, que esto sólo funcionaría con animation, no sé si puede usarse con transition.
  #5 (permalink)  
Antiguo 26/10/2012, 16:14
(Desactivado)
 
Fecha de Ingreso: noviembre-2002
Ubicación: Ciudad Autónoma de Buenos Aires
Mensajes: 2.367
Antigüedad: 22 años
Puntos: 317
Respuesta: Duda sobre HSL transition (arcoiris).

Tengo entendido que los keyframes son todavía menos compatibles que transition; para un caso práctico serían una opción. Aunque no mejor que javascript, que sí sería compatible.

Pero en todo caso, con CSS hay que poner los valores a mano. La idea de la transición es que el cálculo lo haga el navegador. Los desarrolladores se pasaron de pícaros; la quisieron hacer fácil y así no funciona. Los valores van de 0 a 359, y tiene que pasar por todos.

Bueno, ya van a inventar el hslQuery para corregirlo.
  #6 (permalink)  
Antiguo 26/10/2012, 20:52
Avatar de pitufoweb  
Fecha de Ingreso: enero-2008
Ubicación: Un Mundo Raro
Mensajes: 1.148
Antigüedad: 16 años, 10 meses
Puntos: 181
Respuesta: Duda sobre HSL transition (arcoiris).

Tome la idea de Bonex de hacerlo con Animation.

Con Animation pasa lo mismo que con Transition. Si ponemos que valla de 0° a 300°, simplemente "girara" -60°.

La ventaja de Animation es que podemos poner Keyframes. Con estos "le podemos indicar" en que dirección ir.

Use un Keyframe para indicarle cada uno de los colores; Red(0°), Yellow(60°), Green(120°), Cyan(180°), Blue(240°), Magenta(300°) y Red(359°). Así me aseguro de que gire los 360°.

Código HTML:
<!DOCTYPE html>
<html lang="es">
<head>
	<meta charset="UTF-8" />
	<title>Colores HSL</title>
	<style type="text/css">
		@-moz-keyframes colores {
		  0%  { color: hsl(0, 100%, 50%); }    /*  Red     */
		  16% { color: hsl(60, 100%, 50%); }   /*  Yellow  */
		  33% { color: hsl(120, 100%, 50%); }  /*  Green   */
		  50% { color: hsl(180, 100%, 50%); }  /*  Cyan    */
		  66% { color: hsl(240, 100%, 50%); }  /*  Blue    */
		  83% { color: hsl(300, 100%, 50%); }  /*  Magenta */
		  100%{ color: hsl(359, 100%, 50%); }  /*  Red     */
		}
		
		h1 { color: hsl(1, 100%, 50%); }
		h1:hover { -moz-animation: colores 36s linear 1; }	
	</style>
</head>

<body>
<h1>FOROS DEL WEB</h1>
</body>
</html> 
Al final creo que no es exactamente lo que estabas buscando, pero me sirvio de ejercicio



Saludos
__________________
------------- " La felicidad no llega de afuera, nace desde dentro. " -------------

Última edición por pitufoweb; 26/10/2012 a las 22:39
  #7 (permalink)  
Antiguo 27/10/2012, 07:19
(Desactivado)
 
Fecha de Ingreso: noviembre-2002
Ubicación: Ciudad Autónoma de Buenos Aires
Mensajes: 2.367
Antigüedad: 22 años
Puntos: 317
Respuesta: Duda sobre HSL transition (arcoiris).

Está perfecto, gracias. Es otra opción usando CSS.
De última vemos que es posible, aunque incompatible por ahora.

Vamos a esperar a que los desarrolladores de browsers se animen a meter algunas líneas más de código y les hagan reconocer valores negativos y positivos a hue, para saber hacia qué lado tienen que 'transicionar'.
Porque me parece que con JS va a consumir muchos recursos...
  #8 (permalink)  
Antiguo 09/11/2012, 06:03
Avatar de pzin
Moderata 😈
 
Fecha de Ingreso: julio-2002
Ubicación: Islas Canarias
Mensajes: 10.489
Antigüedad: 22 años, 3 meses
Puntos: 2114
Respuesta: Duda sobre HSL transition (arcoiris).

Curiosamente con los filtros de webkit funciona sin añadidos respetando el giro natural de la rueda sin buscar el camino más corto.

http://jsfiddle.net/8SNhg/

Otra solución incompatible.

Tanto quejarnos de GIF's animados y sigue siendo de lo más compatible.
  #9 (permalink)  
Antiguo 11/11/2012, 06:54
(Desactivado)
 
Fecha de Ingreso: noviembre-2002
Ubicación: Ciudad Autónoma de Buenos Aires
Mensajes: 2.367
Antigüedad: 22 años
Puntos: 317
Respuesta: Duda sobre HSL transition (arcoiris).

Gracias, pero podrías haber puesto el código acá.

Es cierto, ese filtro apunta directamente al hue; aunque no trabaja tan bien al menos mueve el valor por grados (positivos y negativos).

Es otra forma, en vez de decirle dónde empezar y terminar, se le da un inicio y la cantidad de grados a girar.
  #10 (permalink)  
Antiguo 11/11/2012, 08:11
Avatar de pzin
Moderata 😈
 
Fecha de Ingreso: julio-2002
Ubicación: Islas Canarias
Mensajes: 10.489
Antigüedad: 22 años, 3 meses
Puntos: 2114
Respuesta: Duda sobre HSL transition (arcoiris).

Si la verdad no parece tan suave el movimiento como con hsl().

Código CSS:
Ver original
  1. div {
  2.     width: 200px;
  3.     height: 200px;
  4.     background: yellow;
  5.     -webkit-transition: -webkit-filter 10s;
  6. }
  7.  
  8. div:hover {
  9.     -webkit-filter: hue-rotate(360deg);
  10. }


Etiquetas: angular, animacion, gradiente, hsl, transition
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:37.