2010-06-01 12 views
34

Sto cercando di trovare alcune semplici modifiche alle prestazioni lato client in una pagina che riceve milioni di visualizzazioni di pagine mensili. Una preoccupazione che ho è l'uso del selettore universale CSS (*).Qual è l'impatto sulle prestazioni del selettore universale?

Come esempio, si consideri un semplice documento HTML come il seguente:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 
    <title>Example</title> 
    <style type="text/css"> 
     * { 
     margin: 0; 
     padding: 0; 
     } 
    </head> 
    <body> 
    <h1>This is a heading</h1> 
    <p>This is a paragraph of text.</p> 
    </body> 
</html> 

Il selettore universale applicherà la dichiarazione di cui sopra per gli elementi body, h1 e p, poiché queste sono le uniche nel documento.

In generale, dovrei vedere meglio le prestazioni da una norma come:

body, h1, p { 
    margin: 0; 
    padding: 0; 
} 

O sarebbe questo avere esattamente lo stesso effetto netto?

Il selettore universale esegue più lavoro di cui non sono a conoscenza?

Mi rendo conto che l'impatto sulle prestazioni in questo esempio può essere molto piccolo, ma spero di imparare qualcosa che potrebbe portare a miglioramenti delle prestazioni più significativi nelle situazioni del mondo reale.

Non ho intenzione di sovrascrivere gli stili nella regola del selettore universale con altri stili più avanti nel documento, ad esempio utilizzandolo come un foglio di stile di ripristino rapido e sporco. In realtà sto cercando di usare il selettore universale esattamente come penso che sia destinato - per applicare una regola a tutti gli elementi nel documento, una volta per tutte.

In definitiva, spero di determinare se c'è qualcosa di intrinsecamente lento nel selettore universale, o se ha appena un brutto colpo di rap a causa di un uso scorretto sfrenato. Se * { margin: 0; } è letteralmente equivalente a body, h1, p { margin: 0; }, allora questo risponderà alla mia domanda, e saprò di andare con il primo poiché è più conciso. Altrimenti, voglio capire perché il selettore universale funzioni più lentamente.

+3

Dal punto di vista delle prestazioni, quando è _ever_ migliore disabilitare globalmente (o abilitare) una caratteristica per _everything_ solo per eventualmente reimpostarla? L'apprendimento delle impostazioni predefinite del browser non richiede molto tempo: è possibile ottenere suggerimenti dai file CSS "ripristinati", ma non mi spingerei a utilizzarne uno. I browser open source hanno impostazioni predefinite CSS open source che puoi guardare. – reisio

+0

Non sono sicuro di aver capito la mia domanda. Non sto cercando di ripristinare e quindi riapplicare gli stili qui, ma piuttosto applicare una regola a ogni elemento della pagina. La mia domanda è se sia tecnicamente lo stesso usare il selettore universale così com'è selezionare singolarmente ogni elemento, o se comporta una penalizzazione delle prestazioni per qualsiasi motivo. – Bungle

+0

'*' non è letteralmente equivalente a 'body, h1, p' per ovvi motivi. La * sola * ragione per cui si comporta più lentamente è perché si applicano gli stili a tutto, mentre ogni altro selettore ti limita a uno specifico sottoinsieme di elementi nel DOM. Ma la vera domanda è: è molto più lento che un browser non risponda applicando troppi stili? Ne dubito fortemente. Vedi anche: [* {ridimensionamento della casella: border-box} FTW] (http://paulirish.com/2012/box-sizing-border-box-ftw) – BoltClock

risposta

1

L'eliminazione di selettori generici velocizzerà sempre il rendering della pagina. Il carattere jolly * è lento, specialmente quando le tue pagine diventano nidi complessi e il tuo elemento conta alle stelle.

Si dovrebbe sempre specificare un ID al livello più basso possibile (mi rendo conto che questo diventa quasi impossibile soprattutto quando si tratta di cose come i risultati del database). Ma quando si utilizza selettori come

.mysuperclass ul li p a 

di avere una classe seguito da quattro selettori generici - che significa che per ogni elemento della .mysuperclass il motore di rendering deve scorrere ogni elemento in quel genitore alla ricerca di queste regole.

In breve, la mia risposta è di essere il più specifico possibile con il tuo CSS e di approfondire il più possibile nel DOM con i selettori. Evita i caratteri jolly e i generici.

+0

Grazie, Jarrod. Penso che avrei potuto meglio enfatizzare nella mia domanda che voglio indirizzare ogni elemento della pagina con le mie regole CSS - cioè, il selettore universale, a quanto ho capito, è esattamente ciò che voglio in questo caso. Dato che ho sempre sentito il selettore universale lento, spero di sapere se questa lentezza è inerente al selettore, o si basa solo sul suo uso tipico (ad esempio, un foglio di stile di reset rapido e sporco che verrà seguito con lo styling di override). – Bungle

+0

Capisco. Suggerirei di fare alcuni test di velocità usando gli strumenti di sviluppo di Chrome. Provalo e vedi i risultati per l'utilizzo del selettore di caratteri jolly rispetto alla definizione di tag esplicita. Chrome ti fornirà una descrizione della durata di ogni processo. –

+12

Vorrei raccomandare * contro * essere "il più specifico possibile" con i tuoi selezionatori. In futuro, quando vuoi apportare modifiche agli stili o quando hai più eccezioni, ti consigliamo di ignorare quei selettori, che diventano sempre più difficili quanto più specifici sono. Mantieni la specificità bassa e usa più selettori di elementi e classi. http://numiko.com/labs/2011/07/css-specificity-wars/ – chharvey

2

Capisco che i caratteri jolly hanno un impatto sulle prestazioni, ma i siti più piccoli l'impatto è trascurabile. I caratteri jolly sono strumenti molto utili per costruire un sito basato sul miglioramento progressivo. Ovviamente, l'utilizzo di qualcosa come HTML *, influisce davvero sulle prestazioni dei siti più grandi, ma renderlo più specifico, come ad esempio #element_id *, aiuta a apportare rapidamente modifiche universali agli elementi figlio.

Il carattere jolly è lì per un motivo dopo tutto. Devi solo capire quando usarlo sarà più utile che non usarlo. Dipende dal contesto.

Uso i caratteri jolly e i selettori generici per creare modelli CSS. È anche un ottimo modo per modificare rapidamente una serie di elementi all'interno di un tema WordPress sconosciuto usando stili personalizzati.

Anche Bootstrap, che è popolare e semplificato, utilizza i caratteri jolly nelle giuste circostanze.

Riferimenti:

  • http://getbootstrap.com/css/
  • Gustafson, A. 2015. Adaptive Web Design: Crafting esperienze ricche con Progressive Enhancement. Berkeley, (CA): nuovi cavalieri.
Problemi correlati