{"id":4894,"date":"2016-09-19T08:23:41","date_gmt":"2016-09-19T06:23:41","guid":{"rendered":"http:\/\/8660.at\/?p=922"},"modified":"2016-09-19T08:23:41","modified_gmt":"2016-09-19T06:23:41","slug":"css-wie-lego-ein-modular-multiple-class-approach","status":"publish","type":"post","link":"https:\/\/zeichenschatz.net\/en\/webdesign\/css-wie-lego-ein-modular-multiple-class-approach\/","title":{"rendered":"CSS wie Lego \u2013 ein Modular Multiple Class Approach"},"content":{"rendered":"<p class=\"lead-in\">CSS ist einfach zu schreiben, aber schwierig zu warten. Vor allem nach l\u00e4ngerer Projektabwesenheit oder beim Arbeiten im Team. Eine Methode, um Code schlank und \u00fcbersichtlich zu halten ist eine Herangehensweise mit multiplen modularen classes. Wie Lego Bausteine kann man dadurch seine Styles wiederverwenden und verschieden kombinieren. Eine Herangehensweise in drei Schritten.<\/p>\n<h2>1. Classes statt HTML-Elemente selektieren<\/h2>\n<p>Der erste Schritt CSS so zu gestalten, dass es sich wie Lego Bausteine verhalten kann, ist es so unabh\u00e4ngig wie m\u00f6glich vom Umfeld, also den HTML-Elementen und der Struktur im Markup zu machen. Praktisch bedeutet das classes als Selektoren gegen\u00fcber Element-Selektoren zu bevorzugen.<\/p>\n<p>Fr\u00fcher habe ich genau das Gegenteil davon gemacht und sehr komplexe und verschachtelte Element-Selektoren geschrieben. H\u00f6chstens f\u00fcr Container habe ich classes vergeben, doch f\u00fcr Einzelelemente fast nie. Ich wollte m\u00f6glichst wenig classes verwenden, da ich es f\u00fcr unn\u00f6tig empfand. Ich war fest davon \u00fcberzeugt, dass sich die Struktur des Markups nicht \u00e4ndern w\u00fcrde. Wenn ich z.B. in der Sidebar einen Link in einer Promo-Box als Button gestalten wollte, hat das ganze so ausgehen:<\/p>\n<pre lang=\"css\">.sidebar &gt; div &gt; a {\n  \/* Mein Button-Styling *\/\n}<\/pre>\n<p>Das war eine klassische Situation, in der das Styling komplett von der HTML-Struktur abh\u00e4ngig ist (davon abgesehen, dass ich so jeden Link innerhalb der Box in der Sidebar selektiere, was ich wahrscheinlich gar nicht m\u00f6chte). Wenn ich nun ein weiteres <code>div<\/code> erg\u00e4nze, eines wegnehmen oder den Button auch im Footer einsetzen m\u00f6chte, muss ich nicht nur mein HTML sondern auch das CSS umschreiben. Viel einfacher ist es hier eine class zu vergeben und diese zu selektieren:<\/p>\n<pre lang=\"html4strict\">&lt;a class=&quot;btn&quot; href=&quot;#&quot;&gt;Button&lt;\/a&gt;\n<\/pre>\n<pre lang=\"css\">.btn {\n  \/* Styling f\u00fcr einen Button *\/\n}\n<\/pre>\n<p>Auf diese Weise kann ich meine classes unabh\u00e4ngig von der Markup-Struktur einsetzen. Ich kann den Button aus einem Container herausnehmen, in einem anderen einsetzen und erhalte das gleiche Ergebnis. Er gestaltet sich nicht aufgrund seines Umfeldes. Diesen Mehrwert habe ich damals nicht erkannt. Ich wollte mein Markup m\u00f6glichst unabh\u00e4ngig von classes halten, erzeugte dadurch aber nur die Notwendigkeit mein CSS von der HTML-Struktur anh\u00e4ngig zu machen. Dabei habe ich mich auf fixe Struktur verlassen. Doch Strukturen \u00e4ndern sich und ich bin lieber darauf vorbereitet. Denn einem HTML-Element eine andere class zuzuweisen ist meistens schneller als mein CSS strukturell zu \u00fcberarbeiten. Und es ist auf jeden Fall leichter nachvollziehbar und verst\u00e4ndlicher.<\/p>\n<h2>2. Classes wiederverwendbar schreiben<\/h2>\n<p>Das tolle an Lego Steinen ist, dass man sie immer wieder verwenden kann und auch seinen Code sollte man in verschiedenen Situationen m\u00f6glichst wieder verwenden k\u00f6nnen. Sehen wir uns ein Beispiel f\u00fcr das Stylen von \u00dcberschriften an. So eine Art Stylesheet wird vielen vertraut vorkommen:<\/p>\n<pre lang=\"css\">h1 {\n  \/* Styling f\u00fcr h1 *\/\n}\n\nh2 {\n  \/* Styling f\u00fcr h2 *\/\n}\n\nh3 {\n  \/* Styling f\u00fcr h3 *\/\n}\n<\/pre>\n<p>Das Styling der \u00dcberschriften ist an die HTML-Elemente gebunden und l\u00e4sst sich so nicht auf andere Stelle \u00fcbertragen. Das zwingt einen dazu die jeweiligen Headings dem gew\u00fcnschten Styling nach zuzuweisen (was semantisch wie Suchmaschinentechnisch wenig w\u00fcnschenswert ist) oder oder man endet mit solchen Selektoren, um mit Abweichungen umzugehen:<\/p>\n<pre lang=\"css\">h1,\n.section-header h3,\n.section-teaser h2,\n.promobox-title {\n  \/* Styling f\u00fcr h1 \/*\n}\n<\/pre>\n<p>Wesentlich nachhaltiger und einfacher ist es auch hier classes zu schreiben:<\/p>\n<pre lang=\"css\">.alpha {\n  \/* Styling f\u00fcr h1 *\/\n}\n\n.beta {\n  \/* Styling f\u00fcr h2 *\/\n}\n\n.gamma {\n  \/* Styling f\u00fcr h3 *\/\n}\n<\/pre>\n<pre lang=\"html4strict\">&lt;h3 class=&quot;alpha&quot;&gt;Style von &Uuml;berschrift 1 in einer h3&lt;\/h3&gt;\n&lt;p class=&quot;gamma&quot;&gt;Style von &Uuml;berschrift 3 in einem paragraph&lt;\/p&gt;\n<\/pre>\n<p>Dieser Herangehensweise erfordert zwar, dass ich jeder \u00dcberschrift eine class zuweise, doch das ist in Summe leichter verst\u00e4ndlich und wartbarer, als komplexe CSS-Selektoren zu schreiben, zu ver\u00e4ndern und zu erweitern.<\/p>\n<h2>3. Classes modular schreiben<\/h2>\n<p>Um die Wiederverwendbarkeit von classes wirklich zu gew\u00e4hrleisten, sollte man classes so schreiben, dass sie unterschiedlich miteinander kombiniert werden k\u00f6nnen. Ganz so wie verschiedene Lego Bausteine, die ein neues Ganze ergeben. Das erreicht man, wenn man Struktur und Aussehen m\u00f6glichst trennt, also modular macht. Und das nach dem Motto des \u201eSingle Responsibility Principle\u201c: ein Ding kann eine Sache, aber die wirklich gut. F\u00fchren wir unser Button-Beispiel von vorher etwas weiter aus. Wahrscheinlich werde ich mehrere Arten von Buttons auf meiner Seite verwenden, z.B.:<\/p>\n<ul>\n<li>Standard-Button als allgemeiner Stil<\/li>\n<li>Prim\u00e4r-Button f\u00fcr besondere Aufrufe<\/li>\n<li>Sekund\u00e4r-Button der sich eher zur\u00fccknimmt<\/li>\n<li>Disabled-Button der zeigt, wenn etwas nicht klickbar ist<\/li>\n<\/ul>\n<p>Diese Buttons k\u00f6nnte es dann auch noch in verschiedenen Gr\u00f6\u00dfen geben:<\/p>\n<ul>\n<li>Normaler Button<\/li>\n<li>Kleiner Button<\/li>\n<li>Gro\u00dfer Button<\/li>\n<\/ul>\n<p>Jetzt k\u00f6nnten wir f\u00fcr all diese Buttons einzelne classes definieren, wie z.B.:<\/p>\n<pre lang=\"css\">.btn--default {}\n.btn--default--big {}\n.btn--default--small {}\n\n.btn--primary {}\n.btn--primary--big {}\n.btn--primary--small {}\n\n.btn--secondary {}\n.btn--secondary--big {}\n.btn--secondary--small {}\n\n.btn--disabled {}\n.btn--disabled--big {}\n.btn--disabled--small {}\n<\/pre>\n<p>Das bedeutet aber, wir h\u00e4tten nun <em>zw\u00f6lf<\/em> verschiedene classes zu warten. Und auch zw\u00f6lfmal das Grund-Styling f\u00fcr unseren Button zu definieren und zu wiederholen, was nicht besonders <a href=\"https:\/\/de.wikipedia.org\/wiki\/Don%E2%80%99t_repeat_yourself\" target=\"_blank\" rel=\"noopener\">dry<\/a> ist. M\u00fcssen wir z.B. die generelle Gestaltung des kleinen Buttons anpassen, dann m\u00fcssen wir das vier mal machen \u2013 f\u00fcr den normalen, den prim\u00e4ren, sekund\u00e4ren und disabled Button. Das wird in der Wartung ziemlich schwierig und un\u00fcbersichtlich. Der modulare Ansatz dazu ist folgenderweise:<\/p>\n<pre lang=\"css\">.btn {\n  \/* Grundeinstellungen aller Buttons *\/\n  display: inline-block;\n  text-decoration: none;\n  font-family: sans-serif;\n  padding: 1em 2em;\n  \u2026\n}\n\n.btn--default {\n  \/* Stilistische Einstellungen des Standard-Buttons *\/\n  background-color: blue;\n  color: white;\n  \u2026\n}\n\n.btn--primary {\n  \/* Stilistische Einstellungen des Prim\u00e4r-Buttons *\/\n  background-color: red;\n  color: white;\n  \u2026\n}\n\n.btn--secondary {\n  \/* Stilistische Einstellungen des Sekund\u00e4r-Buttons *\/\n  border: 2px solid blue;\n  background-color: white;\n  color: blue;\n  \u2026\n}\n\n.btn--disabled {\n  \/* Stilistische Einstellungen des Disabled-Buttons *\/\n  background-color: lightgray;\n  color: gray;\n  \u2026\n}\n\n.btn--big {\n  \/* Stilistische Abweichungen des gro\u00dfen Buttons *\/\n  font-size: 1.5em;\n  padding: 1.2em 2em;\n  \u2026\n}\n\n.btn--small {\n  \/* Stilistische Abweichungen des kleinen Buttons *\/\n  font-size: 0.8em;\n  padding: 0.5em 1em;\n  \u2026\n}\n<\/pre>\n<pre lang=\"html4strict\">&lt;a href=&quot;#&quot; class=&quot;btn btn--default&quot;&gt;\nStandard Button\n&lt;\/a&gt;\n\n&lt;a href=&quot;#&quot; class=&quot;btn btn--primary btn--big&quot;&gt;\nPrimary Button Gro&szlig;\n&lt;\/a&gt;\n\n&lt;a href=&quot;#&quot; class=&quot;btn btn--secondary btn--small&quot;&gt;\nSekund&auml;rer Button klein\n&lt;\/a&gt;\n\n&lt;a href=&quot;#&quot; class=&quot;btn btn--disabled&quot;&gt;\nDisabled Button\n&lt;\/a&gt;\n<\/pre>\n<p>In Summe sind es nur sieben classes mit denen man theoretisch zw\u00f6lf Varianten darstellen kann, je nachdem, wie man sie kombiniert. Dabei sind die Aufgaben der verschiedenen classes m\u00f6glichst getrennt. Das <strong>Basis-Styling<\/strong> \u00fcbernimmt <code>.btn<\/code> mit dem generellen Einstellungen, die sich \u00fcber alle Varianten zieht (wie padding, margin, Schrift, display-Eigenschaften). Es ist praktische der erste Lego Stein, der allen Buttons zugrunde liegt.<\/p>\n<p>Darauf folgen verschiedene Steine, die das <strong>funktionale Styling<\/strong> \u00fcbernehmen. Das sind die classes <code>.btn--default<\/code>, <code>.btn--primary<\/code>, <code>.btn--secondary<\/code> und <code>.btn--disabled<\/code> mit verschiedenen Farben und Hintergrundfarben. Ein Button braucht so mindestens zwei classes. Um mit <strong>Abweichungen<\/strong> umzugehen, gibt es eine dritte Art von Steine. <code>.btn--big<\/code> und <code>.btn--small<\/code> definieren die Ver\u00e4nderungen in den Gr\u00f6\u00dfen vom Standard, der von <code>.btn<\/code> definiert ist. Demnach m\u00fcssen sie auch als letzte zugewiesen werden.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-4905\" src=\"https:\/\/zeichenschatz.net\/wp-content\/uploads\/2016\/09\/css-wie-lego-modular-multiple-class-approach-in-css-2.jpg\" alt=\"CSS wie Lego \u2013 Modular Multiple Class Approach in CSS\" width=\"1920\" height=\"1080\" srcset=\"https:\/\/zeichenschatz.net\/wp-content\/uploads\/2016\/09\/css-wie-lego-modular-multiple-class-approach-in-css-2.jpg 1920w, https:\/\/zeichenschatz.net\/wp-content\/uploads\/2016\/09\/css-wie-lego-modular-multiple-class-approach-in-css-2-300x169.jpg 300w, https:\/\/zeichenschatz.net\/wp-content\/uploads\/2016\/09\/css-wie-lego-modular-multiple-class-approach-in-css-2-1024x576.jpg 1024w, https:\/\/zeichenschatz.net\/wp-content\/uploads\/2016\/09\/css-wie-lego-modular-multiple-class-approach-in-css-2-768x432.jpg 768w, https:\/\/zeichenschatz.net\/wp-content\/uploads\/2016\/09\/css-wie-lego-modular-multiple-class-approach-in-css-2-1536x864.jpg 1536w\" sizes=\"auto, (max-width: 1920px) 100vw, 1920px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>M\u00f6chte ich z.B. nun die Abmessungen der kleinen Buttons oder die Farbe der Disabled Buttons anpassen, muss ich daf\u00fcr nun jeweils eine \u00c4nderung vornehmen. Das ist nachvollziehbar und schnell erledigt. Au\u00dferdem beeinflusse ich damit nicht die all Buttons \u00fcberschneidenden Regeln. M\u00f6chte ich, das ein spezieller Button auf meiner Seite anders aussieht, kann ich das im HTML erg\u00e4nzen. Ich habe auf CodePen eine <a href=\"https:\/\/codepen.io\/glyphe\/pen\/PGzVqx\" target=\"_blank\" rel=\"noopener\">Demo geschrieben<\/a>, bei der man das gleich selbst ausprobieren kann.<\/p>\n<p class=\"codepen\" data-height=\"388\" data-theme-id=\"light\" data-slug-hash=\"PGzVqx\" data-default-tab=\"html,result\" data-user=\"glyphe\" data-embed-version=\"2\">See the Pen <a href=\"https:\/\/codepen.io\/glyphe\/pen\/PGzVqx\/\">CSS buttons as Modular Multiple Class approach<\/a> by Oliver (<a href=\"http:\/\/codepen.io\/glyphe\">@glyphe<\/a>) on <a href=\"http:\/\/codepen.io\">CodePen<\/a>.<\/p>\n<p><script src=\"\/\/assets.codepen.io\/assets\/embed\/ei.js\" async=\"\"><\/script><\/p>\n<h2>Zusammengefasst<\/h2>\n<p>Fr\u00fcher verfiel auch ich dem Wunsch m\u00f6glichst keine bis wenige classes in mein Markup zu schreiben. Diese Herangehensweise hat in vielen F\u00e4llen zu un\u00fcbersichtlichem, schwer erweiterbarem und wartbaren Code gef\u00fchrt. Deshalb habe ich nach einem anderen Umgang mit meinen Selektoren gesucht. Durch die Herangehensweise mit multiplen modularen classes erreicht man:<\/p>\n<ul>\n<li><strong>Unabh\u00e4ngigkeit<\/strong> von der Markup-Sturktur \u2013 ich kann meine Styles an beliebigen Stellen der Seite einsetzen und von einer Stelle auf eine andere nur mit einer \u00c4nderung im HTML \u00fcbertragen.<\/li>\n<li><strong>Nachvollziehbarkeit<\/strong> wie das Design auf einzelne Elemente zugreift und dadurch mehr Sicherheit beim Arbeiten im Team oder wenn man nach l\u00e4ngerer Zeit zu einem Projekt wieder zur\u00fcckkehrt.<\/li>\n<li>Nat\u00fcrlich auch <strong>mehr Markup<\/strong>. Doch der Aufwand dieses zu erweitern bzw. zu ver\u00e4ndern ist meistens geringer, als CSS um eine komplexe Selektor-Sturktur zu erweitern oder zu ver\u00e4ndern.<\/li>\n<\/ul>\n<p>Abschlie\u00dfend m\u00f6chte ich noch betonen, das viele der Dinge, die ich hier schreibe nicht neu sind. Sie waren es nur f\u00fcr mich und sind wahrscheinlich eine Zusammenfassung einiger Beitr\u00e4ge von <a href=\"http:\/\/csswizardry.com\" target=\"_blank\" rel=\"noopener\">Harry Roberts<\/a>. Diese Herangehensweise von objektorientiertem CSS (OOCSS) ist auch bei den wunderbaren <a href=\"http:\/\/cssguidelin.es\" target=\"_blank\" rel=\"noopener\">CSS Guidelines<\/a> zu finden.<\/p>","protected":false},"excerpt":{"rendered":"<p>CSS ist einfach zu schreiben, aber schwierig zu warten. Vor allem nach l\u00e4ngerer Projektabwesenheit oder beim Arbeiten im Team. Eine Methode, um Code schlank und \u00fcbersichtlich zu halten ist eine Herangehensweise mit multiplen modularen classes. Wie Lego Bausteine kann man dadurch seine Styles wiederverwenden und verschieden kombinieren. Eine Herangehensweise in drei Schritten. 1. Classes statt [&hellip;]<\/p>","protected":false},"author":3,"featured_media":4905,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[13],"tags":[83],"class_list":["post-4894","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-webdesign","tag-css"],"_links":{"self":[{"href":"https:\/\/zeichenschatz.net\/en\/wp-json\/wp\/v2\/posts\/4894","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/zeichenschatz.net\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/zeichenschatz.net\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/zeichenschatz.net\/en\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/zeichenschatz.net\/en\/wp-json\/wp\/v2\/comments?post=4894"}],"version-history":[{"count":0,"href":"https:\/\/zeichenschatz.net\/en\/wp-json\/wp\/v2\/posts\/4894\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/zeichenschatz.net\/en\/wp-json\/wp\/v2\/media\/4905"}],"wp:attachment":[{"href":"https:\/\/zeichenschatz.net\/en\/wp-json\/wp\/v2\/media?parent=4894"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/zeichenschatz.net\/en\/wp-json\/wp\/v2\/categories?post=4894"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/zeichenschatz.net\/en\/wp-json\/wp\/v2\/tags?post=4894"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}