2010-11-17 9 views

Respuesta

10

No directamente, pero hay algunas buenas sugerencias acerca de cómo minimizar el impacto de los reflujos aquí:

http://dev.opera.com/articles/view/efficient-javascript/?page=3

En resumen, intentar algo como esto:

El segundo método consiste en definir una nuevo atributo de estilo para el elemento, en lugar de asignar estilos uno por uno. La mayoría de las veces esto es adecuado para cambios dinámicos como animaciones, donde los nuevos estilos no se pueden conocer con antelación. Esto se hace usando la propiedad cssText del objeto de estilo , o usando setAttribute. Internet Explorer no permite la segunda versión , y necesita la primera. Algunos navegadores más antiguos, incluido Opera 8, necesitan el segundo enfoque, y no entienden el primero. Por lo tanto, la forma fácil es comprobar si la primera versión es es compatible y usarla, luego caer de nuevo a la segunda si no.

var posElem = document.getElementById('animation'); 
var newStyle = 'background: ' + newBack + ';' + 
    'color: ' + newColor + ';' + 
    'border: ' + newBorder + ';'; 
if(typeof(posElem.style.cssText) != 'undefined') { 
    posElem.style.cssText = newStyle; // Use += to preserve existing styles 
} else { 
    posElem.setAttribute('style',newStyle); 
} 
+0

buen enfoque. Solo tenga en cuenta que la primera parte del 'if' anulará cualquier estilo en línea ya presente. Establecer 'posElem.style.cssText + = newStyle' hará el truco de todos modos. Ver [violín] (http://jsfiddle.net/gleezer/Ae4XR/1/) – Nobita

+1

Buena captura de @Nobita, gracias. Corregido – Basic

+0

En realidad, podría ser que la sentencia if podría abandonarse dejando solo 'posElem.style.cssText + = newStyle' (de nuevo, ver actualizado [violín] (http://jsfiddle.net/gleezer/Ae4XR/2/)), ya que parece funcionar de la misma manera, incluso si los estilos no están ya allí. Sin embargo, no estoy seguro acerca de los caprichos del navegador aquí. – Nobita

0

Si estaba utilizando jQuery, que tiene una función .css que le permite añadir estilo a la vez múltiple:

$ ('element').css({'color':'red', 'border':'#555 solid thin'});

+0

Buen pensamiento: tendré que mirar lo que realmente hace detrás de las escenas – Basic

+2

Eso todavía causa un reflujo. – Tower

5

Se puede poner todos los estilos en un CSS clase

.foo { background:#000; color:#fff; ... } 

y después asignarlo a la propiedad className

// javascript 
var your_node = document.getElementById('node_id'); 
your_node.className = 'foo' 

que deben dar lugar a sólo un repinte/reflujo

+1

+1 Definitivamente el enfoque a seguir, en mi opinión. – lonesomeday

+2

-1 No responde realmente la pregunta, si las propiedades fueron preconocidas, obviamente la clase CSS sería el camino a seguir, sin embargo, si está utilizando js para calcular. los valores, entonces esto no funcionaría. – Kayote

0

También podemos establecer la visibilidad del elemento de 'oculto', a continuación, aplicar los estilos y luego hacerla visible de nuevo.

+1

Eso todavía causa un reflujo. – Tower

4

uso:

document.getElementById('elemnt_ID').setAttribute('style','color:white; margin:5px;'); 
Cuestiones relacionadas