|
| 1 | +# CSS Best Practices |
| 2 | + |
| 3 | +## Selektorregeln |
| 4 | + |
| 5 | +### Vermeide zu generische Selektoren |
| 6 | + |
| 7 | +Um den Code einfacher erweitern und besser warten zu können, ist ein gezieltes Styling von Elementen immens wichtig. Die Faustregel dazu: Sobald ein Element gestylet werden soll, setze eine Klasse. |
| 8 | + |
| 9 | +**schlecht** |
| 10 | + |
| 11 | +``` sass |
| 12 | +header |
| 13 | + padding: 10px 20px |
| 14 | +
|
| 15 | +h2 |
| 16 | + margin: 0 |
| 17 | +
|
| 18 | +ul |
| 19 | + list-style-type: circle |
| 20 | +``` |
| 21 | + |
| 22 | +**gut** |
| 23 | + |
| 24 | +``` sass |
| 25 | +.page-header |
| 26 | + padding: 10px 20px |
| 27 | +
|
| 28 | +.subtitle |
| 29 | + margin: 0 |
| 30 | +
|
| 31 | +.link-list |
| 32 | + list-style-type: circle |
| 33 | +``` |
| 34 | + |
| 35 | +### Vermeide Basiselementselektoren |
| 36 | + |
| 37 | +Basiselementselektoren sind schlecht (siehe Regel darüber) und erhöhen die Spezifität unnötigerweise. Auch hier sollte auf eine Klasse zurückgegriffen werden. Außerdem sollten Elemente wie `<div>` und `<span>` im Markup immer ein Klassenattribut besitzen. Andernfalls wären sie sowieso überflüssig. |
| 38 | + |
| 39 | +**schlecht** |
| 40 | + |
| 41 | +``` sass |
| 42 | +.navigation div |
| 43 | +.navigation span |
| 44 | +.navigation ul |
| 45 | +``` |
| 46 | + |
| 47 | +**gut** |
| 48 | + |
| 49 | +``` sass |
| 50 | +.navigation--box |
| 51 | +.navigation--title |
| 52 | +.navigation--list |
| 53 | +``` |
| 54 | + |
| 55 | +### Vermeide eine Überspezifizierung durch Basiselementselektoren |
| 56 | + |
| 57 | +Eine Überspezifizierung durch Basiselementselektoren hat zur Folge, dass der CSS-Code ans Markup gekoppelt wird. Würde man das Element im Markup ändern, z.B. aus einer `h2` eine `h3` machen, müsste man dies auch im Stylesheet tun, was einen erhöhten Wartungsaufwand nach sich zieht. Obendrein wird die Spezifität unnötigerweise erhöht. |
| 58 | + |
| 59 | +**schlecht** |
| 60 | + |
| 61 | +``` sass |
| 62 | +ul.link-list |
| 63 | +div.example |
| 64 | +a.back |
| 65 | +``` |
| 66 | + |
| 67 | +**gut** |
| 68 | + |
| 69 | +``` sass |
| 70 | +.link-list |
| 71 | +.example |
| 72 | +.back |
| 73 | +``` |
| 74 | + |
| 75 | +### Vermeide Nachfahrenselektoren |
| 76 | + |
| 77 | +Der Nachfahrenselektor ist der teuerste Selektor in CSS. Gib dem entsprechenden Element besser eine Klasse und style es direkt. |
| 78 | + |
| 79 | +**schlecht** |
| 80 | + |
| 81 | +``` sass |
| 82 | +.link-list li a |
| 83 | +``` |
| 84 | + |
| 85 | +**gut** |
| 86 | + |
| 87 | +``` sass |
| 88 | +.link-list--link |
| 89 | +``` |
| 90 | + |
| 91 | +### Vermeide den selben Selektor fürs Styling (CSS) und fürs Verhalten (JS) zu verwenden |
| 92 | + |
| 93 | +Separation of concerns. Möchte man Javascript auf ein Element anwenden, hat es sich etabliert, hierfür ein `data-*`Attribut zu nutzen. Der Vorteil: Ändert man später nochmal das Klassenattribut, bleibt das Javascript weiterhin in Takt. |
| 94 | + |
| 95 | +**schlecht** |
| 96 | + |
| 97 | +``` sass |
| 98 | +.dialog-opener |
| 99 | +``` |
| 100 | + |
| 101 | +``` js |
| 102 | +$('.dialog-opener') |
| 103 | +``` |
| 104 | + |
| 105 | +**gut** |
| 106 | + |
| 107 | +``` js |
| 108 | +$("[data-role='dialog-opener']") |
| 109 | +``` |
| 110 | + |
| 111 | +## Coding Konventionen |
| 112 | + |
| 113 | +### Benutze die Kurzschreibweise |
| 114 | + |
| 115 | +Wenn man alle Werte einer Eigenschaft auf einmal angibt, ist die Kurzschreibweise schneller zu erfassen und spart obendrein ein paar Bytes ein. |
| 116 | + |
| 117 | +**schlecht** |
| 118 | + |
| 119 | +``` sass |
| 120 | +.box |
| 121 | + padding-top: 0 |
| 122 | + padding-right: 10px |
| 123 | + padding-bottom: 20px |
| 124 | + padding-left: 10px |
| 125 | +``` |
| 126 | + |
| 127 | +**gut** |
| 128 | + |
| 129 | +``` sass |
| 130 | +.box |
| 131 | + padding: 0 10px 20px |
| 132 | +``` |
| 133 | + |
| 134 | +### Gib nur die Werte an, die du auch setzen willst |
| 135 | + |
| 136 | +Wenn man zu viele Werte auf einmal angibt, könnte es sein, dass man versehentlich einen vererbten Wert überschreibt. Außerdem muss man diesen Wert dann u.U. später nochmal überschreiben, weil er sich wiederum selbst weitervererbt hat. |
| 137 | + |
| 138 | +**schlecht** |
| 139 | + |
| 140 | +``` sass |
| 141 | +.box |
| 142 | + padding: 0 10px 0 0 |
| 143 | + background: rgba(0, 0, 0, 0.5) |
| 144 | +``` |
| 145 | + |
| 146 | +**gut** |
| 147 | + |
| 148 | +``` sass |
| 149 | +.box |
| 150 | + padding-right: 10px |
| 151 | + background-color: rgba(0, 0, 0, 0.5) |
| 152 | +``` |
| 153 | + |
| 154 | +### Vermeide die Einheitsangabe nach dem Wert "0" |
| 155 | + |
| 156 | +Null ist Null. :) |
| 157 | + |
| 158 | +**schlecht** |
| 159 | + |
| 160 | +``` sass |
| 161 | +.box |
| 162 | + margin: 0px |
| 163 | +``` |
| 164 | + |
| 165 | +**gut** |
| 166 | + |
| 167 | +``` sass |
| 168 | +.box |
| 169 | + margin: 0 |
| 170 | +``` |
| 171 | + |
| 172 | +**Ausnahme dort, wo sie nicht weggelassen werden darf** |
| 173 | + |
| 174 | +``` sass |
| 175 | +.box |
| 176 | + transform: rotate(0deg) |
| 177 | +``` |
| 178 | + |
| 179 | +### Nutze 100–900 bei der Angabe der Schriftdicke |
| 180 | + |
| 181 | +Die Zahlen 100, 200 … 900 sind typografischer Standard und erlauben es uns, differenzierter mit Abstufungen der Schriftdicke umzugehen als es _normal_ und _bold_ tun. |
| 182 | + |
| 183 | +**schlecht** |
| 184 | + |
| 185 | +``` sass |
| 186 | +.box |
| 187 | + font-weight: bold |
| 188 | +``` |
| 189 | + |
| 190 | +**gut** |
| 191 | + |
| 192 | +``` sass |
| 193 | +.box |
| 194 | + font-weight: 700 |
| 195 | +``` |
0 commit comments