Datum
Kommentare Keine

Ich habe in der Vergangenheit schon über die Möglichkeiten zur Kombination von CSS Klassen geschrieben, möchte ich an dieser Stelle einmal kurz das Thema Verkettung von CSS-Dateien aufgreifen.

Ihr könnt also verschiedene CSS-Dateien miteinander kombinieren. Wenn euch der Sinn dieser Vorgehensweise nicht ganz klar sein mag, stellt euch vor, ihr habt ein recht umfangreiches Webprojekt übernommen. Der Kunde wünscht sich ein paar Anpassungen, die schnellstmöglich umgesetzt werden müssen. Dummerweise fehlt euch die Zeit für eine Einarbeitung in das bereits vorhandene Material.

Hier kann es hilfreich sein, erstmal eine zusätzliche CSS-Datei an die Webseite zu hängen, die die gewüschte Änderung für die entsprechenden Elemente enthält. Damit stellt ihr erstmal sicher jederzeit wieder “zurückzukönnen”, falls die Änderung(en) unerwünschte Nebeneffekte haben.

Weiterhin bieten sich zusätzliche CSS-Dateien für Projekte an, bei denen Ihr eine CSS-Datei wiederverwendet und nur im geringen Maße anpassen müsst. Dies kann z.B. der Fall sein, wenn ein Kunde eine weitere Webseite benötigt, z.B. als Themenseite für ein neues Produkt, die sich an wenigen Punkten von der Hauptseite unterscheidet und Änderungen der Formatierungen notwendig machen. So könnt ihr die Formatierungen der Hauptseite übernehmen und nur die notwendigen Änderungen manuell vornehmen.


Datum
Kommentare Keine

Responsive Design ist eines der gängigsten Schlagwörter im Bereich Webseiten der letzten Jahre. Dieser Begriff steht als Synonym erstmal für Webseiten, die sich dynamisch dem jeweiligen Endgerät anpassen.

War so etwas technisch bis vor einigen Jahren fast ausschliesslich über Skriptsprachen, wie z.B. JavaScript möglich, haben wir mit CSS unter Einsatz sog. “Media Queries” nun die Möglichkeit z.B. direkt die Ausgabe passend zum eingesetzten Medium (Print, Screen, etc) oder der Auflösung des jeweiligen Bildschirms.

Aber wie genau funktioniert das? Eigentlich ist das gar nicht kompliziert. Zuallererst formatieren wir unsere Seite wie gewohnt per CSS, ich bevorzuge hierbei ein Vorgehen von groß (Bildschirm mit 1920 * 1080 px) nach klein (Mobiltelefone). Manch einer arbeitet auch genau umgekehrt. Richtig oder falsch gibt es hier nicht, jeder muss einfach schauen, mit welcher Vorgehensweise er am Besten zurechtkommt.

Haben wir unsere Seite soweit fertig programmiert, geht es daran die entsprechenden Anpassungen für unterschiedliche Auflösungen vorzunehmen. Hierzu sollte man natürlich bereits im Vorfeld geplant haben, wie sich die Anzeige unterschiedlicher Elemente bei wechselnden Auflösungen verhält. Welche Elemente ändern ihre Größe, werden augeblendet, kommen hinzu, werden neu platziert, etc… Eines muss klar sein: Ohne ordentliche Planung geht hier nichts. Das Projekt zieht sich sonst ewig in die Länge.

Hier mal ein kleines, rudimentäres Beispiel:

HTML

<div class="container"> <header>Logo und Firmenname</header> <nav><ul class="hauptmenue"><li>Link</li><li>Link</li><li>Link</li></ul></nav> </div> <div class"container"> <div class="inhalt">Ich bin der Inhalt und kann aus Bildern, Texten und weiteren Elementen bestehen</div> <aside>Seitenleiste mit Zusatzinformationen oder weiterführenden Links</aside> </div> <footer> <div class="container">Fussbereich mit Links, Kontaktdaten, etc.</div> </footer>

CSS

body{ font-size:13px;
}

.container{ width:940px; padding:10px;
}

.inhalt{ width:550px; float:left; }

aside{ width:300px;
}

footer{ background:#444; color:#fff;
}

Damit haben wir eine kleine Seite unter Verwendung von HTML5 Selektoren erstellt. Diese sollte an Bildschirmen mit Breiten von mehr als 1024 Pixeln ordentlich dargestellt werden. Da wir für einige Elemente aber fixe Breiten verwendet haben, ist bei niedrigeren Auflösungen horizontales Scrollen erforderlich. Auf sehr kleinen Bildschirmen, z.B. bei Mobiltelefonen kommt dazu, daß die Standardschriftgröße recht eingeschränkt lesbar ist. Was also tun?

Abhhilfe schafft die Erweiterung der CSS Datei um Media Queries. Nehmen wir jetzt mal an, wir wollen die Seite auch auf Geräten mit einer max. Breite von 1024 Pixeln ordentlich aussehen lassen und auf noch kleineren Geräten mit max. 640 Pixeln für ordentliche Lesbarkeit sorgen.

CSS

@media only screen and (max-width:1024px){ .container{ width: 700px; } .content{ width:640px; } aside{ display:none; } }

Wirklich Sinn macht dieser Code nicht, aber er kann euch einen Eindruck davon verschaffen, wie wie Anpassungen für unterschiedliche Auflösungen vornehmen können. Generell wird der Container in unserem Beispiel schmaler. Da jeweils ein Tag mit dieser Klasse den eigentlichen Inhalt im Header, Content und Footer umschliesst, erreichen wir damit zuallererst, daß unsere Webseite horizontal (das gleiche wäre auch in der Vertikalen machbar, ob das sinnig ist, steht auf einem anderen Blatt) in keinem Fall über den sichtbaren Bildschirmbereich hinausragt. Gleichzeitig lassen wir die Seitenleiste verschwinden. Dadurch gewinnt der Content mehr Platz auf dem Bildschirm (wird breiter). Alternativ könnten wir auch einfach beide Elemente untereinander in voller Breite anordnen:

CSS

.content{ float:none; }

.content, aside{ width:100%; }

Das wäre beispielsweise notwendig, wenn die Seitenleiste eure einzige Navigation enthält. In diesem Fall wäre es natürlich denkbar ungünstig diese nicht mehr anzuzeitgen.

Ein Vorteil beim Einsatz von Media Queries im Vergleich zu anderen Möglichkeiten der Anpassung für Mobilgeräte ist die Möglichkeit die Änderungen direkt am Bildschirm zu testen, da Media Queries die Größe des Anzeigefensters (Viewport) ermitteln und sich daran orientieren. Man muss also nicht zwangsläufig unterschiedliche Geräte oder Entwicklungsumgebungen bereithalten, um seine Webseite oder Mobilapplikation in der Zielauflösung zu testen.

Alles selbst machen, oder fertige Framworks nutzen, was ist besser? Diese Frage kommt oft, lässt sich aber nicht pauschal beantworten. Es gibt Frameworks, wie z.B. gs960, die genau für diese Arbeiten entwickelt wurden. Sie arbeiten meist mit einem festen Raster (Grid), anhand dessen eine Ausgabe für unterschiedliche Aulösungen umgesetzt wird. Diese Frameworks sind mächtig und funktionieren gut, keine Frage. Dummerweise erfordern sie eine gewisse Gewöhnung, auch im Hinblick auf das umzusetzende Design. Hierbei muss der Designer innerhalb des Rasters und der vorgesehenene Abstufungen für die jeweilige Auflösung bleiben. Sein Design muss sich also horizontal in Streifen mit fixer Breite pressen lassen, will man ein Rastersystem wie vorgesehen nutzen.

So funktional diese Systeme auch sind, bin ich der Meinung, daß deren Einsatz nur für Webworker lohnt, die es häufig bei verschiedenen Projekten einsetzen. Für einzelne Projekte sind die Einschränkungen vergleichsweise stark und auch die Kennenlernphase eher lang. Auch für “kleine” Projekte, deren Ausgabe sich z.B. auf zwei oder drei bestimmte Auflösungen fokussiert, macht ein fertiges Rastersystem wenig Sinn, da man nicht vergessen darf, daß man, im Hinblick auf den CSS-Code, eine Menge “Ballast” mitschleppt. Klar könnte man das entschlacken bzw. modifizieren, hat dann aber wieder das Problem bei zukünftigen Anforderungsänderungen an die Webseite oder die Applikation im ungünstigsten Fall von vorne beginnen zu müssen.

Wenn es denn also im begrenzten Umfang responsive sein muss, dann sollte in jedem Fall abgewogen werden, ob selbst geschrieben wird, oder ein fertigs System eingesetzt werden soll. Gerade bei kleineren Projekten macht es eher Sinn sich selbst um die notwendigen Anpassungen zu kümmern. Denn damit habe ihr die volle Kontrolle über alle Anpassungen und müsst euch nicht auf andere Autoren verlassen. Ihr spart euch überflüssigen Code und seit frei, was die Gestaltung eurer Seiten angeht.


Kategorie(n) ,


Datum
Kommentare Keine

CSS bietet viele nützliche Funktionen. So können wir hiermit schnell und einfach komplexe Layouts umsetzen. Um uns unnötige Programmierarbeiten zu sparen, sollten wir stets darauf bedacht sein mit unserem Code sparsam umzugehen. Programmierern wird nachgesagt von Haus aus faul zu sein. Ohne dies jetzt näher zu bewerten, gehört es zum Handwerk vorhandenen Code wenn möglich nicht nur einmal, sondern mehrfach zu verwenden.

Das Coderecycling bietet einige Vorteile. So können wir uns unnnötige, mehrfache Schreib- bzw. Tipparbeit sparen und damit gleichzeitig die zukünftige Wartbarkeit des Codes verbessern. Doch was bringt und das im Bezug auf CSS-Formatierungen bei Webseiten?

Ganz einfach. Wir können mit CSS Eigenschaften vererben (dies ist strenggenommen sogar der eigentliche Zweck eines CSS Stylesheets) . Diese Kaskadierung sorgt dafür, daß wir ausgehend von einer allgemeinen Formatierung auf Selektorebene vom Allgemeinen zum Speziellen “durchformatieren” können. Alternativ können wir auch ein an objektorientierte Programmiersprachen angelehntes Kozept von allgemeinen Klassendefinitionen und speziellen Objektformatierungen (Tags mit id-Attribut) implementieren.

Was vielen Webseitenerstellen, ob Entwickler, Designer oder Hobbybastlern nicht bewusst ist, ist die Möglichkeit CSS Klassen kombinieren zu können. So lässt sich z.B. ein einheitlicher Schatten definieren, der später auf mehrere Objekte angewendet werden kann:

CSS

.schatten{ box-shadow: #000 0px 0px 20px 30px; }

Dieser sehr einfache Schatten kann nun beliebig im HTML Dokument auf verschiedene Elemente angewendet werden. So lassen sich z.B. Boxen oder Eingabefelder mit einem (konsistenten) Schatten hinterlegen. Gehen wir weiter, sind auch diverse weitere Optionen denkbar:

CSS

.schatten{ box-shadow: #000 0px 0px 20px 30px;
}

.rahmen_grau{ border:1px solid #ccc; } .runde_ecke{ border-radius:3px; }

Diese allgemeinen Eigenschaften lassen sich nun auf (fast) beliebige Elemente innerhalb des HTML Quelltextes anwenden:

HTML

<div class="schatten">Ich bin eine Box mit Schatten. Ich beinhalte ein Eingabefeld <input type="text" class="schatten rahmen_grau" name="irgendwas" /> mit Schatten und Rahmen, sowie einen Knopf mit rahmen und runden Ecken <input type="submit" class="rahmen_grau runde_ecke" /> </div>

Hier sehen wir, wie sich einfach CSS-Klassen kombinieren lassen. Die jeweiligen Klassennamen werden dazu einfach im class-Attribut durch Leerzeichen getrennt “aufgerufen”. Dabei lässt sich auch direkt erkennen, worin der Vorteil des Einsatzes von spezifschen Klassen gegenüber einer direkten Formatierung, z.B. auf Selektorebene liegt. Wir können unsere Eigenschaften-Klassen für fast alle Elemente im Quelltext verwenden und erhalten so ein harmonisches Erscheinungsbild, ohne Formatierungen durch überflüßige “Kopieren und Einfügen”-Orgien übernehmen zu müssen. Weniger Code bedeutet weniger Fehler auf der einen und bessere Wartbarkeit auf der anderen Seite. Ist euch nämlich der Schatten irgendwann zu schwarz, könnt ihr ihn an zentraler Stelle anders einfärben, ohne jede entsprechende Formatierung mühselig anpassen zu müssen.

Viele Frameworks (insbesondere Grid-Systeme) nutzen kombinierte CSS Klassen um ein einheitliches Erscheinungsbild zu gewährleisten.


Kategorie(n)


Datum
Kommentare Keine

Es ist eine Glaubensfrage wie CSS Dateien am sinnvollsten strukturiert werden. Hierüber wurden Artikel und ganze Bücher geschrieben, es gibt unzählige Empfehlungen und “Best-Practices”, doch am Ende muss der Autor die Entscheidung treffen, wie er sein Markup und das dazugehörige CSS strukturiert.

Eine wenig verbreitete Möglichkeit ist die Anwendung on Techniken, die in objektorientierten Programmiersürachen, wie z.B. Java, C++ o.ä, verwendet werden. Folgt man konsequent dieem Ansatz, so erleichtert einem dies den fliessenden Wechsel zwischen verscheidenen Codeumgebungen ohne große Eingewöhnungsphasen.

Zu den Grundlagen der Objektorientierung gehört einerseits das Klassenmodell, sowie die Vererbung. Dies findet sich auch in CSS wieder, steht CSS doch für den Ausdruck “Cascading Stylesheets”, also kaskadierende oder vererbende Stilangaben.

Behält man dies im Hinterkopf, lässt sich eine CSS-Datei, sowie das zugehörige HTML-Markup logisch strukturieren. Nehmen wir an, ihr möchtet in eurem HTML Dokument eine Reihe von Rechtecken platzieren. Diese sollen unterschiedliche Größen und Farben haben. Der einfachste und am häufigsten gesehene Ansatz ist wohl dieser:

HTML

<div id="Rechteck1">Ich bin ein Rechteck</div> <div id="Rechteck2">Ich bin noch ein Rechteck!</div> <div id="Rechteck3"> Und noch eines...</div>

CSS

#Rechteck1{ Width: 400px; height:100px; background-color: red; color:#fff; } #Rechteck2{ width: 200px; height: 100px; background-color:green; color:#fff; } #Rechteck3{ width:200px; height:100px; background-color:#444; color:#fff; }

Zuegegeben, das Beispiel ist sehr rudimentär, soll euch aber einen Eindruck geben, wie man das Ganze einfacher und übersichtlicher gestalten kann. Wozu das gut ist? Klar funktioniert der obere Code problemlos. Für eine Seite, die nie wieder geändert wird, könnte man das ganze so umsetzen. Allerdings geht das ganze auch einfacher und übersichtlicher. Das bietet euch Vorteile bei der späteren Bearbeitung. Wenn ihr dann noch ordentlich kommentiert, kann später auch jemand anderes euren Code problemlos weiterbearbeiten.

HTML

<div class="rechteck" id="Rechteck1">Ich bin ein Rechteck</div> <div class="rechteck" id="Rechteck2">Ich bin noch ein Rechteck!</div> <div class="rechteck" id="Rechteck3">Und noch eines...</div>

Unterschied gefunden? Richtig, die Klasse “rechteck” ist dazugekommen. Aber was soll das bringen, ausser das HTML “aufzublähen”? Ganz einfach. In objektorientierten Programmiersprachen werden zunächst sog. Objektklassen definiert. Diese legen grundsätzliche Eigenschaften von Objekten fest. Möchte man nun ein Objekt erzeugen, so ist dieses immer einer Klasse zugehörig, Objekte können nicht direkt erzeugt werden. Bei der Verwendung von CSS wird Einsteigern oft suggeriert, daß ein id-Attribut “ höherwertig” ist, als eine Klasse. Das kann man allerdings so nicht sagen. Es ist zwar anfangs einfacher oder verständlicher mit id-Attributen zu arbeiten, aber gleichzeitig legt uns diese Vorgehensweise auch eine wichtige Beschränkung auf. Ids müssen eindeutig sein und dürfen (pro HTML Seite) nur einmal verwendet werden. Das macht den Quelltext zwar eindeutig und ggf. leicht verständlich, führt aber zu unverhältnismäßig großen CSS Dateien, da man jeden Tag mit id-Attribut, also einfacher gesagt jedes “Objekt” einzeln formatieren muss – kann man machen, ist aber nicht die eleganteste oder gar praktibelste Lösung. Wäre es nicht viel sinniger unnötigen Code direkt zu vermeiden? Jeder Student, der Informatik oder ein verwandtes Studienfach gewählt hat, begegnet in seinem Studium irgendwann dem Grundsatz der Sparsamkeit. Auch wenn die möglichen Folgen unnötig umfangreicher Codewüsten für HTML-Projekte normalerweise nur begrenzte Effekte haben, ist es auch hier sinnvoll auf sauberen Code zu achten. Wenn wir uns hierzu nochmal unsere Rechtecke und das angepasst HTML-Markup vornehmen, lässt sich dies auch so umsetzen:

CSS

.rechteck{ width:200px; height: 100px; color:#fff; } #Rechteck 1{ background-color:red; width:400px; } #Rechteck 2{ background-color:green; } #Rechteck3{ background-color:#444; }

Sieben Codezeilen anstatt zwölf, mathematisch gesehen 41,7% weniger Code – wenn das keine Ersparnis ist. Schaut man sich die neue CSS-Datei an, fällt auf, daß die Klassendefinition für die Klasse “rechteck” dazugekommen ist. Diese definiert alle grundlegenden Formate eines (in unserem Beispiel) Rechtecks. Alle Rechtecke haben so z.B. eine Höhe von 100px und enhaltener Text ist weiss. Für unsere drei Rechtecke haben wir dann bei den einzelnen Objekten vom Typ Rechteck nur noch Abweichungen vom Standardrechteck definiert. Welche Vorteile bringt und das? Ganz einfach. Kommt nun z.B. ein Rahmen dazu, müssen wir nur noch die Klassendefinition anpassen:

CSS

.rechteck{ width:200px; height:100px; color:#fff; border: 1px solid #eee; }

Alle Rechtecke der Klasse bekommen nun einen grauen Rahmen mit einem Pixel Breite. Merkt ihr nun, daß euch die Textfarbe nicht mehr passt, könnt ihr diese einfach anpassen:

CSS

.rechteck{ width:200px; height:100px; color:#eee; border: 1px solid #eee; }

Das lässt sich so beliebig fortsetzen. Die Klasse “rechteck” vererbt Ihre Eigenschaften an alle Objekte der Klasse weiter, bis Sie explizit überschrieben werden. So könnte man nun z.B. das Objekt “Rechteck1” optisch etwas herausarbeiten wollen und es einfach in der Höhe verdoppeln:

CSS

#Rechteck1{ background-color:red; width:400px; height:200px; }

Wenn ihr jetzt so richtig in Fahrt seit und etwas ganz Verrücktes machen wollt, könnt ihr auch ein neues Rechteck einbauen:

HTML

<div class="rechteck" id="Rechteck1">Ich bin ein Rechteck</div> <div class="rechteck" id="Rechteck2">Ich bin noch ein Rechteck</div> <div class="rechteck" id="Rechteck3">Und noch eines...</div> <div class="rechteck">Ein neues Rechteck</div>

Wie, diesmal keine ID? Geht das? Ja, geht. Das neue Rechteck bekäme in diesem Fall alle Standardformatierungen, aber kein eigenes id-Attribut. Damit ließe sich dieses spezielle Rechteck zwar nicht mehr direkt anpassen, aber, wenn der betreffende Tag (hier: div) z.B. nur die Funktion hat, Text einen Rahmen (sichtbar oder nicht) zu geben, reicht das vollkommen aus. Man nutzt dies z.B. gerne bei Konstrukten mit sog. Container-divs, die den eigentlichen Inhalt einer Website in einem (unsichtbaren) Rahmen halten.

Folgt man streng der Hierarchie eines CSS-Dokuments, müsste man eigentlich sogar noch vor der Klassendefinition ansetzen, also die allgemeinen Formatierungen direkt auf Selektorebene durchführen. Das kann man machen, hat aber unter Umständen den Nachteil umfangreiche Anpassungen erforderlich zu machen, falls an bestimmter Stelle eine vom Standard abweichende Slektorformatierung gewünscht ist. Ausserdem hat der Ansatz einer allgemeinen Klassendefinition den Vorteil “typübergreifend” verfügbar zu sein. So könnten wir in unserem Beispiel z.B. auch einen Absatz oder ein Bild mit der Klasse “rechteck” auszeichnen und hätten auch diese Elemente direkt in der passenden Formatierung.

Sicherlich sind hier noch weitere, deutlich komplexere Beispiele denkbar. Für den Anfang will ich es aber hierbei belassen, immerhin möchte ich Einsteigern in die Thematik hier nur einige Denkanstöße liefern. Für Programmieraufgaben gibt is in der Regel mehr als eine sinnvolle Lösung, auch muss der hier gezeigte Ansatz nicht unbedingt für jeden Anwendungsfall der Optimale sein. Was in jedem Fall (noch) fehlt, sind Variablen. Diese sind so in der aktuellen CSS-Spezifikation nicht vorgesehen. Es gibt allerdings bereits CSS-Frameworks, die diesen Umstand beheben.


Kategorie(n)


← Älter Neuer →