2011-07-26 10 views
9

Mi sono educato. Lettura this:Comporta prestazioni dannose?

Il motore valuta ogni regola da destra a sinistra, a partire dal selettore più a destra (chiamato "chiave") e spostando attraverso ogni selettore finché non trova una corrispondenza o scarta la regola. (Il "selettore" è l'elemento documento a cui applicare la regola.)

Ad esempio:

ul li a {...} 
#footer h3 {...} 
* html #atticPromo ul li a {...] 

Ora, alcune uscite esempio di codice SASS per me:

#content #blog { 
    /* ... */ 
} 
/* line 85, ../sass/screen.scss */ 
#content #flickr { 
    /* ... */ 
} 

#content #flickr div p { 
    /* ... */ 
} 

Questo sembra un po 'imbarazzante .. sto facendo qualcosa di sbagliato? Si tratta di un problema di comunicazione tra me e Sass? Lo stiamo perdendo?

Edit: Alcuni Codice SCSS:

#flickr { 
    @include columns(5,8); 
    background: url('../img/ipadbg.png') no-repeat; 

    #ipod-gloss { 
     z-index: 999; 
     position: relative; 
    } 

    div { 
     margin-top: -80px; 
     margin-right: 20px; 

     h2 { 
      color: $white; 
      font-size: 24px; 
     } 

     p { 
      margin-top: 40px; 
     } 
    } 
} 

Bonus Side!: l'articolo dice che i browser (o almeno Firefox) cercano i selettori da destra a sinistra. Non riuscivo a capire perché questo è un motivo più efficiente. Qualche indizio?

+0

Non vedo il tuo codice Sass/SCSS. – BoltClock

+1

SASS/SCSS consente di specificare facilmente le cose (in particolare il nesting) che richiederebbe il CSS "long hand". Sebbene il nesting non sia sempre il "modo corretto" per applicare il dato CSS (potrebbe essere troppo restrittivo e fragile per il documento), i selettori CSS possono essere abbinati * in modo molto efficiente * con i browser web. Detto questo: non me ne preoccuperei, a meno che non ci sia un caso dimostrativo del CSS che è "troppo lento". –

risposta

15

Devi trovare la tua compromesso tra la manutenibilità (nidificazione rende più facile trovare la strada in giro per il foglio di stile) e prestazioni di rendering.

Una regola empirica dice che dovresti cercare di limitarti ad un annidamento a tre livelli e dovresti evitare di annidare gli ID se non è necessario.

Tuttavia, penso che la nidificazione troppo non sia il problema più grande. Non appena mi sono reso conto della potenza dei mix, li ho usati molto.

Per esempio, questo è il mio spesso usato mixin pulsante:

@mixin small-button($active-color: $active-color, $hover-color: $button-hover-color, $shadow: true) 
    display: inline-block 
    padding: 4px 10px 
    margin: 
    right: 10px 
    bottom: 10px 
    border: none 
    background-color: $button-color 
    color: $font-color-inv 
    +sans-serif-font(9px, 700) 
    text-align: center 
    text-transform: uppercase 
    cursor: pointer 
    @if $shadow 
    +light-shadow 
    &:hover 
    text-decoration: none 
    background-color: $hover-color 
    &:last-child 
    margin-right: 0 
    a 
    color: $font-color-inv 
    &, &:hover 
     text-decoration: none 
    &.disabled 
    +opacity(0.75) 
    &:hover 
     background-color: $button-color 
    &.active 
    background-color: $active-color 
    &.disabled:hover 
     background-color: $active-color 

Vedete, un bel po 'di codice. Applicando tali mixaggi a molti elementi nella tua pagina si tradurrà in un grande file CSS che richiede più tempo per essere interpretato.

Nel vecchio stile CSS-way si darebbe ad ogni elemento del pulsante, ad es. la classe .small-button. Ma questo metodo inquina il tuo markup con classi non comuni.

Sass offre tuttavia una soluzione: ereditarietà del selettore tramite @extend directive.

Se impostare i valori predefiniti per il vostro parametro del mixin, si può anche fornire una semplice classe, che utilizza le mixins con predefinito:

// Use this mixin via @extend if you are fine with the parameter defaults 
.small-button 
    +small-button 

E poi si può solo ereditare da questa classe in vari contesti :

#admin-interface 
    input[type=submit] 
    @extend .small-button 

La dichiarazione CSS risultante aggrega tutti gli utilizzi di .small pulsante in una sola regola con selettori separati da virgola:

.small-button, #admin-interface input[type=submit] { 
    display: inline-block; 
    ... 
} 

Concludendo, un uso ingenuo di Sass può influire sulle prestazioni CSS. Utilizzato con saggezza, tuttavia, è gestibile grazie a un codice ben strutturato e ASCIUTTO, conduce alla corretta separazione di markup e styling (solo classi semantiche) e consente codice CSS intelligente e performante.

+0

So che sono passati 1,5 anni da questa risposta, ma mi chiedevo ... Stai citando le prestazioni più volte, come si applica ai CSS. C'è un vero problema nel modo in cui SASS/SCSS traduce l'annidamento in CSS con prestazioni scadenti o le dimensioni del file diventano troppo grandi? – ZenMaster

+0

Bene, [ci sono studi] (http://www.stevesouders.com/blog/2009/03/10/performance-impact-of-css-selectors/) che dicono che non si avrà molto impatto quando si ottimizzano prestazioni del selettore. Forse non importa per un browser moderno come Chrome. Ma se si pensa ai vecchi browser IE o ai telefoni cellulari con un browser più lento e una connessione errata, le prestazioni del selettore e le dimensioni dei file CSS sono importanti. – crispy

+0

Inoltre, se si considera il grafico delle prestazioni di un utente finale, è possibile avere un tempo di applicazione del server di 500 ms, tempo di rete di 500ms, elaborazione DOM del browser di 500ms e tempo di rendering della pagina del browser 2000ms. Molte persone direbbero che il tempo dell'app server 500ms non è abbastanza buono (non solo a causa di problemi di ridimensionamento), ma ci sono 2,5 ore di spesa nel browser - un bel po 'di potenziale da abbattere! – crispy

6

SASS è solo un linguaggio che viene compilato in CSS. Se si è interessati alle prestazioni di SASS in termini di modalità di esecuzione nel browser, SASS non immette l'equazione: verrà compilata e pubblicata nel browser come un normale CSS.


Da quello che posso vedere del vostro uso del SASS, ci sono un paio di cose che potrei suggerire:

  1. Non devi a nidificare ogni cosa.

La possibilità di annidare le regole l'una dentro l'altra in SASS è una funzione di lingua, ma non è necessario farlo se non ha senso farlo.


In termini di uso generale CSS:

  1. Se la nidificazione diventa troppo grave/unwieldly, considerare l'utilizzo di classi in cui ha senso.
  2. Quando è necessario utilizzare la gerarchia di elementi DOM, prendere in considerazione l'utilizzo del [combinatore di figlio]: .foo > .bar.

Gli ID sono pensati per essere unici, quindi dovrebbe sempre fare riferimento solo a un singolo elemento. Il più delle volte, possono essere regole CSS per se stesse - #content #flickr diventerebbe solo #flickr, ad esempio - e i browser ottimizzeranno la ricerca per un singolo ID. L'unica volta che ti serve qualcosa come #id1 #id2 è se #id2 deve apparire in diversi contesti su pagine diverse.

Se il selettore contiene elementi come #id div p, quello div è superfluo o serve a uno scopo specifico.

  • Se è superfluo, modificare la regola #id p, che seleziona ogni <p> che si verifica come un discendente di #id.
  • Se ha uno scopo specifico, considera di classificare lo <div> con un nome classe che ne descriva lo scopo, ad esempio <div class="photos-list">. Quindi il tuo CSS potrebbe diventare .photos-list p, che è molto più gestibile e riutilizzabile.

+0

Giusto. Ma penso che la domanda sia incentrata sul fatto che SASS * * tende a generare molto più verbose CSS di quanto si possa scrivere senza, semplicemente perché è più facile da fare. Con questa ipotesi fatta - allora, quale impatto sulle prestazioni, se esiste, hanno i selettori "più profondi"? Per esempio. come si adattano i browser in modo efficiente? Quali sono le considerazioni sulle prestazioni CSS? –

+0

L'articolo che ho collegato per rispondere a questo. I selettori lunghi sono considerati lenti. Sono più interessato ai modi di compilare sass senza lunghi selettori annidati. # id1 # id2 sembra strano e non dovrebbe essere annidato (anche se il caso limite di utilizzare quelli per l'inclusione di pagine diverse rende più difficile l'identificazione). Sto chiedendo: questa performance ha un impatto serio? oppure: c'è un modo per farlo meglio con sass? l'intero punto di nidificazione è la leggibilità ... se abbandonerò il nidificazione per rendere i selettori migliori .. questa è una caratteristica meno utile nei linguaggi css di alto livello. – CamelCamelCamel

+1

@Radagaisus: "questo impatto sulle prestazioni è serio?" No. – BoltClock

Problemi correlati