Mein Vortrag beim TYPO3camp 2010 in München handelte von CSS und was man beim Stylesheet-Schreiben beachten kann um Dateigröße und Ladezeiten von CSS zu verringern. Nachfolgend die Präsentation: CSS & Performance auf Prezi-Basis.
Teil 1: CSS
Das Optimierungspotenzial beim Komprimieren einer CSS-Datei liegt zwischen 30%-70%, je nachdem wie gut man im Vorfeld schon gearbeitet hat. Was kann also man im Vorfeld beachten?
Schnelle Selektoren
Die unterschiedlichen Selektoren in CSS sind sicherlich bekannt, man kann HTML-Elemente direkt oder durch deren Attribute „class“ und „id“ ansprechen. Dabei sind die schnellsten Selektoren die Typ-Selektoren, Klassen- und ID-Selektoren sind ebenfalls schnell. Langsam hingegen sind die Kombinatoren, am häufigsten Verwendung finden sicherlich die Nachfahrenkombinatoren (descent combinators), der der langsamste aller Selektoren ist. Etwas schneller ist da der Kindkombinator (child combinators).
Beispiel:
schnellste -> a auch schnell -> .link langsam -> div > div > div > p > a.link sehr langsam -> div div div p a.link
Warum ist das langsam?
Der Browser liest CSS von RECHTS nach LINKS.
Er sucht erst alle „a“-Tags, schaut dann welche von denen ein „li“ als Elternelement haben, sortiert diese aus und schaut danach welche „ul“ als Elternelement haben und weist dann die Farbe #f00 zu. Das ist durchaus anders als man erwarten könnte und z.B. in Javascript gehandhabt wird.
Extrem langsam ist der Universal-Selektor, der sogenannte „star“-Selektor. Einen Vergleich verschiedener Selektoren hat Steve Sounders auf http://stevesouders.com/efws/css-selectors/universal.php veröffentlicht.
Wie werden die Selektoren gewichtet?
* {} /* a=0 b=0 c=0 d=0 -> specificity = 0,0,0,0 */ li {} /* a=0 b=0 c=0 d=1 -> specificity = 0,0,0,1 */ li:first-line {} /* a=0 b=0 c=0 d=2 -> specificity = 0,0,0,2 */ ul li {} /* a=0 b=0 c=0 d=2 -> specificity = 0,0,0,2 */ ul ol+li {} /* a=0 b=0 c=0 d=3 -> specificity = 0,0,0,3 */ h1 + *[rel=up] {}/* a=0 b=0 c=1 d=1 -> specificity = 0,0,1,1 */ ul ol li.red {} /* a=0 b=0 c=1 d=3 -> specificity = 0,0,1,3 */ li.red.level {} /* a=0 b=0 c=2 d=1 -> specificity = 0,0,2,1 */ #x34y {} /* a=0 b=1 c=0 d=0 -> specificity = 0,1,0,0 */ style="" /* a=1 b=0 c=0 d=0 -> specificity = 1,0,0,0 */
Typ-Selektoren und Pseudo-Klassen werden quasi als Einerstellen gewichtet. Attribut-Selektoren und Klassen als Zehner-Stellen, ID-Selektoren als Hunderter-Stellen. Und das style-Attribut in HTML ist sozusagen die Tausender-Stelle. Das einmal verinnerlicht, hilft, wenn mal wieder eine Eigenschaft überschrieben werden muss.
CSS-Reset
Bei einem CSS-Reset werden Browservorgaben zurückgesetzt, man fängt bei Null an zu gestalten. Ein einfacher Reset ist
* { margin: 0; padding: 0; }
Dabei werden bei allen Elementen über den Universal-Selektor alle Innen- und Außenabstände genullt. Gerade aber bei Formularen ist es dann schwierig dies browserweit neu zu implementieren. Deshalb hat Eric Meyer einen etwas „besseren Reset“ entwickelt.
/* http://meyerweb.com/eric/tools/css/reset/ */ /* v1.0 | 20080212 */ html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, font, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td { margin: 0; padding: 0; border: 0; outline: 0; font-size: 100%; vertical-align: baseline; background: transparent; } body { line-height: 1; } ol, ul { list-style: none; } blockquote, q { quotes: none; } blockquote:before, blockquote:after, q:before, q:after { content: ''; content: none; } /* remember to define focus styles! */ :focus { outline: 0; } /* remember to highlight inserts somehow! */ ins { text-decoration: none; } del { text-decoration: line-through; } /* tables still need 'cellspacing="0"' in the markup */ table { border-collapse: collapse; border-spacing: 0; }
CSS Shorthands
Shorthand sind Kurzschreibweisen in CSS. Man kann einige Eigenschaften zusammen-fassen. Beispielsweise kann man margin-top: 10px schreiben oder margin: 10px 0 0. Gleichzeitig hat man damit die Eigenschaften margin-right, margin-left und margin-bottom abgedeckt, und zwar mit dem Wert 0.
Beispiel:
margin-top: 10px; margin-right: 20px; margin-bottom: 30px; margin-left: 40px;
wird zu:
margin: 10px 20px 30px 40px
Gibt es für Margin 4 verschiedene Werte, werden diese in Uhrzeigerrichtung angegeben, also top, right, bottom und left.
Sind left und right gleich, wird der Wert an der 2. Stelle für beide Seiten verwendet.
margin: 10px 20px 30px
Sind jeweils top und bottom sowie left und right gleich, verwendet man folgende Schreibweise:
margin: 10px 20px
Letztlich werden alle 4 Seiten so zusammen gefasst:
margin: 10px
Man sollte immer und ausschließlich mit Shorthands arbeiten, da ein späteres Überschreiben von „Langanweisungen“ mit einer Shorthand-Anweisung nicht möglich ist. Wir haben z.B.
margin-top: 10px; margin: 5px 0 0;
Der neue Wert für margin-top wird in dem Fall ignoriert.
Weitere Kurzschreibweisen
padding: 10px 20px 30px 40px; border: 1px solid red; background: #000 url(pic.png) no-repeat right bottom; font: bold 16px/1.2 Arial, Helvetica, sans-serif; list-style: square inside url(images/bullet.png);
und natürlich Kurzschreibweise für Farbwerte:
#ffffff -> #fff
Best practice
Zuweisungen zusammenfassen
- Mehrere Selektoren mit der gleichen Zuweisung können zusammengefasst werden
- h1, h2, h3 {margin: 10px 0}
multiple Klassen im HTML zuweisen
- anstatt immer neue spezifische Klassen zu erfinden, weitestgehende generische Klassen verwenden und dann im HTML mehrere Klassen zuweisen
- <div class=“box right“></div>
Das letzte Semikolon kann weg gelassen werden
- Eine Einsparmaßnahme, die beim Komprimieren meist automatisch passiert
Null-Werte ohne Einheit => h3 {margin: 0}
- Es ist nicht notwendig 0px zu schreiben, die Einheit kann weggelassen werden
font-weight: 700 => bold, font-weight: 400 => normal
- Kurzschreibweise für bold = 700, für normal = 400 (minimales Einsparpotential)
CSS-Hacks vermeiden => Conditional Comments
- Keine Hacks für IE innerhalb des Hauptstylesheet, Conditional Comments verwenden
- http://standards.webmasterpro.de/index-article-cc.html
CSS komprimieren
- Für den Live-Gang eine komprimierte Version erstellen und nur diese in der „Live-Version“ einbinden
- http://www.blogrammierer.de/css-online-css-komprimierungstools-im-uberblick/
Kommentare
- Verwenden von Kommentaren ist nicht nur in der Teamarbeit dringend zu empfehlen
- Kommentare können auch ausführlicher sein oder im „Javadoc“-Stil, sodass automatische Dokumentationen daraus erstellt werden können
- http://phpugffm.de/index.php/adaption-des-javadoc-standards-in-css,2007-05,193.html
Print-Styles in das default-Stylesheet übernehmen
body { color:#333; background-color:#ccc } @media screen, projection { body {background-image:url(background.png)} } @media print { body {background-color: #fff; color:#000} }
In Teil 2 geht es um die Performance-Optimierung im Browser. Im nächsten TY-MA zeige ich, was man bei der Einbindung von CSS und Javascript in HTML optimieren werden kann.
Welche Tipps habt ihr noch?
One thought on “„CSS & Performance“ Vortrag auf dem TYPO3camp München”
Kommentare sind geschlossen.