Devo dividere un file di query multimediali CSS di grandi dimensioni in file separati per ogni dimensione dello schermo?


19

Sto lavorando su un sito Web di design reattivo per fornire contenuti per tutte le dimensioni dello schermo. Ho query multimediali per 5 diversi "passaggi" e il file CSS è di circa 30 Kb.

Sarebbe meglio dividerlo in file separati e renderli simili a questo:

<link rel='stylesheet' media='screen and (min-width: 701px) and (max-width: 900px)' href='css/medium.css' />

o dovrei tenerli in un file CSS?

Aggiornamento: volevo solo aggiungere che la mia preoccupazione principale era la velocità di apertura / rendering tra browser / dispositivo e non la facilità di sviluppo.


Grunt / Webpack / qualunque plug-in esiste per prendere un singolo file CSS e dividerlo in più file separati da media query? Quindi potresti tranquillamente ottenere la facilità di sviluppo offerta da un file monolite e anche l'ottimizzazione della velocità di file separati.
Kevin Wheeler il

Risposte:


16

Penso che dipenda davvero da ciò che trovi più semplice per lo sviluppo e da ciò che ti aiuta a tenere un foglio di stile ordinato.

L'unico vero inconveniente che mi viene in mente nella divisione sarebbe che se l'attributo di un elemento appare in tutti i tuoi fogli di stile, dovresti aggiornare 5 file separati per cambiarlo (piuttosto che apparire fianco a fianco in un unico posto).

Secondo la risposta su questo post, i browser scaricheranno tutti i fogli di stile indipendentemente, quindi dividere la risoluzione non è un risparmio di larghezza di banda: /programming/16657159/when-using-media-queries-does-a -phone-load-non-pertinenti ripresi-query-e-immagini


In quel post che hai collegato, sai cosa intende per "questa è una limitazione della CSSOM"?
Sconcertato

1
Il modello a oggetti CSS - dev.w3.org/csswg/cssom - Credo che questo definisca il modo in cui i CSS dovrebbero essere gestiti, e quindi penso che la limitazione a cui si riferisce non avrà un modello che gestisca tali stili in modo da risparmiare più larghezza di banda modo.
Richard B,

3
Anche se non è un download saver, è in un certo senso. Un browser darà la priorità ai collegamenti di media query corrispondenti rispetto a quelli non corrispondenti. Un file CSS corrispondente bloccherà il rendering della pagina mentre un non corrispondente ha una priorità inferiore da scaricare dal browser e non blocca affatto il rendering della pagina. Inoltre, una volta diviso, puoi usare js per scaricare in modo condizionale se vuoi salvare e fare banda.
dalore,

4

Dipende leggermente da ciò che vuoi ottenere: stai cercando di velocizzare il caricamento della tua pagina o stai cercando di semplificare lo sviluppo?

Se ti rivolgi a quest'ultimo, potresti usare più fogli, ma è tutta una questione di preferenza. Trovo più semplice utilizzare un file di grandi dimensioni poiché ti offre una panoramica di tutti gli stili che hai dichiarato.

Se si desidera una pagina di caricamento più veloce di quanto la migliore scommessa sarebbe quella di ridurre al minimo la quantità di richieste, dal momento che un overhead della richiesta è piuttosto grande. Inoltre potresti mantenere una versione di sviluppo per te stesso e servire un css minimizzato sul web (trovo YUI un buon metodo: http://www.refresh-sf.com/yui/ ).

Inoltre proverei a ottimizzare il CSS stesso. Puoi provare a unire classi molto simili, ad esempio:

.bold-and-italic { font-weight: bold; text-style: italic; }

Può essere convertito in:

.bold { font-weight: bold; }
.italic { text-style: italic; }

L'unica cosa è che devi cambiare leggermente l'html da <span class="bold-and-italic">foo bar</span>in<span class="bold italic">foo bar</span>

Posso fortemente suggerirti di dare un'occhiata a Bootstrap ( http://getbootstrap.com ), questi ragazzi hanno fatto un ottimo lavoro nel suddividere le classi in più 'sottoclassi'.

Spero che questo possa essere d'aiuto.


1
Le classi che prendono il nome dallo stile sono in cattive condizioni. Potresti anche inserire un attributo di stile se stai andando a quello. Meglio nominare le classi logiche. Mi piace.important
dalore,

4

Probabilmente è meglio avere un solo file CSS, ma minimizzarlo e decomprimerlo. Supponendo che i tuoi 30 KB siano prima di farlo, probabilmente otterrai le dimensioni del file fino a circa 5 KB con minificazione (rimozione degli spazi bianchi) e gzipping.

Dividere probabilmente ti darà un po 'più di velocità, ma solo in alcune condizioni.

  • Dovresti assicurarti che venga caricato solo un foglio di stile alla volta, altrimenti avresti bisogno di due o più richieste HTTP, che hanno un overhead stesso, che annullerebbe almeno in parte il guadagno dalla dimensione del file più piccola. Per fare questo, è non è sufficiente solo dividere il foglio di stile e inserire più <link>-tag con diversi attributi dei media, i browser sembrano caricare tutti <link>i fogli di stile ED indipendentemente dai media query (grazie a @cimmanon per queste informazioni, non sapeva che) .
  • Il numero di regole CSS condivise tra i fogli di stile deve essere piccolo, altrimenti ciascuno dei fogli di stile multipli dovrebbe contenere tutte le regole comuni e avrebbe quindi quasi le dimensioni dell'originale.
  • Usi un preprocessore CSS (o qualcosa di simile), quindi è gestibile avere gli stessi pezzi di codice in 5 fogli di stile.

Inoltre: non ottimizzare prematuramente. Fallo solo se hai problemi di prestazioni.


3
Vale la pena notare che se si utilizza il <link rel="stylesheet" />tag per tutti i file specifici delle query multimediali, non sarà possibile impedire al browser di scaricarli. Dovresti utilizzare lo sniffing del browser sul lato server o JavaScript per esaminare le dimensioni della finestra e iniettare i fogli di stile appropriati. Nessuna di queste sono buone scelte.
cimmanon,

1
Sono un po 'sorpreso, ma hai ragione: ho pensato che l'aggiunta dell'attributo media al <link>tag avrebbe impedito il caricamento di fogli di stile non corrispondenti. Perché i browser lo fanno? Questo è ovviamente il motivo più importante per non dividere i fogli di stile.
Jost

Lo fanno perché il tuo schermo può cambiare, e se sei su un cellulare e lo ruoti da verticale a orizzontale, improvvisamente la larghezza dello schermo è diversa. O sul desktop è possibile ridimensionare la finestra del browser o trascinare la finestra su un'altra schermata se si dispone di una configurazione con più monitor. Se il browser non avesse scaricato tutte le risorse CSS in anticipo, ci sarebbe un ritardo nel ripetere il rendering della pagina se e quando si verifica una delle azioni sopra indicate
MrCarrot

È meglio averli divisi. La maggior parte dei browser in questi giorni sono browser spia (il tuo sito è https e spia come dovrebbe essere) e con connessioni multiple spia sono multiplexate nella stessa connessione, quindi il numero di file non conta ora. Inoltre i browser inseriranno query multimediali non corrispondenti con file css con una priorità inferiore da scaricare e, cosa più importante, non BLOCCANO il rendering della pagina.
dalore,

3

È necessario dividere i file CSS in base a query multimediali perché i file CSS bloccano il rendering.

Quando il browser sta costruendo il tuo DOM, deve prima attendere e caricare tutti i tuoi file CSS. Ridurrai il tempo di caricamento della pagina se alcuni dei tuoi file CSS vengono caricati solo in base a determinate query multimediali.

Questo vale anche per l'aggiunta asincrona a un tag di script JavaScript; es <script src='myfile.js' async></script>. : .

Il DOM non deve attendere il caricamento del file JS. Aggiungi asincrono solo se la costruzione del tuo DOM non ha bisogno di JavaScript durante il caricamento.


Ho sentito dire che se davvero non vuoi che i tuoi script asincroni ritardino potenzialmente il rendering, eseguili sull'evento window.onload invece di usare async.
Kevin Wheeler il

2

Sarei propenso a dire questo.

Per la produzione, tenerli sempre in un file; il motivo è che è più efficiente per il browser e che dovrebbe essere il tuo interesse primario (IMO) quando passi dallo sviluppo alla produzione.

Lo sviluppo è un diverso bollitore di pesce. Tendo a dividere le query multimediali in modo che siano per qualsiasi elemento, ad esempio:

.foo { // .. some css }
.foo:hover, .foo:focus { // hover css }
@media screen and (max-width: 400px) {
    .foo { // .. some differentcss }
}

Come in genere se sto cambiando un elemento, non voglio cercare in tutto il luogo per il CSS (anche se puoi usare qualcosa come grep ...).

Ma una cosa che direi è che vale la pena considerare il sito stesso, il processo di sviluppo e il futuro. Se ritieni sinceramente che valga la pena separarli in file basati sulla dimensione dello schermo, provalo. Crea una copia del sito (se possibile), divertiti con la copia - se lo rende più semplice, usalo. Non è necessario seguire un paradigma unico per tutte le modalità di sviluppo di un sito Web.


1

Semplice: usa 1 foglio di stile e aggiungi semplicemente dei commenti per facilitare la ricerca e la modifica degli stili CSS, ad esempio:

//sheet 1 (mobile device 800 px)
code

//sheet 2 (mobile device 768 px)
code

//sheet 3 (mobile device 480 px)
code

//sheet 4 (desktop size 1024 px)
code

Se lo desideri, puoi utilizzare più fogli di stile e chiamarli per ogni dimensione specifica.


-1

Preferirei guardare Bootstrap . È 1 file CSS che contiene tutto il CSS. Funziona su quasi il 99% dei browser ed è estremamente reattivo.

Fai clic sulla demo dal vivo e ingrandisci ( Ctrl += ingrandisci, Ctrl -= rimpicciolisci, Ctrl 0= normale) o aprilo sul tuo dispositivo mobile per vedere come viene visualizzato.


2
Ha già scritto 30kb di CSS, come potrebbe essere utile passare al bootstrap?
Steve Sanders,

Mettendolo in questo modo, sì, sono d'accordo che 30kb di CSS è una missione da rifare. Vorrei semplicemente copiarlo e incollarlo in diversi fogli di stile, tutti a seconda di come è strutturato, è possibile duplicare e rinominare i file CSS e rimuovere tutte le parti non necessarie.
Riguardo a Ogies Myburgh il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.