SnappySnippet
Finalmente ho trovato del tempo per creare questo strumento. Puoi installare SnappySnippet da Github. Consente una facile estrazione HTML + CSS dal nodo DOM specificato (ultimo controllo). Inoltre, è possibile inviare il codice direttamente a CodePen o JSFiddle. Godere!
Altre caratteristiche
- pulisce HTML (rimuove gli attributi non necessari, corregge il rientro)
- ottimizza CSS per renderlo leggibile
- completamente configurabile (tutti i filtri possono essere disattivati)
- funziona con
::before
e ::after
pseudo-elementi
- bella interfaccia utente grazie ai progetti Bootstrap e Flat-UI
Codice
SnappySnippet è open source e puoi trovare il codice su GitHub .
Implementazione
Dato che ho imparato parecchio mentre lo facevo, ho deciso di condividere alcuni dei problemi che ho riscontrato e le mie soluzioni, forse qualcuno lo troverà interessante.
Primo tentativo: getMatchedCSSRules ()
All'inizio ho provato a recuperare le regole CSS originali (provenienti dai file CSS sul sito Web). Abbastanza sorprendentemente, questo è molto semplice grazie window.getMatchedCSSRules()
, tuttavia, non ha funzionato bene. Il problema era che stavamo prendendo solo una parte dei selettori HTML e CSS che corrispondevano nel contesto dell'intero documento, che non corrispondevano più nel contesto di uno snippet HTML. Poiché l'analisi e la modifica dei selettori non sembravano una buona idea, ho rinunciato a questo tentativo.
Secondo tentativo - getComputedStyle ()
Quindi, sono partito da qualcosa che suggeriva @CollectiveCognition - getComputedStyle()
. Tuttavia, volevo davvero separare i CSS dall'HTML invece di includere tutti gli stili.
Problema 1: separazione dei CSS dall'HTML
La soluzione qui non è stata molto bella ma abbastanza semplice. Ho assegnato gli ID a tutti i nodi nella sottostruttura selezionata e ho usato quell'ID per creare le regole CSS appropriate.
Problema 2: rimozione di proprietà con valori predefiniti
L'assegnazione degli ID ai nodi ha funzionato bene, tuttavia ho scoperto che ciascuna delle mie regole CSS ha ~ 300 proprietà che rendono illeggibile l'intero CSS.
Risulta che getComputedStyle()
restituisce tutte le possibili proprietà CSS e valori calcolati per l'elemento dato. Alcuni di essi erano vuoti, altri avevano valori predefiniti del browser. Per rimuovere i valori predefiniti ho dovuto prima scaricarli dal browser (e ogni tag ha valori predefiniti diversi). La soluzione è stata quella di confrontare gli stili dell'elemento proveniente dal sito Web con lo stesso elemento inserito in uno spazio vuoto <iframe>
. La logica qui era che non ci sono fogli di stile in un vuoto<iframe>
, quindi ogni elemento che ho aggiunto lì aveva solo stili di browser predefiniti. In questo modo sono stato in grado di sbarazzarmi della maggior parte delle proprietà che erano insignificanti.
Problema 3: mantenere solo le proprietà stenografiche
La prossima cosa che ho notato è che le proprietà con equivalente stenografia sono state inutilmente stampate (ad esempio, c'era border: solid black 1px
e poi border-color: black;
, e così via border-width: 1px
).
Per risolvere questo, ho semplicemente creato un elenco di proprietà che hanno equivalenti di stenografia e le hanno filtrate dai risultati.
Problema 4 - rimozione delle proprietà con prefisso
Il numero di immobili a ogni regola è stata inferiore in modo significativo dopo l'operazione precedente, ma ho scoperto che ho davanzale avuto un sacco di -webkit-
proprietà con il prefisso che non ho mai sentito di ( -webkit-app-region
? -webkit-text-emphasis-position
?).
Mi chiedevo se avrei dovuto mantenere una di queste proprietà perché alcune sembravano utili ( -webkit-transform-origin
, -webkit-perspective-origin
ecc.). Non ho capito come verificarlo, però, e poiché sapevo che la maggior parte delle volte queste proprietà sono solo spazzatura, ho deciso di rimuoverle tutte.
Problema 5: combinazione delle stesse regole CSS
Il problema successivo che ho notato è che le stesse regole CSS vengono ripetute più e più volte (ad es. Per ognuna <li>
con gli stessi identici stili c'era la stessa regola nell'output CSS creato).
Si trattava solo di confrontare le regole tra loro e di combinarle esattamente con lo stesso insieme di proprietà e valori. Di conseguenza, invece di #LI_1{...}, #LI_2{...}
me #LI_1, #LI_2 {...}
.
Problema 6: ripulire e correggere il rientro dell'HTML
Dato che ero soddisfatto del risultato, sono passato all'HTML. Sembrava un disastro, soprattutto perché la outerHTML
proprietà lo mantiene formattato esattamente come è stato restituito dal server.
L'unica cosa che è stata presa dal codice HTML outerHTML
era una semplice riformattazione del codice. Dal momento che è qualcosa disponibile in ogni IDE, ero sicuro che esiste una libreria JavaScript che fa esattamente questo. E si scopre che avevo ragione (jquery-clean) . Inoltre, ho ulteriori extra di rimozione degli attributi ( style
, data-ng-repeat
ecc.).
Problema 7: filtri che interrompono i CSS
Poiché esiste la possibilità che in alcuni casi i filtri sopra menzionati possano spezzare i CSS nello snippet, li ho resi opzionali. Puoi disabilitarli dal menu Impostazioni .