2012-01-05 3 views
5

Qual è il modo più efficiente per impostare più stili sugli elementi in javascript?Il modo più efficace per impostare lo stile usando puro javascript?

for (i=0;i<=lastSelector;i++) { 
var e = mySelector[i], 
v = 'opacity 1s'; 
e.style.WebkitTransition = v; 
e.style.MozTransition = v; 
e.style.OTransition = v; 
e.style.MsTransition = v; 
e.style.transition = v; 
e.style.opacity = 0; 
}; 
+3

Se 'V è statico, vorrei utilizzare una classe e aggiungo solo la classe all'elemento. –

+0

@FelixKling: +1 – fcalderan

+0

FelixKling, buon punto! In questo caso non avrò accesso ai file CSS :) – Hakan

risposta

6

Praticamente questo, si potrebbe utilizzare un incarico impilati:

for (i=0;i<=lastSelector;i++) { 
    var e = mySelector[i]; 
    e.style.WebkitTransition = 
    e.style.MozTransition = 
     e.style.OTransition = 
     e.style.MsTransition = 
      e.style.transition = 
      'opacity 1s'; 
    e.style.opacity = 0; 
} 

Dal momento che ci sono parecchi di queste proprietà in cui abbiamo versioni specifiche del fornitore, si potrebbe considerare una funzione riutilizzabile che fa questo, ad esempio:

function setMultiVendorProp(style, propName, value) { 
    // Set the non-vendor version 
    style[propName] = value; 

    // Make first char capped 
    propName = propName.substring(0, 1).toUpperCase() + propName.substring(1); 

    // Set vendor versions 
    style["Webkit" + propName] = value; 
    style["Moz" + propName] = value; 
    style["O" + propName] = value; 
    style["Ms" + propName] = value; 

    // Done 
    return value; 
} 

O utilizzando lo stile tratteggiato invece, dal momento che stiamo già utilizzando stringhe piuttosto che identificatori:

function setMultiVendorProp(style, propName, value) { 
    // Set the non-vendor version 
    style[propName] = value; 

    // Set vendor versions 
    style["-webkit-" + propName] = value; 
    style["-moz-" + propName] = value; 
    style["-o-" + propName] = value; 
    style["-ms-" + propName] = value; 

    // Done 
    return value; 
} 

Poi:

for (i=0;i<=lastSelector;i++) { 
    var e = mySelector[i]; 
    setMultiVendorProp(e.style, "transition", "opacity 1s"); 
    e.style.opacity = 0; 
} 

note collaterali:

  • non c'è ; dopo la chiusura } in un comunicato for.
  • var ovunque in una funzione è a livello di funzione, quindi dichiarare var all'interno di blocchi non funzionali all'interno della funzione è (leggermente) fuorviante per il lettore del codice; Dettagli: Poor, misunderstood var
+0

Elegante. Penso :) – willem

+0

Questa è stata una novità per me! – Hakan

+0

@Hakan: un compito in pila? Sì, è piuttosto utile. È una conseguenza del fatto che l'espressione 'b = c' ha un valore (il valore dell'espressione è il valore di' c'), quindi in 'a = b = c', prima l'espressione' b = c' viene valutato, quindi viene valutato 'a = (valore del risultato)'. Si noti che il valore dell'estrema destra viene preso solo * una volta *, quindi per esempio 'a = b = func();' chiama solo 'func' ** una volta **, e il suo valore di ritorno è assegnato a' b', quindi il valore di tale espressione di assegnazione è assegnato a 'a'. Dettagli: [Spec section 11.13.1] (http://es5.github.com/#x11.13.1). –

2

si potrebbe provare questo:

var i, 
    es, 
    v = 'opacity 1s'; 
for (i=0;i<=lastSelector;i++) { 
    es = mySelector[i].style; 

    es.WebkitTransition = v; 
    es.MozTransition = v; 
    es.OTransition = v; 
    es.MsTransition = v; 
    es.transition = v; 
    es.opacity = 0; 
}; 

Non c'è bisogno di impostare v = 'opacity 1s' ogni volta che si passa attraverso il ciclo, basta impostare una volta prima del ciclo. E fintanto che stiamo spostando la dichiarazione di v, nota che JS ha solo l'ambito della funzione, quindi dichiarare le variabili in un ciclo non limita effettivamente il loro ambito a quel ciclo.

+0

Naturalmente nnnnnn, ho perso questo nel mio esempio ... È necessario dichiarare "i"? – Hakan

+1

Qualsiasi variabile che non dichiari esplicitamente con 'var' diventerà una variabile globale. Ciò può causare bug difficili da trovare, ad esempio, se all'interno del ciclo for hai chiamato una funzione che utilizzava anche 'i'. – nnnnnn

0

Forse in una funzione:

function setStyles(styles, element, value) 
{ 
    for(var i=0,l=styles.length;i<l;i++) 
     { 
      if(p in element.style) 
       element.style[p] = value; 
     } 
    }; 
} 

così si può chiamare:

var s = ['WebkitTransition','MozTransition','OTransition','MsTransition','transition']; 
for (i=0;i<=lastSelector;i++) { 
    var e = mySelector[i], 
    v = 'opacity 1s'; 
    setStyles(s,e,v); 
    e.style.opacity = 0; 
}; 
Problemi correlati