Establecer Valores De Fotogramas Clave De Webkit Usando La Variable Javascript


Tengo un fragmento de código JS para generar números aleatorios y mostrarlos como variables que se utilizarán aquí en lugar de los valores de rotación

@-webkit-keyframes rotate {
    0% {-webkit-transform: rotate(-10deg);}
    100% {-webkit-transform: rotate(10deg);}
}

#dog{
/*irrelevant settings*/
-webkit-animation: rotate 5s infinite alternate ease-in-out;
}

El código anterior funciona bien, sin embargo, cuando intento pegar las variables del javascript en rotate(variable); no puedo hacer que funcione. Soy nuevo en esto, así que estoy 90% seguro de que simplemente no tengo la sintaxis correcta para la variable (en serio, soy terrible para recordar si algo necesita corchetes, comillas, garabatos, etc. y he intentado todo lo que puedo pensar de).

O podría ser porque la variable es local a la función y CSS no puede leer eso.

Así que básicamente solo necesito algún extraño que me diga la sintaxis correcta y cómo hacer que CSS lea la variable si es posible.

De lo contrario, parece que necesitaré la función para crear la totalidad de:

@-webkit-keyframes rotate {
    0% {-webkit-transform: rotate(-10deg);}
    100% {-webkit-transform: rotate(10deg);}
}

...lo que podría ser un poco desordenado ya que la variable aleatoria probablemente se aplicará a múltiples elementos CSS.

Oh y actualmente la variable es formateado para incluir el deg después del número por lo que no es el problema. De hecho, por el bien de la facilidad solo asumir que estoy usando var dogValue = "20deg"; y olvidar el elemento aleatorio.

Gracias.

Author: Sasha, 2012-04-27

3 answers

Está bien, no es como se ve su código real, pero no puede lanzar variables JavaScript en CSS, no las reconocerá.

En su lugar, debe crear las reglas CSS a través de JavaScript e insertarlas en el CSSOM (CSS Object Model). Esto se puede hacer de varias maneras: puede crear una animación de fotogramas clave y agregarla, o puede sobrescribir una animación existente. Por este motivo de esta pregunta, voy a asumir que desea sobrescribir continuamente un fotograma clave existente animación con diferentes valores de rotación.

He reunido (y documentado) un JSFiddle para que le eches un vistazo: http://jsfiddle.net/russelluresti/RHhBz/2 /

Comienza ejecutando una animación de rotación de -10 -> 10 grados, pero luego puede hacer clic en el botón para que ejecute una rotación entre valores aleatorios (entre -360 y 360 grados).

Este ejemplo fue hackeado principalmente a partir de experimentos anteriores realizados por Simon Hausmann. Puedes ver la fuente aquí: http://www.gitorious.org/~simon/qtwebkit/simons-clone/blobs/ceaa977f87947290fa2d063861f90c820417827f/LayoutTests/animations/change-keyframes.html (mientras ese enlace funcione, gitorious es bastante malo manteniendo urls).

También he tomado el código de la función randomFromTo JavaScript de aquí: http://www.admixweb.com/2010/08/24/javascript-tip-get-a-random-number-between-two-integers/

He añadido documentación a las partes del Simon Hausmann script que he tomado de él (aunque los he modificado ligeramente). También he utilizado jQuery solo para adjuntar el evento de clic a mi botón all todos los demás script está escrito en JavaScript nativo.

He probado esto para Chrome 18 y Safari 5.1, y parece funcionar bien en ambos navegadores.

Espero que esto ayude.

 71
Author: RussellUresti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-27 04:09:49

En chrome 49 en adelante y Firefox 48 en adelante, puede aprovechar la nueva API de Javascript element.animate() para insertar sus animaciones de fotogramas clave.

Por favor, tenga en cuenta que esta API es experimental y no funciona cross browser excepto por el mencionado anteriormente.

Soluciones fechadas como agregar class o inyectar fotogramas clave podrían aprovecharse para la compatibilidad con versiones anteriores. Una cuña para el mismo no estaba disponible inmediatamente.

Tiró del MDN ejemplo

document.getElementById("tunnel").animate([
  // keyframes
  { transform: 'translateY(0px)' }, 
  { transform: 'translateY(-300px)' }
], { 
  // timing options
  duration: 1000,
  iterations: Infinity
});

Refiérase:

 5
Author: DDM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-25 09:32:48

Para cualquiera que esté buscando esta respuesta en 2017, esto es lo que ha cambiado en RussellUresti answer.

En su ejemplo esto ya no funcionará:

keyframes.insertRule("0% { -webkit-transform: rotate(" + randomFromTo(-360,360) + "deg); }");
keyframes.insertRule("100% { -webkit-transform: rotate(" + randomFromTo(-360,360) + "deg); }");

Esto se debe a .insertRule () es un nombre no estándar. Lo es ahora .appendRule (), así que el código de RusselsUresti ahora será:

keyframes.appendRule("0% { -webkit-transform: rotate(" + randomFromTo(-360,360) + "deg); }");
keyframes.appendRule("100% { -webkit-transform: rotate(" + randomFromTo(-360,360) + "deg); }");

Puede encontrar más información sobre CSSKeyframeRule aquí

 0
Author: connoraworden,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-22 12:50:54