Foros del Web » Programando para Internet » Javascript »

[SOLUCIONADO] Usar transiciones CSS3 para simplificar código Javascript

Estas en el tema de Usar transiciones CSS3 para simplificar código Javascript en el foro de Javascript en Foros del Web. Buenas. Estoy intentando aprovechar las transiciones de CSS3 para simplificar un efecto de cambio gradual con javascript. La idea es sencilla. Tengo un texto: @import ...
  #1 (permalink)  
Antiguo 04/12/2013, 13:28
 
Fecha de Ingreso: julio-2006
Ubicación: Barcelona
Mensajes: 244
Antigüedad: 17 años, 10 meses
Puntos: 32
Usar transiciones CSS3 para simplificar código Javascript

Buenas.

Estoy intentando aprovechar las transiciones de CSS3 para simplificar un efecto de cambio gradual con javascript. La idea es sencilla. Tengo un texto:
Código HTML:
Ver original
  1. <p><span>blablabla</span><span>bleble</span></p>
Y cuando le doy a un botón se convierte en:
Código HTML:
Ver original
  1. <p><span>blablabla</span><span>hola</span><span>bleble</span></p>
Pero la idea es que esta inserción sea gradual. Esto se me ha ocurrido hacerlo iniciando la opacidad y tamaño de la fuente del elemento insertado a 0 y luego cambiarla con una transición. Sin embargo, algo debo hacer mal.

Muestro el código HTML:
Código HTML:
Ver original
  1. <!DOCTYPE html>
  2. <html lang='es'>
  3.   <head>
  4.     <meta charset='UTF-8' />
  5.     <script type='text/javascript' src='js/insert_text.js'></script>
  6.     <title>Insertando texto</title>
  7.   </head>
  8.   <body>
  9.     <header>
  10.       <h1>Insertando texto</h1>
  11.     </header>
  12.     <section id='option_1'>
  13.       <div>
  14.         <button id='button_1'>insertar</button>
  15.       </div>
  16.       <p><span>blablabla</span><span>bleble</span></p>
  17.     </section>
  18.   </body>
  19. </html>

Y el código Javascript:
Código Javascript:
Ver original
  1. // crear elemento del tirón
  2. Document.prototype.create = function( tag, text ) {
  3.     var elem = document.createElement( tag );
  4.     if( typeof text == 'string' ) {
  5.         elem.appendChild( document.createTextNode( text ) );
  6.     } else if( text instanceof Node ) {
  7.         elem.appendChild( text );
  8.     } else {
  9.         elem = null;
  10.     }
  11.     return elem;
  12. }
  13.  
  14. // inserta node como el hijo pos-esimo
  15. Node.prototype.insert = function ( node, pos ) {
  16.     var nodes = this.childNodes;
  17.     var n = nodes.length;
  18.     if( pos < n ) {
  19.         this.insertBefore( node, nodes[pos] );
  20.     } else if( pos == n ) {
  21.         this.appendChild( node );
  22.     } else {
  23.         return null;
  24.     }
  25.     return node;
  26. }
  27.  
  28. window.onload = function() {
  29.  
  30.     document.getElementById( 'button_1' ).onclick = function() {
  31.         // crear elemento span invisible
  32.         var span = document.create( 'span', 'hola' );
  33.         span.style.fontSize = '0px';
  34.         span.style.opacity = '0.0';
  35.         span.style.color = 'red';
  36.         // efecto transition para qu al cambiar alguna propiedad lo haga gradualmente
  37.         span.style.setProperty('transition', 'all 2s linear');
  38.         span.style.setProperty('-webkit-transition', 'all 2s linear');
  39.  
  40.         // insertar elemento como segundo hijo de p
  41.         var section = this.parentNode.parentNode;
  42.         elem = section.getElementsByTagName('p')[0];
  43.         var inserted = elem.insert( span, 1 );
  44.  
  45.         // hacer visible el nodo
  46.         if( inserted ) {
  47.             inserted.style.fontSize = '20px';
  48.             inserted.style.opacity = '1.0';
  49.         }
  50.  
  51.     }
  52. }

A parte de preguntarme donde esta el error, ¿creéis que es buena la idea de aprovecharme de las nuevas propiedades CSS para conseguir el efecto?

Un saludo y gracias!
  #2 (permalink)  
Antiguo 04/12/2013, 13:38
Colaborador
 
Fecha de Ingreso: septiembre-2013
Ubicación: España
Mensajes: 3.648
Antigüedad: 10 años, 8 meses
Puntos: 578
Respuesta: Usar transiciones CSS3 para simplificar código Javascript

document.prototype con minúscula
  #3 (permalink)  
Antiguo 04/12/2013, 13:49
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 3 meses
Puntos: 206
Respuesta: Usar transiciones CSS3 para simplificar código Javascript

Sí y no. Lo que quieres hacer no se hace editando estilos con javascript. Metes los estilos esos en una clase CSS, y con javascript le pones o le quitas la clase al elemento que quieras.
  #4 (permalink)  
Antiguo 04/12/2013, 13:59
 
Fecha de Ingreso: julio-2006
Ubicación: Barcelona
Mensajes: 244
Antigüedad: 17 años, 10 meses
Puntos: 32
Respuesta: Usar transiciones CSS3 para simplificar código Javascript

Cita:
Iniciado por PHPeros
document.prototype con minúscula
Tengo entendido que no. Una cosa es la [URL="http://krook.org/jsdom/Document.html"]clase Document[/URL] y la otra la instancia.

Cita:
Iniciado por marlanga
Sí y no. Lo que quieres hacer no se hace editando estilos con javascript. Metes los estilos esos en una clase CSS, y con javascript le pones o le quitas la clase al elemento que quieras.
Me parece muy elegante lo que propones voy a intentarlo, a ver que ocurre.

Un saludo!
  #5 (permalink)  
Antiguo 04/12/2013, 14:26
 
Fecha de Ingreso: julio-2006
Ubicación: Barcelona
Mensajes: 244
Antigüedad: 17 años, 10 meses
Puntos: 32
Respuesta: Usar transiciones CSS3 para simplificar código Javascript

He creado este fichero CSS:
Código CSS:
Ver original
  1. /* css/test.css */
  2. .transition {
  3.   -webkit-transition: all 2s linear;
  4.      -moz-transition: all 2s linear;
  5.       -ms-transition: all 2s linear;
  6.        -o-transition: all 2s linear;
  7.           transition: all 2s linear;
  8. }
  9.  
  10. .minimized {
  11.   font-size: 0px;
  12.   opacity: 0.0;
  13. }
y lo he insertado en el código HTML
Código HTML:
Ver original
  1. <!DOCTYPE html>
  2. <html lang='es'>
  3.   <head>
  4.     <meta charset='UTF-8' />
  5.     <link rel='stylesheet' type='text/css' href='css/test.css' />
  6.     <script type='text/javascript' src='js/insert_text.js'></script>
  7.     ...

He modificado el manejador de eventos simplicandose a esto:
Código Javascript:
Ver original
  1. window.onload = function() {
  2.  
  3.     document.getElementById( 'button_1' ).onclick = function() {
  4.         // crear elemento span invisible
  5.         var span = document.create( 'span', 'hola' );
  6.         span.className = 'transition minimized';
  7.  
  8.         // insertar elemento como segundo hijo de p
  9.         var section = this.parentNode.parentNode;
  10.         elem = section.getElementsByTagName('p')[0];
  11.         var inserted = elem.insert( span, 1 );
  12.  
  13.         // hacer visible el nodo
  14.         if( inserted ) {
  15.             inserted.className = 'transition';
  16.         }
  17.     }
  18. }
Pero sigue sin haber transición. El elemento se inserta correctamente pero de forma instantánea.


Edit, he probado con la propiedad classList y sus métodos add y remove pero sigo con el mismo problema:
Código Javascript:
Ver original
  1. // crear elemento span invisible
  2.         var span = document.create( 'span', 'hola' );
  3.         span.classList.add('transition');
  4.         span.classList.add('minimized';
  5.  
  6.         // insertar elemento como segundo hijo de p
  7.         var section = this.parentNode.parentNode;
  8.         elem = section.getElementsByTagName('p')[0];
  9.         var inserted = elem.insert( span, 1 );
  10.  
  11.         // hacer visible el nodo
  12.         if( inserted ) {
  13.             inserted.classList.remove('minimized');
  14.         }
Un saludo!

Última edición por Pantaláimon; 04/12/2013 a las 15:10
  #6 (permalink)  
Antiguo 04/12/2013, 15:21
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 3 meses
Puntos: 206
Respuesta: Usar transiciones CSS3 para simplificar código Javascript

http://jsfiddle.net/b99XN/1/

Para acceder al prototype, Document.prototype es con mayúscula.
Al parecer, si creas el elemento y le insertas clases con efectos transition, no hacen la transición y hacen los cambios de golpe.
Pero como soy un tío listísimo he usado un timeout para que meta la clase después de crearlo y he esquivado el bug (porque creo es un bug) que tiene el navegador. Por lo menos el chrome, soy demasiado gandul para abrir y probarlo con otros.
  #7 (permalink)  
Antiguo 04/12/2013, 16:45
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 10 meses
Puntos: 1012
Respuesta: Usar transiciones CSS3 para simplificar código Javascript

y por qué no en lugar de usar transition de css3, que no es crooss-browser, usas simplemente javascript??

Cita:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<script type="text/javascript">
function transicion() {

var box = document.getElementById('tran');
var empieza = new Date().getTime();

(function opacidad(empieza, transOpacidad, tiempoFade) {

setTimeout(function() {

var ahora = new Date().getTime();

if (transOpacidad <= 100) {

if ((ahora - empieza) < tiempoFade) {

var avance = ((ahora - empieza) / tiempoFade);
var opac = transOpacidad + ((100 - transOpacidad) * avance);

box.style.opacity = parseFloat(opac/100).toFixed(2);
box.style.filter = 'alpha(opacity =' + opac + ')';
box.style.display = (opac > .01) ? 'inline' : 'none';
opacidad(empieza, transOpacidad, tiempoFade);

} else {

box.style.opacity = 1;
box.style.filter = 'alpha(opacity ="100")';
}
}

}, 1);


})(empieza, 0, 3000);

}

</script>
</head>
<body>
<span onclick="transicion();">Mostrar</span>
<div id="tran" style="width: 100px; background-color: #CCC; display: none"> un bloque que estaba oculto</div>
</body>
</html>
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #8 (permalink)  
Antiguo 04/12/2013, 18:37
 
Fecha de Ingreso: julio-2006
Ubicación: Barcelona
Mensajes: 244
Antigüedad: 17 años, 10 meses
Puntos: 32
Respuesta: Usar transiciones CSS3 para simplificar código Javascript

Me ha sorprendido esta solución recursiva. Buena parte de los compiladores/intérpretes de lenguajes estan enfocados a ser más eficientes con soluciones iterativas antes que recursivas. Aunque hay algunos más enfocados a la programación funcional que convierten ciertos tipos de recursividad en iteración de forma bastante eficiente. ¿Es el caso de Javascript?

Me había enfocado a buscar una solución con transition por varias razones. Aún estoy empezando y el API de Javascript se me hace muy grande ahora al principio, por eso busco hacer cosas más sencillas y aprovechando lo que ya sé. Por otro lado, con CSS3 ya tendria la mayoría del trabajo hecho y bien separado. Por ejemplo, si ahora quiero cambiar la timing-function de linear a ease-out o ease-in, me seria muy fácil. De la otra manera debería reinventarme la función cubic-bezier() de nuevo. Por otra parte, y desde la poca experiencia que tengo ahora, prefiero intentar aprender un estándar antes que meterme en los terrenos del cross-browser. A la vez, es una manera de hacer presión y que los navegadores fuera del estándar se vayan poniendo las pilas.

Ya miraré a ver que averiguo en stackoverflow las razones del "bug" que de momento he comprobado que ocurre tanto en chrome como firefox y comento algo por aquí.

Un saludo y gracias.
  #9 (permalink)  
Antiguo 05/12/2013, 05:49
 
Fecha de Ingreso: julio-2006
Ubicación: Barcelona
Mensajes: 244
Antigüedad: 17 años, 10 meses
Puntos: 32
Respuesta: Usar transiciones CSS3 para simplificar código Javascript

He encontrado información de por qué puede ocurrir ese comportamiento (parece que no es un bug):
Cita:
There is only one JavaScript thread per window. Other activities like rendering, downloading etc may be managed by separate threads, with different priorities.
(El resaltado es mío)

En esa web también habla del trick setTimeout( ..., 0 ) para la sincronización de algunas sentencias. Tendré que estudiarla en profundidad.

Un saludo!
  #10 (permalink)  
Antiguo 05/12/2013, 07:30
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 10 meses
Puntos: 1012
Respuesta: Usar transiciones CSS3 para simplificar código Javascript

puede que sea una solución el uso del temporizador. aquí lo uso, en la función copypasteRaton para invocar la función autoCompletaRaton y de este modo despliegue la capa
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #11 (permalink)  
Antiguo 05/12/2013, 07:45
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 3 meses
Puntos: 206
Respuesta: Usar transiciones CSS3 para simplificar código Javascript

Yo no conocía ese problema, nunca me había topado con él; pero mi ego crece aún más sabiendo que he llegado sin ayuda a la misma solución que otros buenos programadores de javascript.
No podeis verme, pero ahora mismo me estoy dando besos en los hombros y brazos.
  #12 (permalink)  
Antiguo 06/12/2013, 05:16
 
Fecha de Ingreso: julio-2006
Ubicación: Barcelona
Mensajes: 244
Antigüedad: 17 años, 10 meses
Puntos: 32
Respuesta: Usar transiciones CSS3 para simplificar código Javascript

Si os interesa, encontré esta entrada donde el usuario DVK da una explicación muy didáctica sobre setTimeout(... , 0 ). Doy el tema por solucionado.

Un saludo y gracias!

Etiquetas: css3, html, js, simplificar, usar
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 17:04.