Informationen über dieses Buch erhalten sie im Anhang: Dieses Buch
n.v.
Zunächst widmen wir uns in diesem ersten Teil etwas Theorie zum Internet und World Wide Web, um die Begriff zu trennen und den Hintergrund zu verstehen. Ein kurzer Anriss der jeweiligen Geschichte komplettiert diese Kapitel.
Dann bauen wir anhand eines Beispiels langsam eine einfache Version unserer Webpräsenz auf. Zunächst beschränken wir uns dabei auf eine Visitenkarte. Später wird das Beispiel dann immer komplexer und mündet in einer kompletten Webpräsenz. Dabei lernen wir die Techniken zur Webentwicklung wie HTML (Inhalte), CSS (Layout) und JavaScript (Dynamik) kennen.
n.v.
Bevor wir uns mit dem World Wide Web beschäftigen, sollten wir uns dem Internet zuwenden.
Da gibt es einen Unterschied?! Ja, denn nur umgamgssprachlich werden die beiden Begriffe nicht unterschieden. Für Profis sind das zwei ganz verschiedene Dinge.
Wir betrachten das Netz an sich und seinen Aufbau. Als Infrastruktur bietet sich das Internet als Plattform für verschiedene Dienste an. Und seine Geschichte lehrt uns, warum das Netz heute so ist wie es ist.
Brainstorming:
Was fällt ihnen zum Internet ein? Schreiben sie kurz ihre Gedanken auf einen Zettel.
(Wenn sie den Begriff Brainstorming (http://de.wikipedia.org/wiki/Brainstorming) nicht kennen, schlagen sie ihn zunächst in Wikipedia nach.)
Das Internet „an sich“ ist nicht direkt greifbar und somit auch nicht begreifbar. Wie können wir uns also dem Internet nähern. Fangen wir doch am besten mit einem praktischen Vergleich an.
Das Wort Internet besteht aus zwei Teilen: inter und net. Als Deutsche klingt uns das vertraut und wir dürfen wirklich Internetz übersetzen. „Inter“ bedeutet „zwischen“ und ein Netz verbindet Dinge (siehe Telefonnetz).
Machen wir einen kurzen Ausflug in die uns bekannte Welt: Eine Stadt. Eine Stadt hat ein Straßennetz. Auf dem Straßennetz komme ich von Punkt A nach Punkt B. Oder noch besser: Es verbindet Adresse A mit Adresse B. Von oben gesehen sieht so ein Straßennetz (http://de.wikipedia.org/wiki/Straßennetz) wie ein Spinnennetz (http://de.wikipedia.org/wiki/Spinnennetz) aus und so ist es sicherlich auch als Analogie (http://de.wikipedia.org/wiki/Analogie_(Rhetorik)) zu verstehen.
Übung:
Zeichnen sie das Straßennetz ihrer Stadt und der umgebenen Städte in einen Plan.
(Beispiel Straßennetz (images/Strassennetz.svg))
Wenn wir jetzt aber von Stadt zu Stadt oder Bundesland zu Bundesland fahren wollen, sind die Straßennetze der Städte wieder durch ein – vereinfacht gesagt – Überlandstraßennetz verbunden. Dieses Überlandstraßennetz entspricht in unserer Analogie dem Internet: Das Internet verbindet weltweit lokale Netze (LANs (http://de.wikipedia.org/wiki/Local_Area_Network)) von Firmen, Institutionen und heutzutage auch Privatpersonen.
Wie das Straßennetz ist das Internet also eine Infrastruktur (http://de.wikipedia.org/wiki/Infrastruktur) um Dinge zu befördern. Auf Straßen werden Personen und Güter transportiert, das Internet befördert Daten und Informationen. Es ist also dem Telefonnetz vergleichbar, das Faxe und Gespräche weiterleitet.
Wie auch bei anderen Netzen (Straßen und Telefon) gehört das Internet keiner Institution. Bestimmte Firmen betreiben einen Teil des Netzes auf eigene Kosten. Andere Firmen vermieten wiederum ihre Infrastruktur oder binden den Endkunden gegen Gebühr an. Hier gibt es eine gewisse Diskrepanz zwischen Firmen, die mit Internetdiensten großen Profit machen und den Firmen, welche die Infrastruktur betreiben.
In diesem Zusammenhang spricht man heute immer mehr über Netzneutralität (http://de.wikipedia.org/wiki/Netzneutralität). Um diesen Begriff besser zu verstehen, folgt ein Beispiel aus dem Telefonnetz: Anbieter von Diensten mit 0190er/0900ter Nummern (Sex-Hotlines, Börsentelefone) können sehr viel Geld verdienen. Die Betreiber der Netze (Telekom, Arcor, …) bekommen aber immer nur einen festen kleinen Betrag.
Das Netz verhält sich aber trotzdem neutral gegenüber dem Dienst, d.h. er wird nicht bevorzugt. Der Netzbetreiber behandelt also diesen Premiumkunden genauso wie beispielsweise eine kostenlose Telefonseelsorge.
Übung:
Zeichnen sie in das bestehende Straßennetz einige wichtige Geschäfte und Dienstleister ein.
(Beispiel Straßennetz mit Geschäfte (images/Strassennetz_mit_geschaefte.svg))
Damit ist aber auch schon eine wichtige Unterscheidung klar geworden: Das Internet ist wie das Telefonnetz eine reine Infrastruktur. Die Dienste, die darauf laufen, sind eigentlich davon klar zu trennen. Umgangssprachlich vermischt sich das aber. So spricht man von der Telefonabzocke, obwohl das Telefon niemand abzockt, sondern höchstens der Diensteanbieter.
Ähnlich ist es mit dem Internet. Umgangssprachlich gebraucht man das Wort für zwei verschiedene Dinge. Einmal tatsächlich für die Infrastruktur, aber andererseits auch für den bekanntesten Dienst: das World Wide Web (WWW)! In diesem Buch meint das Wort „Internet“ allerdings immer die Infrastruktur.
Wie das Internet physikalisch funktioniert, mag uns an dieser Stelle nicht interessieren, da es für das Entwerfen von Webseiten nicht wichtig ist. Die Wikipedia gibt zur Technik (http://de.wikipedia.org/wiki/Internet#Technik) und den Protokollen (http://de.wikipedia.org/wiki/TCP/IP-Referenzmodell#TCP.2FIP-Referenzmodell) gerne Auskunft.
Der logische Aufbau des Netzes und seine Begriffe sind für uns aber sehr wohl wichtig.
Kommen wir zu unserem Vergleich mit dem Straßennetz zurück. Im Internet nehmen sie bestimmte Dienste wie das WWW in Anspruch. Genauso machen sie es ja auch in der Realität einer Stadt. Sie wollen beispielsweise ein Medikament in einer Apotheke holen.
Gehen wir davon aus, das sie sich in der Stadt nicht auskennen. Sie besorgen sich zu nächst - beispielsweise in den Gelben Seiten - den Namen einer Apotheke X. Anhand des Namens erfragen oder schlagen sie dann die Adresse nach. Mit der Adresse fahren sie beispielsweise per Taxi zu Apotheke.
Im Internet läuft das im Prinzip genauso. Sie besorgen sich (googeln) den Namen einer Internetapotheke (www.x-apotheke.de). Beim Besorgen der Adresse haben sie es im Internet einfacher. Das macht ein weiterer Dienst für sie, der Domain Name Service (http://de.wikipedia.org/wiki/Domain_Name_Service) (DNS, s. Anhang: Fachbegriffe). Auch die Fahrt mit dem Taxi bleibt ihnen erspart, da sie ja mit dem Browser ein dauerhaftes, preiswertes Transportmittel besitzen.
Begriff | Realität | Internet |
---|---|---|
Medium: | Straßennetz | Internet |
Name: | Apotheke X | www.x-apotheke.de |
Auskunft: | Gelbe Seiten | DNS |
Adresse: | Hauptstraße 1 | 123.45.67.89 |
Dienst: | Laden | WWW |
Das Internet kennt also auch die Unterscheidung von Namen und Adressen, wie im realen Leben. Diese sind übrigens - wie im wirklichen Leben - unabhängig vom verwendeten Dienst. Dass heißt, eine Adresse kann ein Dienst wie WWW und/oder Email bereitstellen.
Unter einer Adresse 123.45.67.89 kann sich sowohl eine Apotheke als auch ein Schuster befinden. Dann unterscheidet beide der Name – auch wie im richtigen Leben. Die Portnummer :80 (s.u.) kennzeichet eine WWW-Seite (Realität: Ladengeschäft) und kann normalerweise weggelassen werden. Andere Portnummern (http://de.wikipedia.org/wiki/Portnummer) sind für andere Dienste wie Post ausliefern (SMTP: 587) und Postfächer (POP3: 110) bestimmt.
Begriff | Realität | Internet |
---|---|---|
Adresse: | Hauptstraße 1 | 123.45.67.89 |
Namen: und weitere Adressen: | Apotheke X Schuster Briefkasten (Nebenstr. 2) Postamt (Anderestr. 3) | www.x-apotheke.de:80 www.lederschuster.de:80 smtp.provider.de:587 (12.34.56.78) pop.provider.de:110 (98.76.54.32) |
Dienst: | Laden/Kasten | Web-Dienst |
Anfahrt: | z.B. Taxi | Programm (Webbrowser/Mail-Client) |
Wie sie sehen kann ein Name auch mehrere Adressen haben. Gerade bei stark frequentierten Diensten wie Google ist das oft der Fall.
Für den Begriff der Webseite existieren leider sehr viele Synonyme (http://de.wikipedia.org/wiki/Synonym). Man spricht auch von Homepage, Website, Portal und Webpräsenz. Alle diese Begriffe habe ihre eigenen Ausprägungen, aber je nach Autor können diese variieren.
Dieses Buch verwendet durchgängig Webseite für ein einzelnes HTML-Dokument und Webpräsenz für den gesamten Internetauftritt.
Dienste sind Leistungen die ihnen jemand anbietet. In der Informatik spricht man in diesem Fall von Server (http://de.wikipedia.org/wiki/Server_(Software)) und Client (http://de.wikipedia.org/wiki/Client). Der Server bietet dem Client bestimmte Dienste an. Das können pro Server durchaus mehrere sein.
Achtung! In der Informatik kann ein Server und ein Client durchaus sowohl Hardware (http://de.wikipedia.org/wiki/Hardware) als auch Software (http://de.wikipedia.org/wiki/Software) sein. Wobei zur endgültigen Verwirrung sowohl auf einem Server (Hardware) auch ein Client (Software) und auf einem Client (Hardware) auch ein Server (Software) laufen kann (und heutzutage fast auch immer tut).
Dienste werden also immer von einem (Software-)Server angeboten. Ein Software-Client stellt diesen Dienst dann dem Benutzer komfortabel zur Verfügung. Ein Protokoll (http://de.wikipedia.org/wiki/Protokoll) sorgt dabei dafür, das sich Client und Server verstehen.
Brainstorming:
Welche Dienste kennen sie im Internet? Schreiben sie kurz ihre Gedanken auf einen Zettel.
(Internetdienste (http://de.wikipedia.org/wiki/Internetdienste))
Wir identifizieren die Internetdienste (http://de.wikipedia.org/wiki/Internetdienste) am einfachsten an den Client-Programmen: Outlook/Thunderbird (Mail-Client), Skype (Telefonie-Client), Whatsapp (Chat-Client), Internet Explorer/Firefox (Web-Client oder Webbrowser) usw.
Einige weitere Dienste als Beispiele:
Da dieses Buch Webseiten gestalten will, ist für uns natürlich vor allem das WWW interessant.
Das Internet ist erst Ende der neunziger Jahre des zwanzigsten Jahrhunderts in das Bewusstsein der Menschen gerückt. Es ist allerdings schon erstaunlich viel älter. Die Anfänge reichen fast bis zu den Wurzeln der modernen Informationstechnologie (IT) zurück.
Auch wenn das heutzutage immer wieder gerne verneint wird, liegt zumindest die Wurzel des Internets im militärischen Bereich. In den sechziger Jahren, zur Zeit des Kalten Krieges, entwickelten die Forscher der US-Militärs die Idee eines verteilten paketbasierten Datennetzes, welches dann später die Advanced Research Projects Agency (ARPA (http://de.wikipedia.org/wiki/DARPA)) umgesetzt hat.
Der Vorteil des ARPA-Netzes waren eben diese Attribute „verteilt“ und „paketbasiert (http://de.wikipedia.org/wiki/Paketvermittlung)“. „Verteilt“ meint, das es keine zentrale (also angreifbare) Instanz gibt und „paketbasiert“, das die Daten als kleine Paket individuell verschickt und registriert werden. Pakete die nicht angekommen sind, können so noch einmal angefordert werden.
Übung:
Zerlegen sie eine Nachricht in Pakete (numerierte Zettel) und schicken sie sie über verschiedene Stationen (Kursmitglieder) an einen Empfänger.
Was passiert, …
(Vereinfachtes Beispielpaket (images//beispiel_paket.txt))
Weil sich dieses Netz als sehr robust erwies, haben die amerikanischen Universitäten schnell daran gefallen gefunden. Als offene Architektur konnten sie das ARPA-NET einfach an ihre Bedürfnisse anpassen und weiterentwickeln. Daraus entstand das TCP/IP-Protokoll, wie es auch heute noch im Internet verwendet wird. Als offener und einheitlicher Standard sorgte dieses Protokoll für den relativ schnellen Siegeszug des Internet auf der ganzen Welt.
Doch zunächst war das Internet als Infrastruktur noch sehr nackt. Als Dienste gab es vor allem den Zugriff auf Uni-Server und die Synchronisierung dieser. Die Studenten der Unis entdeckten allerdings schnell die weiteren Möglichkeiten. Sie schufen Blackboards (Nachrichtenbretter) und das Usenet (Diskussionsforen).
In den USA, Europa und anderen Teilen der Welt arbeitete man zu dieser Zeit an eigenen Standards und Netzen. Große Firmen wie AOL, CompuServe und die Deutsche Post schufen eigene Datennetze. Doch der Einfluss der USA auf die IT sowie der offene Standard TCP/IP brachten das Internet auch in diesen Ländern voran.
In den USA war das militärisch und das zivile Netz mittlerweile entkoppelt. Für das zivile Backbone (Rückgrat) des Netzes setzte sich der Name Internet durch. Zuletzt bliebt dieses Internet als alleiniges weltweites Datennetz bestehen.
![]() |
ArpaNet 1977, Quelle: Wikimedia (http://www.wikimedia.org), Lizenz: CC-BY-SA (http://creativecommons.org/licenses/by-sa/2.0/) |
n.v.
Der Dienst WWW (World Wide Web) bestand ursprünglich nur aus dem Transferprotokoll HTTP (http://de.wikipedia.org/wiki/HTTP) und der Hypertextsprache HTML (http://de.wikipedia.org/wiki/Html). Dafür hat sich auch der Begriff Webseiten eingebürgert. Heute sind die Vorlagensprache CSS (http://de.wikipedia.org/wiki/Cascading_Style_Sheets) und die Programmiersprache JavaScript (http://de.wikipedia.org/wiki/JavaScript) dazu gekommen. Auf diese Teile gehen wir im weiteren Kursverlauf noch ausführlich ein.
Wir betrachten außerdem in einem Überblick die Software für die Webseitenentwicklung und erfahren wie wir zu relevanten Informationen kommen. Auch beim WWW ist seine Geschichte durchaus für uns interessant.
Die Hypertext Markup Language (HTML, Hypertext Auszeichnungssprache) ist wohl das am weitesten verbreitete Dateiformat und wohl auch das umstrittenste. Seine Stärken liegen im Klartextformat, in der Einfachheit und in der Erweiterbarkeit.
Angegriffen wurde HTML vor allen von Entwicklern und Designern. Diesen war die Sprache für ihre Bedürfnisse nicht spezifisch genug. Entwickler hätten gerne mehr Programmiermöglichkeiten und Designer mehr Layoutmöglichkeiten gehabt.
Entsprechend wurde HTML um JavaScript (Programmiermöglichkeiten) und CSS (Layoutmöglichkeiten) erweitert.
Brainstorming:
Wie schlagen sie Informationen in einer Bücherei nach? Schreiben sie kurz ihre Gedanken auf einen Zettel.
(Beispiel Katalog (images/beispiel_katalog.txt))
„Text lesen“ ist immer ein linearer Vorgang. Oft benötigt man aber Informationen, die an einer anderen Stelle stehen. Klassischerweise gibt es dann einen Verweis im Text.
Ist der Verweis allerdings nicht auf Papier sondern „im Computer“, liegt nichts näher als ihm direkt folgen zu können. Die Fähigkeit, mittels einer Verknüpfung (Link) in einen Text zu verweisen und dorthin springen zu können, nennt sich Hypertext. Diese Idee liegt nahe und ist dementsprechend alt.
Übung:
Überlegen sie sich, wie früher ein Zeitungsredakteur einem Setzer mitteilte, wie sein Text auszusehen hat. Versetzen sie sich in beide Rollen und spielen sie diese durch.
(Beispiel gesetzter Text (images/beispiel_setzen.txt))
Auszeichnungen in einem Text dienten ursprünglich den Setzern aus der Druckindustrie als Anweisung für Semantik (http://de.wikipedia.org/wiki/Semantik) (Bedeutungen) wie Überschrift oder Fließtext.
Genauso funktioniert auch eine Auszeichnung in HTML. Ein bestimmtes Tag (http://de.wikipedia.org/wiki/Tag_%28Informatik%29) (Etikett oder Auszeichner) weist den Webbrowser an, bestimmte Formatierungen oder Eigenschaften dem Text zuzuordnen. Das sind zum Beispiel Überschriften, Textabsätze, Listen, Tabellen oder Grafikreferenzen.
Tags in HTML sind hierarchisch strukturiert, dass heißt sie stehen in Beziehung zueinander und können geschachtelt werden.
<ul> <li>1. Punkt</li> <li>2. Punkt</li> <li>3. Punkt</li> </ul>
Am Beispiel kann man folgendes erkennen: Es gibt immer ein Starttag (<li>) und ein Endtag (</li>). Tags können ineinander geschachtelt werden (<ul><li> … </li></ul>). Allerdings ist dabei immer die Reihenfolge einzuhalten (Achtung falsch! <ul><li> … </ul></li>). Das Tag das zuletzt geöffnet wurde, muss immer zuerst geschlossen werden. Tags umschließen andere Tags und/oder Text.
HTML ist unabhängig vom Ausgabemedium. So kann ein HTML-Dokument beispielsweise auch über einen Sprachprozessor oder einen Drucker ausgegeben werden.
HTML, als reine Auszeichnungssprache, trennt nicht zwischen Darstellung und Inhalt, einem der Grundprinzipien der Informatik. Das stellt vor allem bei großen Projekten ein Hindernis dar, wenn sich das Layout einer Seite ändern soll. Es sind dann entsprechend alle Webseiten händisch aufwendig anzupassen.
Brainstorming:
Was wissen sie zu Formatvorlagen und Vorlagendateien in Word oder OpenOffice Writer? Schreiben sie kurz ihre Gedanken auf einen Zettel.
(Formatvorlagen in der Wikipedia (http://de.wikipedia.org/wiki/http://de.wikipedia.org/wiki/Formatvorlage))
Genau hier setzt CSS an: Inhalt (HTML) und Darstellung (CSS) werden in zwei getrennten Dateien gespeichert. Ändert man die Darstellung (CSS), passen sich automatisch allen davon abhängigen Webseiten an.
Dieses Buch verwendet deshalb von Anfang an CSS für Formatierungen, zumal dies längst alle modernen Webbrowser unterstützen.
Brainstorming:
Für was braucht man Programmierung? Schreiben sie kurz ihre Gedanken auf einen Zettel.
(Programmierung in der Wikipedia (http://de.wikipedia.org/wiki/Programmierung))
HTML hat für den Informatiker noch ein zweites Problem: Es ist keine Programmiersprache. Jede Interaktivität mit dem Benutzer kann nur durch den Aufruf einer weiteren HTML-Seite erfolgen. Sie kennen das bestimmt: Ein Klick auf einen Link öffnet eine neue Seite.
Das hat aber zwei erhebliche Nachteile. Erstens muss immer eine komplette Seite nachgeladen werden und zweitens verhält sich eine Webanwendung anders als eine Computeranwendung. Dieses Problem löst JavaScript, als eine in die Webseite eingebundene Programmiersprache. Ähnlich wie CSS kann auch JavaScript innerhalb der HTML-Datei oder als gesonderte Datei vorliegen.
Da auch JavaScript aus der modernen Webseitengestaltung nicht mehr wegzudenken ist, wird es auch relativ früh in diesem Buch eingeführt. Allerdings geht es dabei nur um das Einbinden bestehender JavaScript-Funktionen. Die Programmierung ist ein eigenes Kapitel.
HTML, CSS und JavaScript werden im sogenannten Klartextformat geschrieben. Können also mit jedem beliebigen Texteditor (Notepad) verfasst werden. Besser ist natürlich ein spezieller Editor, der die Syntax (http://de.wikipedia.org/wiki/Syntax) (Schreibweise) farblich unterscheiden kann (Notepad2, Notepad++, Hagen, …).
Sollten sie bisher Texte in einer Textverarbeitung geschrieben haben, müssen sie etwas umdenken. Deren Dateiformate sind kein Klartext – öffnen sie einfach einmal eine Office-Datei mit einem Texteditor. Allerdings kann fast jede Textverarbeitung als Dateiformat auch Klartext (meist „Text“ oder „Nur Text“ genannt) schreiben.
Natürlich existieren auch sogenannte WYSIWYG (http://de.wikipedia.org/wiki/WYSIWYG)-HTML-Editoren. Doch oft ist deren Ausgabe nicht hundertprozentig standardkonform. Am besten lernen sie HTML tatsächlich mit einem Texteditor.
HTML ist leider immer noch nicht so einheitlich wie man das erwarten sollte. Es existieren nach wie vor noch einige Diskrepanzen zwischen den Browsern, die teilweise bei JavaScript und CSS noch größer sind. An diese Grenzen stoßen wir in diesem Buch allerdings eher selten und wenn gehe ich kurz darauf ein.
HTML liegt in verschiedenen Versionen vor (HTML 1.0, 2.0, 3.2, 4.01, 5.0 und XHTML 1.0, 1.1). Früher konnte es durchaus wichtig sein, sich an eine bestimmte Version zu halten. Heute ist eigentlich nur noch HTML 4.01 sowie XHTML 1.1 und die kommende Version 5 interessant.
HTML beruht auf SGML (http://de.wikipedia.org/wiki/SGML) (Standard Generalized Markup Language, Normierte Verallgemeinerte Auszeichnungssprache). Der richtige Sprachgebrauch lautet: HTML ist eine Anwendung von SGML. SGML verwendet eine sogenannte DTD (http://de.wikipedia.org/wiki/Dtd) (Document Type Definition, Dokumenttypdefinition), um die syntaktische Gültigkeit eines Dokumentes zu prüfen. Entsprechend existieren DTDs für die HTML-Versionen. Dazu später mehr.
XHTML ist eine Neudefinition von HTML 4 auf Basis von XML (http://de.wikipedia.org/wiki/Xml) (Extensible Markup Language, erweiterbare Auszeichnungssprache). XML ist eine strengere Teilmenge und Vereinfachung von SGML. Es benutzt zur Gültigkeitsprüfung nicht nur DTDs, sondern auch XML-Schema (http://de.wikipedia.org/wiki/XML-Schema). Während DTDs eine eigene Syntax benutzen, verwendet XML-Schema wieder XML als Beschreibung der Gültigkeit. Trotzdem wird XHTML mit einer DTD auf Gültigkeit geprüft.
XML hat noch einige weitere Eigenschaften die Profis sehr schätzen. Vor allem die verschiedenen Zugriffs- und Manipulationmethoden sind dabei hervorzuheben. Das mag den Anfänger erst einmal nicht interessieren. Es schadet aber auf dem Weg zum Profi nicht, diese Vorzüge in der Hinterhand zu haben.
Die kommende CSS Version Level 3 ist zwar schon zu großen Teilen spezifiziert, aber noch nicht in allen Web-Browsern vollständig umgesetzt. CSS Vorlagen bedürfen also, genauso wie JavaScript, eine eingehende Prüfung mit den gängigen Browsern. JavaScript 1.5 ist als ECMA-262 Version 3 beim W3C standardisiert. Microsoft nennt die Sprache Jscript.
Zu den Unterschieden zwischen HTML und XHTML siehe den Anhang: xhtml. In diesem Buch verwenden wir immer die XHTML-Schreibweise, da sie alle modernen Browser korrekt darstellen und sie uns leichter Fehler finden lässt.
Als Klartextformat bedarf das Schreiben von Webseiten normalerweise keiner speziellen Software. Trotzdem kann eine Software so manche spezielle Aufgabe vereinfachen. Da es nicht „die“ Software zur Web-Entwicklung gibt und sicherlich auch nie geben wird, folgt eine kurze, unvollständige Übersicht.
Damit ihre Webseiten auf möglichst vielen Webbrowsern funktionieren, sollten sie sie entsprechend testen. Eine Mindestauswahl ist: Firefox (Rendering-Engine (http://de.wikipedia.org/wiki/HTML-Rendering): Gecko), Internet Explorer (Trident/Tasman), Google Chrome (WebKit) und Lynx auf zwei verschiedenen Betriebssystemen.
Webbrowser | Engine | Plattformen |
---|---|---|
Firefox | Gecko | Android, Linux, Mac, Windows |
Internet Explorer | eigene | Mac, Windows |
Opera | webkit | Android, Linux, Mac, Windows, weitere |
Safari | webkit | Mac |
Chrom(e/ium) | webkit | Android, Linux, Mac, Windows, weitere |
Lynx, Links | eigene | Textbrowser |
Weitere bei selfhtml (http://wiki.selfhtml.org/wiki/Grundlagen/Hilfsmittel/Software#Browser) und bei Wikipedia (http://de.wikipedia.org/wiki/Liste_von_Webbrowsern).
Für den Mozilla Firefox (und Google Chrome) existieren einige interessante Erweiterungen für Webentwickler. Allerdings sind diverse dieser Erweiterungen in den neusten Versionen von Firefox schon enthalten.
Firefox-Addon | Beschreibung |
---|---|
Web Developer | Werkzeugleiste für Webentwickler (enthalten) |
Firebug | HTML-Seiten analysieren und Fehler suchen (debuggen) (enthalten) |
FireFTP | Datei per FTP auf Webserver übertragen |
NoScript | JavaScript pro Site ein-/ausschalten |
Weitere bei Firefox Addons (http://addons.mozilla.org/de/firefox/).
Bei den HTML-Editoren unterscheidet man textorientierte und WYSIWYG (http://de.wikipedia.org/wiki/WYSIWYG)-Editoren (What you see is what you get). Textorientierte Editoren helfen dem Entwickler meist mit Grundgerüsten und Vorlagen für gängige HTML-Tags. Oft haben sie auch eine integrierte Vorschaufunktion und eine rudimentäre Projektverwaltung. WYSIWYG-Editoren arbeiten im Grunde genommen wie eine Textverarbeitung. Man erstellt eine Webseite so, wie sie nachher aussehen soll.
HTML-Editor | Beschreibung |
---|---|
Dreamweaver | Teurer WYSIWYG-HTML-Editor von Adobe |
NVU/Kompozer | Freier WYSIWYG-HTML-Editor von Mozilla (s. Firefox) |
Amaya | Freier WYSIWYG-HTML-Editor vom W3C ) |
Hagen | Freier, textorientierter HTML-Generator |
BlueFish | Freier, textorientierter HTML-Editor |
Weitere bei selfhtml (http://aktuell.de.selfhtml.org/links/html-editoren.htm) und bei Wikipedia (http://de.wikipedia.org/wiki/Liste_von_HTML-Editoren).
Wenn sie einen WYSIWYG-Editor ausprobieren möchten, sollten sie erste Erfahrungen mit den freien Editoren NVU oder Kompozer sammeln.
Es würde den Rahmen dieses Buches sprengen auf Webserver genauer einzugehen. Ein guter Einstiegspunkt für Informationen zu diesem Thema sind selfhtml und die Wikipedia (siehe Tabelle).
HTML-Editor | Beschreibung |
---|---|
Apache | Defacto-Standard Webserver |
Lighttpd | Kleiner, schneller Webserver |
Internet Information Services | Standardwebserver unter Windows |
Weitere bei selfhtml (http://wiki.selfhtml.org/wiki/Grundlagen/Hilfsmittel/Software#Webserver) und bei Wikipedia (http://de.wikipedia.org/wiki/Webserver).
FTP-Client | Beschreibung |
---|---|
ftp | Kommandozeilenprogramm für Linux und Windows |
FireFTP | Erweiterung für Firefox |
Filezilla | Freier FTP-Client |
Heutzutage können auch viele Dateibrowser (MS Explorer, Nautilus, Dolphin, Finder, …) bei Angabe des Dienstes (ftp://name:password@server.local) auf FTP-Server zugreifen.
Weitere bei selfhtml (http://wiki.selfhtml.org/wiki/Grundlagen/Hilfsmittel/Software#FTP) und bei Wikipedia (http://de.wikipedia.org/wiki/Kategorie:FTP-Client).
Grafikprogramm | Beschreibung |
---|---|
The Gimp | Freies Grafikprogramm für Linux und Windows |
Pinta | Freies Grafikprogramm für Linux und Windows |
XNView | Grafikbetrachter und -manipulator |
IrfanView | Grafikbetrachter und -manipulator |
Weitere bei selfhtml (http://wiki.selfhtml.org/wiki/Grundlagen/Hilfsmittel/Software#Multimedia) und bei Wikipedia (http://de.wikipedia.org/wiki/Grafiksoftware).
Portable Apps (http://portableapps.com/de) sind Anwendungen, die auf einem USB-Stick installiert werden. D.h. sie können auf beliebigen (Windows) Rechnern von dem Stick gestartet werden. Für uns nützliche Apps sind:
und vielleicht
Für fortgeschrittene Webanwendungen kann man außerdem einen Webserver wie Server2Go (http://server2go-web.de/) auf dem Stick installieren.
Eine komplette Referenz aller Informationen zur Webseitengestaltung finden sie unter: wiki.selfhtml.org (http://wiki.selfhtml.org/wiki/%%0%%) (veraltet, aber noch umfangreicher: de.selfhtml.org (http://de.selfhtml.org/%%0%%)). Ich werde mich in diesem Buch immer wieder auf Selfhtml beziehen, da ich der Meinung bin, dass man das Rad (HTML-Referenz) nicht ständig neu erfinden muss.
Alle neuen Tags bekommen auch eine Linksammlung auf diese Seiten in Klammern hinzugestellt: <p>. „S“ steht für die Referenz für das Tag in SelfHTML, „A“ für die Attribute des Tags und „W“ für das Tag im SelfHTML-WIKI. Da diese Referenz automatisch erstellt wird, muss sie nicht immer vollständig sein oder kann sogar ganz fehlen.
Entsprechendes gilt für CSS-Eigenschaften color: „W“ für die Eigenschaft im SelfHTML-WIKI und „C“ für die Eigenschaft im CSS-WIKI.
Kurzreferenzen zum schnellen Nachschlagen finden sie auch im Anhang.
Übung:
Surfen sie die Seiten selfhtml Wiki (http://wiki.selfhtml.org/wiki/%%0%%) und selfhtml (http://de.selfhtml.org/%%0%%) an und machen sie sich mit ihnen vertraut.
Weitere Seiten:
Außerdem finden sie in den Buchhandlungen viele Referenzbücher, die allerdings sehr schnell veralten. Deshalb kann ich an dieser Stelle keine Empfehlung abgeben. Für sehr Papieraffine ist allerdings eine beliebige Referenz sicherlich nicht verkehrt.
Ein Blick ins Netz ist für neuste Informationen immer nötig. Zu schnell ändern sich heutzutage die Browserversionen und damit die Unterstützung von neuen Features.
Die Geschichte des World Wide Web (WWW) wäre ohne das Internet nicht denkbar. Sie beruht auf den universitären Wurzeln des Netzes. In Publikationen sind die Verweise auf andere Publikationen für Forscher sehr wichtig.
So war es ein logischer Schritt, das Internet dazu zu nutzen. Erstaunlicherweise kommt gerade heute wieder die Diskussion auf, wissenschaftliche Artikel wieder frei im Netz zu veröffentlichen ( Artikel dazu (http://www.heise.de/ct/artikel/Offene-Wissenschaft-289060.html)).
![]() |
Tim Berner-Lee 2009, Quelle: Wikimedia (http://www.wikimedia.org), Lizenz: CC-BY-SA (http://creativecommons.org/licenses/by-sa/2.0/) |
In den achtziger Jahren entwickelte der Informatiker Tim Berner-Lee am Genfer Forschungszentrum für Teilchenphysik (CERN) den Urahn des heutigen Dienstes WWW. Es war ein Pascal (http://de.wikipedia.org/wiki/Pascal_%28Programmiersprache%29)-Programm welches er Enquire (sich erkundigen) nannte.
Wie damals üblich war das Programm eine rein textbasierte Anwendungen mit der man ein wissenschaftliches Journal (Adressen, Gesprächsnotizen, Ideen, Erlebnisse, Arbeitsergebnisse und so weiter) verwalten konnte. Die Besonderheit des Programms war seine Hypertextfähigkeit.
Mit Hypertext bezeichnet man die Möglichkeit Dinge in einem Text miteinander zu verknüpfen oder zu verweisen. So kann man die Linearität eines Textes durchbrechen. Ein Buch ist immer Linear. Das ist aber nicht unbedingt das, was der Leser sich wünscht.
Oft braucht er zu einer Information eine andere, die sich aber ganz woanders im Buch findet. Der Autor kann ihm mit einem Verweis auf eine Seite oder ein Kapitel helfen. Suchen muss der der Leser selbst. Im Hypertext kann er den Verweis direkt folgen.
Nach Anregung eines Kollegen entwickelte Tim Berner-Lee diese Idee fürs Internet weiter und fand den Namen World Wide Web (WWW). Es dauerte dann allerdings noch eine Weile bis sich das Konzept immer mehr durchsetzte und das CERN verließ. Erst als einige unabhängige Programmierer Browser (Anzeigeprogramme) für das WWW schrieben, kam die Sache langsam ins Rollen. Die erste Website war übrigens 1990 unter der Adresse info.cern.ch (http://info.cern.ch) erreichbar.
![]() |
Marc Andreessen 2013, Quelle: Wikimedia (http://www.wikimedia.org), Lizenz: CC-BY-SA (http://creativecommons.org/licenses/by-sa/2.0/) |
Marc Andreessen war einer dieser Programmierer, der einen Browser für das WWW schrieb: den Mosaic. Anders als die meisten anderen dachte er dabei durchaus kommerziell. Er erweiterte den Browser mit neuen Features – sehr zum Ärger von Berner-Lee – und machte damit das Web populär.
Um wirklich Geld zu verdienen, schied Andreessen bald aus dem Mosaic-Projekt aus und gründete die Firma Netscape. Mitte der Neunziger hatte der Netscape Communicator schon einen Marktanteil von etwa 90%.
Microsoft verschlief zunächst die Entwicklung des Internet; es wollte seine eigene Technologie (MSN) durchsetzen. Erst als dies scheiterte, entwickelte man mit Hochdruck einen eigenen Browser, den man mit seinem Betriebssystemmonopol am Markt durchdrückte. Der Kampf um die Marktanteile mit Netscape wurde mit immer neuen, zum Teil inkompatiblen, Features ausgetragen. Zum Schluss wurde es eine Kunst Webseiten für beide System zu entwickeln.
Da diese Entwicklung sehr schnell sichtbar wurde, wurde mit dem W3-Konsortium (W3C) bald ein Standardisierungskomitee gegründet. Es hat bis heute viele Standards für das Internet und insbesondere das WWW (HTML 4.01 und XHTML 1.1) geschaffen. Leider halten sich die Browser auch in ihren neusten Versionen (Stand Anfang 2014) nicht 100% daran.
n.v.
Zunächst widmen wir uns dem HTML-Teil einer Webseite - also den Inhalten. Wie schon beschrieben, trennen moderne Webpräsenzen in Inhalt (HTML) und Layout (CSS). Aber auch historisch gesehen kommt HTML zuerst. Außerdem wollen wir zu Anfang ja auch einige schnelle Erfolge (für die Motivation :-).
Ich gehe davon aus, das sie mit einem Dateibrowser (Windows Explorer), einem Webbrowser (Internet Explorer oder besser Firefox) und einem Texteditor (Notepad) umgehen können. Für unsere ersten Gehversuche benutzen wir den Text-Editor „Notepad2“ oder „Notepad++“ und den Browser „Firefox“. Diese Programme sollten auf ihrem Rechner installiert sein.
Beide Programme bekommen sie auch als portable Versionen für den USB-Stick. Laden (http://portableapps.com/de/download) sie dazu die „Portable Apps“ herunter und installieren sie sie auf einem schnellen USB-Stick (http://de.wikipedia.org/wiki/USB-Speicherstick).
Unter Mac OS und Linux können sie die normalen Standard-Editoren verwenden.
Richten sie sich ihren USB-Stick ein oder legen sie sich ein Verzeichnis für ihre Übungsdateien an. Sollten sie PortableApps verwenden, findet sich auf dem Stick ein Verzeichnis „documents“. Wenn nicht legen sie es an. In diesem Verzeichnis sollten sie ihre Dateien ablegen.
Anmerkung: Wenn sie mit den PortableApps arbeiten, achten sie darauf, auch wirklich alle Programme von dort zu starten. Wenn sie ein Programm gestartet haben, zieht sich PortableApps in das Benachrichtigungsfeld (http://de.wikipedia.org/wiki/Benachrichtigungsfeld) (Systemtray) zurück. Öffnen Sie Dateien auch nicht mit Doppelklick, da sonst die lokal installierten Programme benutzt werden.
Um Webseiten zu erstellen, sollten sie sich einen gewissen Arbeitsablauf aneignen.
Öffnen sie Firefox und den Editor (Notepad2 oder Notepad++). Klicken sie dann rechts auf die Taskleiste und wählen „Fenster nebeneinander anzeigen“. Sollten weitere Fenster erscheinen, schließen sie diese und wiederholen sie die Prozedur. Wenn sie jetzt in beiden Programmen die selbe Datei öffnen, können sie diese im Editor bearbeiten und speichern Strg + S. Danach drücken sie im Firefox F5, um die Änderungen sofort zu sehen.
Achtung: Kopieren sie die bestehende Datei immer vor jedem neuen Beispiel, damit sie alle Versionen ihrer Arbeit aufheben können. Entsprechend sind auch alle Beispieldateien durchnumeriert.
Um effektiv und schnell arbeiten zu können, beachten sie bitte den Anhang: Tastaturkommandos.
Ein Zeichensatz (http://de.wikipedia.org/wiki/Zeichensatz) teilt einem Betriebssystem oder einem Programm mit, wie die Zeichen (Buchstaben, Zahlen, …) intern zu codieren (darzustellen) sind. Noch vor einiger Zeit hatte jedes System seinen eigenen Zeichensatz (ASCII, ANSI, EBCDIC, …). Heute existiert zum Glück UTF-8 über (fast) alle Systemgrenzen hinweg.
Achten sie in ihrem Texteditor also auf die (Zeichen-)Kodierung UTF-8.
Lesen sie außerdem in der Wikipedia über Textdateien (http://de.wikipedia.org/wiki/Textdatei) nach.
Der einfachste Fall einer Webpräsenz ist eine Visitenkarte.
Brainstorming:
Was gehört auf eine Visitenkarte? Schreiben sie kurz ihre Gedanken auf einen Zettel.
(Beispiel Visitenkarte (images/brainstorming_visitenkarte.txt))
Wir setzten nun das Ergebnis des Brainstormings in die Praxis um. Dabei verfeinern wir die Ergebnisse suksessive.
Anmerkung: Lesen sie in der Wikipedia nach, was QR-Codes (http://de.wikipedia.org/wiki/QR-Code) sind. Zum Erzeugen können sie einen Generator (http://qr-code-generator.de) verwenden. Allerdings muss ich sie leider noch ein bisschen vertrösten, bis wir eine Grafik (wie einen QR-Code oder ein Passfoto) in unsere Webseite einbauen können, dauert es noch ein wenig.
Übung:
Öffnen sie den Editor und schreiben sie jetzt ihre Visitenkarte. Speichern sie den Text unter dem Dateinamen „visitenkarte.txt“ in ihren Arbeitsordner. Öffnen sie Ihren Webbrowser und laden sie die Datei „visitenkarte.txt“.
(Beispiel 01_visitenkarte.txt (beispiele/03a/01_visitenkarte.txt))
Sie haben gerade ihre erste Webseite geschrieben, die in etwa wie im Beispiel 1 aussehen sollte. Ich gebe zu, hier habe ich ein wenig gemogelt. Denn HTML-Seiten sollten auch die Endung .html haben. Nichtsdestotrotz können sie diese Seite auf einen Webserver legen und im Internet abrufen.
Computer kodieren Umlaute durch Zahlen in einem Zeichensatz (http://de.wikipedia.org/wiki/Zeichensatz). Dafür existieren verschiedene Zeichensatzsysteme. Am Anfang werden die Umlaute deshalb noch falsch dargestellt. Dazu später mehr.
Wenn sie die Zeichenkodierung im Browser unter „Ansicht / Zeichenkodierung“ auf „Unicode“ (UTF-8) stellen, sollten die Umlaute richtig dargestellt werden.
Übung:
Speichern sie die Datei visitenkarte.txt unter dem neuen Namen visitenkarte.html. Alternativ können sie sie auch kopieren und umbenennen. Öffnen sie die Datei dann mit ihrem Webbrowser.
(Beispiel 02_visitenkarte_txt.html (beispiele/03a/02_visitenkarte_txt.html))
Sind sie nun enttäuscht? Diese Ausgabe hatten sie wohl nicht erwartet. Doch wie kommt diese zustande? Scheinbar hat der Webbrowser jegliche Formatierung (Zeilenumbrüche) übergangen und hat den Text an einem Stück ausgegeben.
Generell kann man sagen, dass ein Webbrowser alle sogenannten Leerräume oder Whitespaces (http://de.wikipedia.org/wiki/Leerraum) (Tabulatoren, Zeilenumbrüche und mehr als ein Leerzeichen) überliest und deshalb nicht ausgibt.
Anmerkung: Warum er das tut, lernen wir im Unterkapitel über die Formatierung von Quellcode.
Denken sie an den Redakteur und den Setzer. Woher weiß der Setzer, ob ein bestimmter Textabschnitt zusammengehört und nicht auf die nächste Spalte oder Seite umgebrochen werden soll? Er braucht eine logische Formatierung: den Absatz. Dieser ist also ein logisch zusammengehöriger Textabschnitt.
In einer Textverarbeitung erzeugen sie einen Absatz mit Enter. Wenn sie die Steuerzeichen eingeblendet haben, erscheint an dieser Stelle ein Pi-Zeichen (¶). Auf jeden Fall behandelt die Textverarbeitung den Absatz als logische Einheit, auf die Formatierungen angewendet werden können (Absatzformate).
Da ein Texteditor (http://de.wikipedia.org/wiki/Textdatei) eine solche logische Formatierung nicht kennt, simuliert man ihn normalerweise durch zweimaliges Enter drücken. Man erhält so eine Leerzeile zwischen den Absätzen; die logische Formatierung wird durch eine sichtbare ersetzt. Das Drücken der Taste Enter bewirkt das Einfügen eines unsichtbaren Zeichens (ASCII/Unicode: 13) in Mac OS, (ASCII/Unicode: 10) in Unix oder der Zeichenkombination (ASCII/Unicode: 13,10) in DOS/Windows.
Anmerkung: Die Zeichencodes 10 und 13 nennt man auch Linefeed (http://de.wikipedia.org/wiki/Linefeed) (Zeilenvorschub) und Carriage return (http://de.wikipedia.org/wiki/Carriage return) (Wagenrücklauf).
Im folgenden sehen wir die Datei 01_visitenkarte.txt (Windows-codiert) als Speicherauszug (http://de.wikipedia.org/wiki/Speicherauszug) (sogenannter Hex-Dump). Hervorgehoben sind die Speicherzellen 013 010 (CR LF) für einen Zeilenumbruch und 013 010 013 10 (CR LF CR LF) für einen Absatz.
0000: 067 104 114 105 115 116 105 097 Christia
0008: 110 032 072 097 114 116 110 105 n Hartni
0010: 099 107 013 010 068 105 112 108 ck←↓Dipl
0018: 046 045 087 105 114 116 115 099 .-Wirtsc
0020: 104 046 045 073 110 102 046 013 h.-Inf.←
0028: 010 070 114 101 105 101 114 032 ↓Freier
0030: 066 101 114 097 116 101 114 013 Berater←
0038: 010 013 010 083 097 110 100 119 ↓←↓Sandw
0040: 101 103 032 049 048 013 010 049 eg 10←↓1
0048: 054 055 050 055 032 079 098 101 6727 Obe
0050: 114 107 114 195 164 109 101 114 rkrä_mer
0058: 032 079 084 032 066 195 164 114 OT Bä_r
0060: 101 110 107 108 097 117 013 010 enklau←↓
0068: 013 010 084 101 108 046 058 032 ←↓Tel.:
0070: 048 051 051 048 052 032 053 048 03304 50
0078: 056 049 054 050 048 013 010 070 81620←↓F
0080: 097 120 058 032 032 048 051 051 ax: 033
0088: 048 052 032 053 048 056 049 054 04 50816
0090: 050 049 013 010 077 111 098 105 21←↓Mobi
0098: 108 058 032 048 049 055 057 032 l: 0179
00A0: 050 049 048 050 051 053 052 013 2102354←
00A8: 010 013 010 104 105 108 102 101 ↓←↓hilfe
00B0: 064 104 097 114 116 110 105 099 @hartnic
00B8: 107 046 100 101 013 010 104 116 k.de←↓ht
00C0: 116 112 058 047 047 104 105 108 tp://hil
00C8: 102 101 046 104 097 114 116 110 fe.hartn
00D0: 105 099 107 046 100 101 013 010 ick.de←↓
Sie sehen also, dass auch in einer reinen Textdatei Umbrüche und Absätze über spezielle Steuerzeichen erstellt werden.
Denken sie an unser Beispiel mit dem Redakteur und dem Setzer. Damit auch der Webbrowser (Setzer) die logische Formatierung eines Absatzes in eine sichtbare umsetzt, müssen wir diese Formatierung entsprechend mit einem Tag (sprich Tägg) <p> (paragraph - Absatz) kennzeichnen.
Die Kennzeichnung eines Textabschnittes mit einem Tag geschieht immer durch Umschließung. Um einen Absatz zu taggen schreiben wir zunächst den Starttag <p>, dann folgt der Text des Absatzes und zuletzt kommt der Endtag </p>:
<p>Hier steht der Absatz.</p>
oder übersichtlicher:
<p> Hier steht der Absatz. </p>
Da wir uns hier zum ersten mal mit einem Tag beschäftigen, schauen wir kurz auf die Informationen, die uns Selfhtml bietet: <p> (klicken sie dazu auf →w).
Zunächst unterscheidet Selfhtml verschiedene HTML-Versionen. Wie schon gesagt, interessiert uns zunächst nur „XHTML 1 Strict“. Folgen wir diesem Link, bekommen wir Infos zu Bedeutung des Tags, Start-/Endetag, Elternelemente (darf vorkommen in) und Kindelemente (darf beinhalten). Zu den Attributen kommen wir später.
Anmerkung: PCData ist (einfach gesagt) nur Text.
Übung:
Speichern sie ihre Visitenkarte unter neuem Namen. Fügen sie dann die Tags <p> und </p> in ihre Datei so ein, das sie ihre logischen Absätze umschließen.
(Beispiel 03_visitenkarte_p.html (beispiele/03a/03_visitenkarte_p.html))
Anmerkung: Schauen sie in den Tastaturkommandos nach, wie sie sich den Quelltext des Beispiels anzeigen können.
Wenn sie wirklich nur (echte logische) Absätze mit <p> … </p> umschlossen haben, sollte ihre Webseite jetzt wie im Beispiel 3 erscheinen.
Innerhalb eines Absatzes kann es nötig sein, die Zeile umzubrechen und am Anfang fortzusetzen. Das nennt man dann entsprechend Zeilenumbruch. Der augenscheinlichste Unterschied zwischen Absatz und Zeilenumbruch ist, das ein Zeilenumbruch ein leeres Tag ist, also nichts umschließt. Er soll ja nur anzeigen, dass hier (also dort wo er steht) die Zeile umgebrochen wird.
In einer Textverarbeitung erzeugen sie einen Zeilenumbruch mit Umschalt + Enter. Wenn sie die Steuerzeichen eingeblendet haben, erscheint an dieser Stelle meist ein geknickter Pfeil nach links (↵). Da ein Texteditor eine solche Formatierung nicht kennt, simuliert man ihn normalerweise durch einmaliges Enter drücken.
Innerhalb eines Absatzes existiert in HTML für einen solchen Zeilenumbruch das Tag <br> (break - Umbruch). Außerhalb von <p> ist <br /> nicht erlaubt!
<p> Hier steht der Absatz mit Zeilenumbruch.<br /> Hier geht der Absatz weiter. </p>
Achtung: In XHTML (s. Anhang: xhtml) muss jedes Tag ein schließendes haben, also schreibt man <br></br> oder kurz <br />. Das Leerzeichen vor dem "/" erlaubt älteren Webbrowsern den Tag korrekt zu erkennen.
Übung:
Speichern sie ihre Visitenkarte unter neuem Namen. Ergänzen sie die <br /> in der Datei innerhalb von <p> … </p>.
(Beispiel 04_visitenkarte_p_br.html (beispiele/03a/04_visitenkarte_p_br.html))
Der Absatz <p> ist ein typisches Blockelement (http://de.selfhtml.org/html/referenz/elemente.htm#block_elemente) und der Zeilenumbruch <br /> ein nicht ganz so typisches Inlineelement (http://de.selfhtml.org/html/referenz/elemente.htm#inline_elemente).
Blockelemente bilden Absätze (als logische Formatierung). Sie beinhalten im allgemeinen Text und Inlineelemente sowie weitere Blockelemente.
Inlineelemente enthalten im allgemeinen Text und andere Inlineelemente, allerdings niemals Blockelemente. Sowohl Block- als auch Inlineelemente können leer sein.
Später werden wir noch andere Unterschiede zwischen Block und Inline kennenlernen!
Voila. Nun haben sie wirklich die erste HTML-Seite geschrieben, die etwa wie im Beispiel 4 aussehen sollte. Diese Visitenkarte ist zwar noch nicht schön, aber zumindest richtig strukturiert. Wie man eine Webseite formatiert, lernen sie im folgenden Kapitel.
Leider sind die heutigen Webbrowser sehr fehlertolerant. Wenn sie falschen HTML-Code schreiben, heißt das noch lange nicht, das der Browser einen Fehler meldet. Später sollten sie deshalb ihren Code immer mit einen HTML-Validator (http://validator.w3.org) (Gültigkeitsprüfer) prüfen.
Jetzt fehlt eigentlich nur noch der interaktive Teil (Hypertext). So eine Visitenkarte enthält schon einige potenzielle Kandidaten für Links an andere Stellen: Telefon, E-Mail und Webpräsenz (Homepage).
Anmerkung: Tags können mit sogenannten Attributen um weitere Eigenschaften erweitert werden. So existiert der Tag <a>, der ohne Attribute keine Bedeutung hat.
Hypertextlinks (Hyperlinks oder einfach Links) fügen wir mit der Tag/Attribut-Kombination <a href=""> (anchor / href = hypertext reference) in HTML ein. Ein Attribut erweitert ein Tag um bestimmte Eigenschaften.
<a href="http://domain.de">Text</a>
Lassen sie mich das durch ein kleines Beispiel erläutern: Das Tag <a> ist generell für Referenzen zuständig. Mit dem Attribut href="" teilen wir dem Webbrowser mit, das wir irgendwas referenzieren wollen. Das kann eine andere Webseite sein, aber auch ein anderes Programm, das sich dann beispielsweise um das Verschicken einer E-Mail kümmert.
Verweisziele (href="…"):
Anmerkung: Telefonnummern können die Ziffern „0“-„9“, „+“, „*“, „#“ und ein „,“ (Pause) enthalten. Bei SMSs können mehrere Nummern durch Komma getrennt und ein Betreff mit „*?body=“ angegegeben werden.
Sicherlich haben sie das Prinzip durchschaut. Der Wert des Attributs href="" muss ein URI (http://de.wikipedia.org/wiki/Uniform_Resource_Identifier) (siehe Anhang: Fachbegriffe) sein. Anhand des Schemas (http://de.wikipedia.org/wiki/Uniform_Resource_Identifier#Scheme) (http, mailto, callto) der URI stellt der Webbrowser fest, ob er den Verweis selbst (http) behandeln (folgen) kann oder ihn an ein externes Programm (mailto, tel, fax) übergeben muss. Ist kein externes Programm für das Schema definiert, erscheint eine Fehlermeldung.
Anmerkung: Das Tag <a> ist nicht nur für einen Verweissprung, sondern je nach Attribut, auch für andere Aufgaben (s. Selfhtml) zuständig. Dazu aber erst später mehr.
Allerdings existiert noch eine vereinfachte Darstellung von href-Werten. Wie im lokalen Dateisystem, können sie auch einfach ein Unterverzeichnis oder einen sonstigen Pfad (http://de.wikipedia.org/wiki/Pfadname) inklusive Dateinamen angeben. Das ist später bei Webpräsenzen wichtig, wenn sie mehrere Seiten haben, die sie untereinander verlinken wollen.
Beachten sie dabei, das sie nicht wie unter DOS und Windows üblich als Pfadtrenner das \ -Zeichen benutzen, sondern wie in der Unix-Welt üblich das / -Zeichen.
Verzeichnisbaum (Beispiel)
… vom Ordner / aus
… vom Ordner css aus
Anmerkung: Wenn sie nur einen Ordner und keine Datei angeben, wird im lokalen Dateisystem ein Inhaltsverzeichnis, auf einem Webserver meist die Datei index.htm(l) (Apache) oder default.htm (IIS) ausgegeben.
Referenz: Referenzieren in selfhtml (http://wiki.selfhtml.org/wiki/HTML/Referenzieren_in_HTML)
Übung:
Speichern sie ihre Visitenkarte unter neuem Namen. Fügen sie dann die Verweise in die Datei ein. Achten sie dabei auf die korrekte Syntax!
(Beispiel 05_visitenkarte_href.html (beispiele/03a/05_visitenkarte_href.html))
Probieren sie die Verweise ruhig einmal aus, in dem sie daraufklicken. Sollte ihr Browser eine Fehlermeldung ausgeben, ist das URI-Schema wahrscheinlich nicht richtig verknüpft, weil sie beispielsweise kein Programm zur Internettelefonie installiert haben.
Damit ein HTML-Validator unsere Seite als gültig erkennt, müssen wir sie noch mit einem allgemeinen HTML Grundgerüst ausrüsten.
Dieses Grundgerüst sollten sie in eine leere Datei einfügen und diese Datei als Basis für ihre Webseiten verwenden. So sparen sie sich das dauernde Nachschlagen nach der korrekten Syntax des HTML-Grundgerüstes.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> «« <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> <title>Beschreibung der Seite</title> </head> <body> <!-- Hier stehen unsere HTML-Tags --> </body> </html>
In den sogennannten <meta>-Tags geben sie besonderen Information für den Browser oder automatische Suchroboter an.
Referenz: Kopfdaten in Selfhtml (http://wiki.selfhtml.org/wiki/HTML/Kopfdaten)
In alten HTML-Browsern und Versionen waren das "ß" - wie auch die Umlaute - nicht erlaubt. Sie mußten als sogenannte Entities kodiert werden. Mit der Zeichensatzkodierung UTF-8 hat sich das geändert.
Allerdings müssen sie die Sonderzeichen < , > und & nach wie vor als Entität schreiben, da diese ja innerhalb des HTML-Quelltextes eine besondere Bedeutung haben. Eine Liste aller Entities finden sie im Anhang: HTML-Entities.
Zeichen | Entität |
---|---|
< | < |
> | > |
& | & |
Im folgenden finden sie weitere Doctypes, die sie kennen sollten, aber in diesem Buch nicht verwendet werden:
(Übergangsversion zur Kompatibilität)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
Die Transitional-Variante enthält noch ältere Elemente wie <font>, <center> und <u> sowie Attribute wie bgcolor="", align="" und target="". Mit dieser DTD können auch Webautoren, die nicht Layout und Inhalt voneinander trennen, standardkonformes HTML schreiben.
Außerdem soll er sicherstellen, dass bestehende Webseiten weiterhin durch aktuelle Webbrowser angezeigt werden können.
(Übergangsversion zur Kompatibilität)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
DTD für Framesets. Also für in mehrere Bereiche geteilte Webseiten. Diese Buch geht nicht näher auf Framsets ein, da sie einige grundsätzliche Nachteile haben. Siehe dazu: frameset und frames in selfhtml (http://wiki.selfhtml.org/wiki/HTML/Frames)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
Diese DTD umfasst Elemente und Attribute, die zusammen mit Stylesheets Layout und Inhalt trennen. Text und Inline-Elemente müssen sich grundsätzlich innerhalb eines Block-Elements befinden, zum Beispiel in einem <p>-Element.
(Übergangsversion zur Kompatibilität)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
s. HTML Transitional - allerdings in xhtml-Syntax.
(Übergangsversion zur Kompatibilität)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
Frameset DTD für XHTML 1.
<!doctype html>
Erfrischend einfach :-)
Übung:
Speichern sie ihre Visitenkarte unter neuem Namen (Ab sofort solllten sie selbst daran denken). Fügen sie die bisherige Visitenkarte in den HTML-Rahmen ein und speichern sie sie.
Beachten Sie, dass jetzt auch die Sonderzeichen korrekt dargestellt werden!
(Beispiel 06_visitenkarte.html (beispiele/03a/06_visitenkarte.html))
Nach dem Einfügen des Grundgerüstes sieht die Seite wie im Beispiel 6 aus. Bis auf den Seitentitel oben links sollte sich an der Darstellung nichts getan haben. Jetzt können sie aber einen HTML-Validator (http://validator.w3.org/) über die Seite laufen lassen.
(Der allerdings für unser Beispiel noch einen Fehler ausgibt, da die horizontale Linie im Beispiel noch nicht HTML-konform ist.)
Sollten sie Fragen zum Grundgerüst haben, schauen sie sich erst einmal den Quellcode des Beispiels 6 an.
n.v.
Jetzt widmen wir uns dem CSS-Teil einer Webseite - also dem Layout. Wie schon beschrieben, trennen moderne Webpräsenzen in Inhalt (HTML) und Layout (CSS). Ähnlich wie in einer modernen Textverarbeitung können sie mit CSS HTML direkt formatieren. Oder sie schaffen Formatvorlagen, die sie auf mehrere Webseiten anwenden können, um ein einheitliches Layout für die ganze Webpräsenz zu schaffen.
Allerdings ist für uns nicht nur die Formatierung der eigentlichen Seite interessant. Auch der HTML-Text den wir bisher geschrieben haben, sollte eine gewisse Form einhalten.
Ganz am Anfang hatten wir gelernt, dass HTML eine Sprache (L - Language) ist. Wenn man bei Computern von Sprachen „spricht“, meint man damit eine formale Beschreibung, die in sogenannten Quellcode (http://de.wikipedia.org/wiki/Quellcode) geschrieben wird.
Wir haben den Computer (Webbrowser) also eine Reihe von Anweisungen, in einer Datei verpackt, zum Ausführen gegeben. Zwar haben wir kein Programm im ursprünglichen Sinn geschrieben, aber wir sind auf dem besten Weg dorthin. Also sollten wir auch ein paar Regeln befolgen, die unseren Quellcode für Andere besser lesbar macht.
Wahrscheinlich haben sie sich am Anfang unseres Beispiels gefragt warum HTML Whitespaces überliest. Dies ist eine Eigenschaft, die es mit vielen Computersprachen (wie auch CSS und JavaScript) teilt: Der Quellcode kann so formatiert werden.
Es gibt einige einfache Regeln um Quellcode - also unseren HTML-Text - besser lesbar (http://de.wikipedia.org/wiki/Quelltextformatierung) zu machen:
Jedes Anfangstag, das einen logischen Abschnitt (Block) anfängt, kommt in eine neue Zeile.
<p> 1. Absatz </p> <p> 2. Absatz </p> <p> 3. Absatz </p>
Rücken Sie untergeordnete Tags mit Leerzeichen ein:
<body> <div> <p> Absatz 1 </p> <p> Absatz 2 </p> </div> </body>
Trennen Sie große logische Bereiche mit einer oder mehreren Leerzeilen:
<body> <h1>Erste Überschrift</h1> <p> Ein Absatz </p> <h1>Zweite Überschrift</h1> <p> ein gänzlich anderer Absatz </p> </body>
Verwenden Sie Kommentare:
<!-- Das wollte ich noch sagen -->
Übung:
Bereinigen und prüfen sie ihren Code. Fügen sie Kommentare ein.
(Beispiel 07_visitenkarte_quellcode.html (beispiele/03b/07_visitenkarte_quellcode.html))
Sie können auch ein Programm wie HTML Tidy verwenden, um sowohl ihren Code zu prüfen, als auch eine Bereinigung durchzuführen. Für Firefox existiert eine entsprechende Erweiterung mit Namen Total Validator (addon).
Sonst verwenden sie am besten den Web-Service (http://services.w3.org/tidy/tidy).
HTML bietet zwar von Haus aus Formatierungen mit Tags wie <b> (bold – fett), <i> (italics - kursiv) und <u> (underline - unterstrichen).
<p> Dies ist ein <b>fetter</b>, ein <i>kursiver</i> oder ein <u>unterstrichener</u> Text. <(p>
Doch diese sind mit dem Einzug von CSS als „deprecated“ - das heißt veraltet - gekennzeichnet. Und sollen in den nächsten Versionen nicht mehr unterstützt oder zumindest (HTML5) umgedeutet werden. Dementsprechend sind sie auch kein Bestandteil der HTML/XHTML Strict-Varianten (s. DTD).
Übung:
Überlegen Sie welche Formatierungsmöglichkeiten ein Zeitungsverleger, ein Redakteur und ein Setzer hat.
(Beispiel Zeitungsformat (images//beispiel_zeitungformat.txt))
Moderne Webpräsenzen setzen also zu recht auf Cascading Stylesheets (CSS). CSS haben den Vorteil, das Layout (Formatierung) und Inhalte (Texte, Bilder, ...) zu trennen.
Der „Verleger“ einer Webpräsenz bestimmt einmalig das Layout (CSS), der „Redakteur“ einer Webseite schreibt den Inhalt (HTML) und der „Setzer“ also der Webbrowser fügt beides zusammen. Ändert der Verleger das Layout, passen sich alle Inhalte automatisch an. Was also auf den ersten Blick nach mehr Arbeit aussieht, vereinfacht komplexere Webpräsenzen (wie dieses Buch) enorm.
Im Anhang: Formatierende Tags finden Sie die CSS-Eigenschaften, welche die alten HTML-Tags ersetzen. Um sie direkt zu verwenden, müssen sie das <span> Tag verwenden (s. Beispiel).
<p> Dies ist ein <span style="font-weight: bold;">fetter</span>, ein <span style="font-style: italic;">kursiver</span> oder ein <span style="text-decoration: underline;">unterstrichener</span> Text. <(p>
Anmerkung: Schalten sie in Firefox spaßeshalber einmal unter „Ansicht“ den „Webseiten-Stil“ auf „Kein Stil”.
Unter Anhang: Wichtige Tags steht eine Liste der wichtigsten Tags. Wenn sie experimentierfreudig sind, können sie diese nach Lust und Laune in ihre Visitenkarte schon einbauen: Gute Kandidaten sind <address> (Adressblock kennzeichnen), <hr> (horizontale Trennlinie) und <ul>/<li>) (für Telefonlisten). Schlagen sie in der Referenz nach, wie sie diese Tags benutzen.
Übung:
Probieren sie eine Formatierung mit <b> … </b> und die Alternative mit <span style="font-weight:bold;"> … </span>. Experimentierfreudige können jetzt schon weitere Tags (s.o.) einbauen.
(Beispiel 08_visitenkarte_format.html (beispiele/03b/08_visitenkarte_format.html))
Wie sie im Quelltext des Beispiels sehen, können sie (fast) jedem Tag einen Style hinzufügen. Probieren sie das ruhig auch mit <p> (<p style="…">). Die entsprechenden CSS-Eigenschaften finden sie im Anhang: CSS-Eigenschaften.
Beachten sie dabei, das nicht für jedes Tag auch jeder Style Sinn ergibt. So sind viele Styles beispielsweise nur für Inline- oder Block-Tags erlaubt. Später werden wir sogar lernen, wie man aus einem Inline- ein Block-Tag und andersherum macht.
Einem allgemeinen Tag wie <p> einen bestimmten Stil (Style) zuzuordnen, ist „schlechter Stil“. Denn normalerweise wendet man einen Stil immer auf eine bestimmte Kategorien (oder Klassen) an. So könnten alle Überschriften in der Schriftart „Arial“ erscheinen und der Fließtext in „Times New Roman“. Bestimmter Fließtext sollte aber als Anmerkung „kursiv“ sein. Es muss also eine Möglichkeit geben, Tags oder speziell gekennzeichnete Tags für einen Stil zu selektieren.
Um Tags für einen Stil zu selektieren, definieren wir die Stile in einem speziellen Bereich <style> des HTML-Headers (<head>). Dazu benutzen wir eine eigene CSS-Syntax: Selektor: { CSSEigenschaft1: Wert; CSSEigenschaft2: Wert; … }.
Anmerkung: Nicht umsonst wird in diesem Buch verschiedene Farben für die verschiedenen Sprachen HTML, CSS und JavaScript benutzt. Ihre Syntaxen sind grundlegend verschieden und sie sollten sie deshalb nicht durcheinander bringen (s. Anhang: Syntaxübersicht).
… <head> <title>09 Meine Visitenkarte (css inline)</title> <style type="text/css"> /* … Formatdefinitionen … */ #Nachname { font-weight:bold; } </style> </head> …
Erklärungen zur Syntax der Stildefinitionen finden sie im Anhang: CSS-Syntax.
Im Beispiel finden sie die übliche Vorgehensweise einen Stil für das HTML- Universalattribut id="" zu spezifizieren. Das heißt der Selektor #Name selektiert beisielsweise das HTML-Tag <span id="Name">. Der „Name“ muss innerhalb der HTML-Datei eindeutig sein, darf also kein zweites Mal vorkommen. Wollen sie mehreren Tags den gleichen Stil zuweisen, benutzen sie das Attribut <span class="Beruf">, welches sie mit dem Selektor .Beruf selektieren.
HTML Element | CSS Selektor | Beschreibung |
---|---|---|
<span id="ID"> | ID { E: W; } | Stil für „ID“ |
<span class="Klasse"> | .Klasse { E: W; } | Stil für „Klasse“ |
Die HTML-Tags <span> und <div> sind speziell für CSS-Formatierungen geschaffen worden.
Weitere CSS Eigenschaften (Formatierungen) finden sie im Anhang: CSS-Eigenschaften oder im Selfhtml Wiki (http://wiki.selfhtml.org/wiki/Referenz:CSS/Eigenschaften).
Übung:
Schreiben sie den Quellcode mit der Stildefinition im Header um.
(Beispiel 09_visitenkarte_css_inline.html (beispiele/03b/09_visitenkarte_css_inline.html))
Wächst ihre Webpräsenz über diese eine Seite hinaus, ist das Einbetten von Stildefinitionen innerhalb der HTML-Seite von Nachteil – entsprechende Stiländerungen müssten sie in alle Dateien permanent übertragen. Deshalb sollten sie die Stildefinitionen in eine eigene Datei auslagern:
/* Definitionen */ #Name { font-weight:bold; } #Grad { font-size: small; } .Beruf { font-style: italic; } a { text-decoration:none; color:WindowText;} a:before { content:"→"; color: blue; } a:hover { color: blue; } hr { width: 300px; margin-left: 0; } .label { display: inline-block; width: 3em; }
Für dieses Beispiel müssen wir unsere Tabelle erweitern:
HTML Element | CSS Selektor | Beschreibung |
---|---|---|
<span id="ID"> | #ID { E: W; } | Stilzuweisung an ID |
<div class="Kl"> | .Kl { E: W; } | Stilzuweisung an Klasse |
<hr> | hr { E: W; } | Stilzuweisung an alle <hr> |
_<a> | a:before { E: W; } | Stilzuweisung für den Bereich vor <a> |
<a> | a:hover { E: W; } | Stilzueisung für <a>, wenn es mit der Maus überfahren wird. |
Hinweis: Der Internet Explorer kennt die Pseudo-Eigenschaften :before und :after erst ab Version 8.
Anmerkung: An dieser Stelle kommt das erste Mal eine zweite Datei ins Spiel. Für diese CSS-Datei erstellen sie eine neue leere Datei im Texteditor und kopieren dort alles hinein was zwischen <style type="text/css"> und </style> steht. (Und ergänzen beispielsweise mit dem obigen Beispiel.) Diese Datei speichern sie dann unter einen Namen wie visitenkarte.css oder stylesheet.css.
In der HTML-Datei steht dann nur noch ein Verweis (<link>) auf diese externe Datei. Also müssen sie den ganzen Text innerhalb von <style type="text/css"> … </style> inklusive dieser Tags wie folgt löschen:
… <head> <title>10 Meine Visitenkarte (css datei)</title> <link rel="stylesheet" type="text/css" href="10_visitenkarte.css" /> </head> …
Übung:
Schreiben sie den Quellcode entsprechend um und probieren sie andere Formatierungen aus der Referenz.
(Beispiel 10_visitenkarte_css.html (beispiele/03b/10_visitenkarte_css.html)
/ Beispiel 10_visitenkarte.css (beispiele/03b/10_visitenkarte.css))
Hinweis: Sie können natürlich auch interne und externe Stylesheets mischen (wie im Beispiel 10 geschehen). Allerdings sollten sie dann darauf achten, dass auch nur seitenspezifische Formatierungen im (seiten-)internen Stylesheet stehen.
Wie versprochen kommen wir noch einmal auf Block- und Inline-Elemente zurück. Wenn sie sich das Styleesheet aus dem Beispiel genau anschauen, finden sie die CSS-Eigenschaften display: inline-block; und width: 3em;.
Wie schon geschrieben, bilden Blockelemente eine logischen „Block“, dem man entsprechend auch unter anderem eine Höhe (height) und Breite (width) zuweisen kann. Inline-Elemente stehen mitten im fließenden Text. Es macht also normalerweise keinen Sinn ihnen Höhe und Breite zu geben.
Um möglichst flexibel zu bleiben, kann CSS aber HTML-Tags umetiquettieren. CSS kann also Blockelement in Inline-Elemente und umgekehrt verwandeln. Dazu existiert die Eigenschaft display. Allerdings kennt diese Eigenschaft auch den Wert „inline-block“, der das Tag als Inline-Element belässt, aber trotzdem eine Zuweisung einer Breite erlaubt. Damit ist es einfach Texte untereinander zu positionieren.
Im Anhang: CSS-Eigenschaften finden sie weitere Hinweise auf Block- oder Inline-Eigenschaften. Allerdings können sie fast alle Inline-Eigenschaften auch Blöcken zuweisen. Zu den Einheiten (hier em) lesen sie am besten Anhang: CSS-Einheiten und Farben.
n.v.
Bevor wir zu JavaScript an sich kommen, machen wir einen kleinen Ausflug in die Theorie des Programmierens. Sinn dieses Kapitels ist es nicht programmieren zu lernen, sondern die Konzepte dahinter zu verstehen, damit sie fremden Code in ihre Webseiten einbinden können.
Danach lernen wir das einbinden von JavaScript in die Webseite direkt oder als Funktion. Zuletzt manipulieren wir die Seite über das DOM, was gerade mit Fremdfunktionen viele Vorteile bringt.
Programme sind eine Ansammlung von Anweisungen, die ein Computer oder anderes Programm ausführt. So etwa wie eine Bauanleitung, die Anweisungen für einen Menschen enthält, etwas bestimmtes zusammenzubauen. Bewegen wir uns also in dieser Analogie.
Brainstorming:
Was steht in einer Bauanleitung? Schreiben sie kurz (ohne nachzudenken) ihre Gedanken auf einen Zettel.
(Brainstorming Bauanleitung (images//brainstorming_bauanleitung.txt))
Ein Bauanleitung (hier das Beispiel Tisch) ist wie folgt strukturiert:
Übung:
Schreiben sie einen Bauanleitung für einen Tisch, nach dem obigen Vorbild.
(Beispiel Tisch (images//beispiel_tisch.txt))
Ein Programm ist ähnlich strukturiert:
Man erkennt sofort die Ähnlichkeit mit einem Bauanleitung.
Hier haben wir einige Konzepte, die sich nicht so einfach erschließen. Genaueres lesen sie im Kapitel über JavaScript.
In der Informatik versteht man unter Pseudocode (http://de.wikipedia.org/wiki/Pseudocode) eine formalisierte Schreibweise von Anweisungen, die theoretisch ein Computer ausführen könnte. D.h. Pseudocode verzichtet auf alles sprachliche Beiwerk und konzentriert sich auf das wesentliche.
Übung:
Schreiben sie ein Pseudoprogramm (und/oder Anweisungen für einen Menschen), welches wiederholt (10x) die Uhrzeit ausgibt.
(Pseudocode Mensch (images//pseudocode_mensch.txt)
, Pseudocode Computer (images//pseudocode_computer.txt))
In dem Beispiel für ein Pseudo-Programm sind alle wesentlichen Konzepte der Programmierung enthalten:
Das Programm als JavaScript (Beispiel Zähler):
<!DOCTYPE html> <html> <head> <title>Zaehler</title> </head> <body> <script type="text/javascript"> // Datumsbibliothek ist implizit enthalten var Datum = new Date(); // Sonderfall Objekt var jetzt; var i = 10; do { jetzt = Datum.toLocaleString(Datum.getTime()); document.write('\n<p>' + jetzt + '<\/p>'); i--; // enspricht i = i - 1 } while (i>0); </script> </body> </html>
Dies ist natürlich ein sehr einfaches Programm, das uns nur die grundsätzliche Funktionsweise näher bringen soll. Denken sie daran, dass sie an dieser Stelle nicht Programmieren lernen sollen, sondern nur die Konzepte verstehen, um JavaScript-Funktionen verwenden zu können!
Wie schon erwähnt bringt erst der Einsatz von JavaScript Interaktivität auf eine Webseite. Man spricht dann auch von dynamischen HTML, da JavaScript HTML zur Laufzeit (also nach dem Laden der Seite) ändern kann.
Anmerkung: Das unterscheidet JavaScript von einer Sprache wie PHP (http://de.wikipedia.org/wiki/PHP), Perl (http://de.wikipedia.org/wiki/Perl_(Programmiersprache)) oder ASP (http://de.wikipedia.org/wiki/Active_Server_Pages) die schon vor dem Ausliefern einer Seite auf dem Server ausgeführt werden.
Da moderne Webseiten aber nicht ohne Interaktivität auskommen, biete ich Ihnen in diesem Kapitel einen Einstieg in JavaScript. Sie können so zumindest bestehenden Code aus dem Web in ihre Projekte einfügen.
Eine Einführung in JavaScript bietet der fünfte Teil.
Als sinnvolle Anwendung für eine Visitenkarte bietet sich JavaScript beispielsweise an, wenn man aus Spamschutzgründen die E-Mail-Adresse nicht direkt in den HTML-Code schreiben will. Dort kann sie nämlich von sogenannten Spidern (spezialisierte Suchmaschinen) gefunden und in Spam-Verteiler eingetragen werden.
Damit der Browser erkennt, dass an dieser Stelle Javascript steht, wird das Skript innerhalb des Tags <script> geschrieben. In JavaScript kodiert, kann das dann folgendermaßen aussehen:
<p> <!-- Script an Stelle des direkten Links --> <script type="text/javascript"> var name = "hilfe"; var domain = "hartnick"; var tld = "de"; document.write('\n<a href=\"mailto:' + name + '@' + domain + '.' + tld + '\">' + name + '@' + domain + '.' + tld + '</a>'); </script> <noscript>_nick_at_domain_._de_</noscript> <br /> </p>
Sollte der Browser kein JavaScript darstellen, bestimmen sie im <noscript> Bereich einen alternativen Text.
Noch einmal der Hinweis: Nicht umsonst wird in diesem Buch verschiedene Farben für die verschiedenen Sprachen HTML, CSS und JavaScript benutzt. Ihre Syntaxen sind grundlegend verschieden und sie sollten sie deshalb nicht durcheinander bringen.
Übung:
Bauen sie das Skript an der entsprechenden Stelle in ihre Visitenkarte ein.
(Beispiel 11_visitenkarte_js_inline.html (beispiele/03c/11_visitenkarte_js_inline.html))
Anmerkung: Bedenken sie, dass das Beispiel nur der Weg zum Verständnis von JavaScript dient. Normalerweise binden sie bei ihrem Wissensstand, keinen JavaScript-Code sondern höchstens JavaScript-Funktionen ein.
Etwas komfortabler und noch sicherer ist die Auslagerung der Funktionalität in eine externe Datei. So können sie den JavaScript-Code dann auch auf anderen Webseiten nutzen. Dazu verfrachten sie den Code in eine eigene Datei mit der Endung .js und wandeln ihn in eine Funktion ohne Rückgabewert (Funktion enthält kein "return") um: (Beispiel 12 (beispiele/03c/12_visitenkarte.js))
Anmerkung: In JavaScript umschließen Hochkommas '' oder Hochkommatas "" eine Zeichenkette (String). Soll jetzt in der Zeichenkette ein ' oder ein " Zeichen erscheinen, muss dieses besonders gekennzeichnet werden. Dazu schreibt man das Escape-Zeichen \ davor. Weitere Zeichen finden sie im Anhang: JS Escape-Sequenzen
Die externe JS-Datei ist im Header ihrer HMTL-Datei anzugeben. Der Funktionaufruf erfolgt an gewohnter Stelle im HTML-Code:
<html> <head> … <script src="12_visitenkarte.js" type="text/javascript"></script> </head> <body> … <p> <!-- Script an Stelle des direkten Links --> <script language="JavaScript" type="text/javascript"> insertEmail("nick","domain","de") </script> <noscript>_nick_at_domain_._de_</noscript> <br /> … </p> </body> </html>
Auf diese Weise binden sie jegliche externe JavaScript-Funktion ein. Normalerweise finden sie im Netz eine entsprechende Funktion mit einer Anleitung, wie diese einzubinden ist. Meist ist dann auch eine externe CSS-Datei dabei:
<head> … <script type="text/javascript" src="externe_funktion.js"></script> <link rel="stylesheet" type="text/css" href="externe_funktion.css" /> </head>
Übung:
Bauen sie das Skript ihrer Visitenkarte im Header und Body entsprechend um und legen sie die externe Funktion an:
(Beispiel 12_visitenkarte_js.html (beispiele/03c/12_visitenkarte_js.html)
, Beispiel 12_visitenkarte.js (beispiele/03c/12_visitenkarte.js))
Zuletzt möchte ich noch eine Variante vorstellen, die mehrere Vorteile hat: Sie verwendet normale Links in einer Standardsyntax, welche nur durch einen Namen gekennzeichnet sind. Außerdem benötigt sie keinen <noscript> Teil und ist damit weniger anfällig für Fehler.
Weiterhin lernen sie gleich das wichtige DOM (http://de.wikipedia.org/wiki/Document_Object_Model) (document object modell) kennen. Mit dem DOM greifen sie über JavaScript auf HTML-Dokumente zu. Im modernen Webdesign spielt es eine gewichtige Rolle.
Das DOM stellt eine Webseite als Baumstruktur dar. Für den Zugriff auf diese Hierarchie stellt JavaScript verschiedene Funktionen bereit. Außerdem präsentiert jeder Knoten im Dokumentenbaum auch ein Objekt in JavaScript (deshalb „DOM“).
Anmerkung: Viele in JavaScript geschriebene Erweiterung verwenden das DOM. Zu bearbeitende Elemente werden einfach mit einem bestimmten Attribut gekennzeichnet. Ein weiteres Beispiel dazu finden sie im Kapitel Bildergallerie.
Im Firefox können sie den DOM-Baum auch mit dem DOM-Inspektor (Extras / Webentwickler / DOM-Inspector) erforschen.
Hervorgehoben sind hier die mitttels der Klasse „Email“ gekennzeichneten Adressen. Diese werden von der JavaScript-Funktion gefunden und umgewandelt!
Übung:
Schauen sie sich die JavaScript- und die HTML-Datei an. Es ist nicht wichtig, den Quellcode zu verstehen. Sie sollten das Script aber als Funktion in die eigene Webseite einbauen können.
(Beispiel 13_visitenkarte_js_dom.html (beispiele/03c/13_visitenkarte_js_dom.html)
, Beispiel 13_visitenkarte.js (beispiele/03c/13_visitenkarte.js))
Wie sie sehen, rufen sie die JavaScript-Funktion nicht mehr an einer bestimmten Stelle im Code auf, sondern mit einem Attribut im Tag <body onload="convertEmail('Email')">. Da die Funktion auf das DOM zugreift, fügt sie nicht Text in den HTML-Quelltext ein, sondern verändert seine Struktur direkt.
Anmerkung: Eine der beiden Methoden (Aufruf der Funktion direkt im Quelltext oder mit dem Attribut „onload“ im Body) kommt praktisch immer bei externen JavaScript zum Einsatz.
Erläuterungen zum Progamm (für alle die es hier schon interessiert):
Übung:
Zum Abschluss dieser Lektion sollten sie mit dem bisher Gelernten etwas herumspielen, die benutzten Elemente und Funktionen im Referenzbuch oder Web nachschlagen sowie eigene Ideen ausprobieren.
n.v.
Nachdem wir nun alle grundlegenden Techniken einer Webseite kennengelernt haben, folgt nun ein vertiefendes Beispiel. In diesem werden wir auch weitere Funktionalitäten lernen.
Wir bauen diesmal eine gesamte Webpräsenz (mehrere Seiten) auf. Dazu müssen wir uns erst einmal einige Vorkenntnisse erarbeiten. Zuletzt habe sie damit eine Grundlage für eine eigene Webpräsenz.
Eine Webseite besteht aus mehr als nur Text. HTML kann externe Objekte (Bilder, Töne, Videos usw.) einbinden sowie Tabellen und Listen erstellen.
In der folgenden Definitionen sind nur die wichtigsten Attribute und Tags angegeben. Weitere finden sie in ihrer HTML-Referenz. Beachten sie, dass auch für die folgenden Tags CSS zur Formatierung genutzt werden sollte.
Weitere Tags finden sie im Anhang: Wichtige Tags und im Anhang: Semantische Tags. Nur zur Vollständigkeit hier der Verweis zum Anhang: Formatierende Tags.
<a>
<h1_h6>
<ul>, <ol>,
<table>
<img>
<iframe>
<object>
Bilder können sie als <img> oder <object> mit dem entsprechenden Typ einbinden. Auch externe Webseiten können sie als <iframe> oder <object> mit dem Typ "text/html" einbinden. <object> soll in Zukunft alle anderen Tags dieser Art ersetzen. Zumindest zur Zeit funktioniert das noch nicht in jedem Browser.
Beispiele zu den Tags finden sie im weiteren Verlauf dieser Lektion.
Format | Vor-/Nachteile |
---|---|
jpg | Bilder mit variabler Komprimierung und vollem Farbspektrum. |
gif | Bilder mit fester Komprimierung und geringen Farbspektrum. Kann durchsichtig und bewegt sein. |
png | Mischung aus jpg und gif (volles Farbspektrum und durchsichtig). |
svg | Grafiken im Vektorformat (d.h. aus Punkten, Linien und Flächen zusammengesetzt) |
Grafikformate (http://de.wikipedia.org/wiki/Grafikformat) in der Wikipedia.
Wir haben schon bei einigen HTML-Tags das type-Attribut kennengelernt. Dieses gibt den sogenannten MIME-Type (http://de.wikipedia.org/wiki/MIME-Type) (Multipurpose Internet Mail Extensions) einer Datei an. Windows erkennt den Typ einer Datei über die Endung. Im Web regelt das der MIME-Type, welcher ursprünglich aus dem E-Mail Bereich kommt.
Mime-Typ | Beschreibung |
---|---|
text/text | Reiner Text (.txt) |
text/html | Reiner Text im HTML-Format (.html) |
text/css | Reiner Text im CSS-Format (.css) |
text/javascript | Reiner Text mit JavaScript-Code (.js) |
image/gif | Bild im GIF-Format (.gif) |
audio/mpeg | Musik im MP3-Format (.mp3) |
video/mpeg | Video im MPEG-Format (.mpg) |
Referenz: MIME-Typen (http://wiki.selfhtml.org/wiki/Referenz:MIME-Typen) im selfHTML Wiki.
Liste und Tabellen lassen sich auch ineinander schachteln.
<ul> <li>Morgens <ol> <li>geh ich nach Haus</li> <li>schlaf ich aus</li> </ol> </li> <li>Abends <ol> <li>geh ich in die Bar</li> <li>mach ich mich zuhause rar</li> </ol> </li> </ul>
Das sieht dann im Browser folgendermaßen aus:
<table border="1"> <tr> <td>1a</td><td>1b</td><td>1c</td> </tr> <tr> <td>2a</td><td>2b</td><td>2c</td> </tr> <tr> <td>3a</td><td>3b</td><td>3c</td> </tr> <tr> <td colspan="3"> <table> <tr> <td>4 1a</td><td>4 1b</td> </tr> <tr> <td>4 2a</td><td>4 2b</td> </tr> </table> </td></tr> </table>
Das sieht dann im Browser folgendermaßen aus:
1a | 1b | 1c | ||||
2a | 2b | 2c | ||||
3a | 3b | 3c | ||||
|
<table border="1"> <tr> <td>1a</td><td>1b</td><td>1c</td> </tr> <tr><td colspan="3"> <ol> <li>Punkt 1</li> <li>Punkt 2</li> </ol> </td></tr> </table>
Das sieht dann im Browser folgendermaßen aus:
1a | 1b | 1c |
|
Übung:
Schlagen sie die Tags in der Referenz nach und prüfen sie was sie noch für Möglichkeiten mit diesen haben. Bauen sie diese Tags in ihre Visitenkarte ein.
Erschrecken sie nicht – jetzt kommt alles auf einmal. Gehen wir also Schrittweise vor:
Eine Webpräsenz besteht normalerweise aus mehr als einer Webseite (HTML-Datei). Oder anders gesagt, mehrere HTML-Dateien, eine oder mehrere CSS-Dateien und eine oder mehrere JS-Dateien zusammen, bilden einen Auftritt im Internet (Webpräsenz).
Unsere Visitenkarte wäre beispielsweise eine gute Kontaktseite - wir bräuchten allerdings auch noch weitere Seiten wie Willkommens- oder Startseite, Impressum usw. Diese Seiten sind dann normalerweise über ein Menü verlinkt, das heißt auf jeder Seite stehen Links (<a href="index.html">Startseite</a>) zu den anderen Seiten.
Da alle unsere Seiten allerdings einem Grundaufbau folgen sollen, erstellen wir zunächst eine Seitenvorlage, von der wir die anderen Seiten dann ableiten. Gleichzeitig bringen wir ein wenig Struktur (Unterverzeichnisse) in unser Webprojekt.
Um unsere Webpräsenz etwas einfacher anpassen zu können, überlegen wir uns noch, wie wir den Kopf und das Menü auch nachträglich noch einfach ändern können, ohne jede Seite dann händisch zu ändern.
Übung:
Überlegen sie wie sie Code (CSS und JavaScript) für viele Seiten verfügbar gemacht haben. Wie ist das dann mit HTML-Code?
Die Lösung wird im folgenden vorgestellt!
Zunächst wählen wir ein Projektverzeichnis und/oder legen dieses an. Dann erstellen wir dort eine Textdatei mit dem Namen Seitenvorlage_zum_Kopieren.html. In diese schreiben wir dann folgendes Grundgerüst:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="de-de"> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> <meta content="author" name="Fügen sie hier ihren Namen ein" /> <title>Fügen sie ihren Seitentitel hier ein</title> <link rel="stylesheet" type="text/css" href="css/layout.css" /> <style type="text/css"> /* Interne CSS-Formatvorlagen */ </style> <script type="text/javascript" src="js/funktionen.js"></script> </head> <body> <div id="KopfDiv"> <iframe src="iframes/kopf.html" frameborder="0" scrolling="no" width="100%" height="100%"> <h1 class="Kopf">Fügen sie ihren Seitentitel hier ein</h1> </iframe> </div> <div id="MenuDiv"> <iframe src="iframes/menu.html" frameborder="0" scrolling="no" width="100%" height="100%"> <a class="Menue" href="iframes/menu.html">Sitemap</a> </iframe> </div> <div id="InhaltDiv"> <!-- Hier fügen sie das ein, was sie bisher innerhalb des <body>-Tags stehen hatten --> </div> </body> </html>
Klären wir zunächst die neuen Tags:
Übung:
Schlagen sie alle Tags und Attribute, die sie nicht kennen oder verstehen, in ihrer Referenz nach. Speziell sollten sie das Tag <iframe> untersuchen und prüfen, ob es mit der XHTML-Strict-Variante verträgt.
Anmerkung: Prüfen sie im Beispiel (beispiele/03d/index.html) welche HTML-Version gewählt ist.
Jetzt legen wir die Unterverzeichnisse bilder/ , css/ , iframes/ und js/ an. Die Namen der Verzeichnisse sind soweit selbsterklärend:
Wenn wir zukünftig eine neue Seite in unserer Webpräsenz anlegen wollen, kopieren wir die Seitenvorlage und benennen sie entsprechend um. Sobald die Datei im Explorer markiert ist, geht das am einfachsten mit der Tastenfolge Strg + C (kopieren), Strg + V (einfügen) und dann F2 (umbenennen). Das Umbenennen können sie übrigens mit Esc abbrechen.
Noch einmal der Hinweis: Das Web ist Unix-basiert und deshalb werden Groß- und Kleinschreibung bei Dateien und Verzeichnissen unterschieden. Außerdem ist der Pfadtrenner / .
Wir haben innerhalb unseres Gerüstes mehrere Verweise auf Dateien. Diese Dateien müssen wir nun noch anlegen. Folgen sie dazu dem jeweiligen Link und kopieren sie den Quelltext aus der Datei. Bei den HTML-Dateien müssen sie zuvor noch den Seitenquelltext öffnen (Strg + U).
Wichtige Formatierungen:
Bitte beachten sie den Anhang: CSS-Einheiten und Farben, den Anhang: CSS-Eigenschaften und den Anhang: CSS-Boxmodell an dieser Stelle.
Übung:
Es bleibt noch die Vorlage und die Grafik für den Kopf (Name und Grafik selbst) anzupassen. Öffnen sie die Datei Seitenvorlage_zum_Kopieren.html mit dem Webbrowser, um sie zu überprüfen.
(Beispiel Webpräsenz (beispiele/03d/index.html))
Die Hauptseite einer Webpräsenz heißt so gut wie immer index.html. Dies ist eine Vorgabe des Webservers, der eine Seite an den Browser ausliefert. Das heißt, wenn keine Webseite im Browser angegeben wird, liefert der Webserver die Seite index.html (beim IIS früher auch default.htm) zurück.
Das war jetzt eine ganze Menge Holz auf einmal. Aber jetzt können wir weitere Seiten für unser Projekt erstellen.
Zunächst zur Übersicht noch einmal die Verzeichnisstruktur (Verzeichnisse enden mit „/“):
Übung:
Wenn sie eine weitere Seite erstellen wollen, kopieren sie die Seitenvorlage und benennen sie entsprechend um. Vergessen sie nicht, diese Seite im Menü zugänglich zu machen. Als Kontaktseite können sie beispielsweise ihre Visitenkarte benutzen. Für das Impressum benutzen sie eine Impressumsgenerator (googlen (http://www.google.de/search?q=impressumsgenerator)). Auf der Hauptseite (index.html) stellen sie sich beispielsweise selbst kurz vor.
Zu guter letzt können sie die Seite auf einen Webserver kopieren. (Anhang: Benutzung von FTP)
n.v.
Im zweiten Kursteil verfeinern wir unsere Kenntnisse und lernen neue Tipps und Tricks. Nicht zu letzt beschäftigen wir uns auch mit Formularen.
Außerdem kümmern wir uns um die Rahmenbedingungen (Barrierefreiheit, Rechte, Werbung, Datenschutz und Suchoptimierung) einer Webpräsenz. Wir kümmern uns um die neue Heimat unser Webpräsenz (Webserver) und beschäftigen uns kurz mit Projektmanagement im Webumfeld.
n.v.
Hier im Kursteil II erweitern wir unsere Webpräsenz aus Kursteil I um einige fortgeschrittene Methoden. Eine moderne Webpräsenz benötigt nicht nur eine Startseite, eine Kontaktseite und ein Impressum, sondern auch Bildergalerien, Anfahrtskarten und ähnliches.
Außerdem sollten wir die Dateien unserer Webpräsenz auch mal auf einen FTP-Server hochladen: Anhang: Benutzung von FTP
Diesmal gehen wir etwas professioneller an die Analyse des Beispiels heran. Schauen wir uns aber zunächst erst einmal das erweiterte Beispiel der Webpräsenz (beispiele/04_erweiterte_Webpraesenz/index.html) an. Dazu klicken sie den vorstehenden Link mit der Kombination Strg + ' an, um ihn in einem neuen Tab zu öffnen.
Download: 04_erweiterte_Webpraesenz.zip (beispiele/04_erweiterte_Webpraesenz/04_erweiterte_Webpraesenz.zip)
Wie sie bereits wissen, können sie in Firefox (aber beispielsweise auch Chrome) mit der Strg + U den Quelltext der Seite öffnen. Wenn sie die Web Developer Erweiterung installiert und dort in den Optionen das Anzeigen von Quellcode in einem Tab aktiviert haben, können sie den Quelltext mit Shift + Alt + U in einem Tab anzeigen. Der Übersicht wegen, sollte das unser Standard werden.
Wenn sie jetzt den Quelltext geöffnet haben, können sie mit Strg + ' im Quelltext die weiteren Dateien (layout.css, funktionen.css) in neuen Tabs öffnen. Um auch die Dateien standard.css und erweitert.css zu sehen, benutzen sie die Webdeveloper Funktion "CSS / View CSS" (Shift + Alt + C) jeweils mit umgeschalteten Stylesheet. (s. Anhang: Tastaturkommandos)
Mit dieser Methode können sie den Quellcode einer interessanten Website schnell und einfach analysieren. Das Verwenden von Tabs erleichtert dabei die Übersicht ganz erheblich, da sich die Dateien nicht auf mehrere Fenster verteilen.
Übung:
Vollziehen sie dieses Vorgehen zur Analyse einer Webseite nach (beispielsweise diese).
Anmerkung: Ab sofort werde ich dieses Vorgehen als bekannt voraussetzen und nur noch anmerken, dass wir beispielsweise den Quellcode oder eine bestimmte Datei anschauen wollen.
Widmen wir uns jetzt Schritt für Schritt den Neuerungen in unserem Beispiel. Öffnen sie sich dazu zunächst die Dateien des Beispiels, wie oben beschrieben. Alle relevanten Neuerungen sind mit doppelt unterstrichenen Kommentaren versehen, die mit den Überschriften hier im Buch korrellieren.
(Siehe dazu die folgenden Seiten).
Dateien: layout.css (beispiele/04_erweiterte_Webpraesenz/vorlagen/layout.css)
Mit dem CSS-Befehl @media können sie Stylesheet auf bestimmt Ausgabemedien optimieren. Entsprechend finden sie die Beispiele auch in der Datei vorlagen/layout.css. Wichtig ist das für die Ausgabe der Seite auf dem Drucker und besonders großen oder kleinen Displays.
Für das Drucklayout wird das Menu versteckt und der Inhalt ganz nach links verschoben, um den ganzen Druckbereich ausnutzen zu können.
/* Drucklayout */ @media print { #MenueDiv { display: none; } #InhaltDiv { left: 0px; } }
Mit der Druckvorschau von Firefox, können sie sich dieses Varhalten anschauen.
Das dynamische Layout verändert Poition und Aussehen des Menüs auf Geräten die weniger als 480 Pixel in der Breite haben. Neu sind hier die Umdefinition der <ul> als display: inline;, das heißt aus dem Block-Element wird ein Inline-Element und damit stehen alle Menüpunkt hintereinander.
Außerdem werden die Positionen der <div> nicht mehr position: absolute; oder position: fixed; sondern position: static; definiert. Das bewirkt, dass Kopf, Menü und Inhalte wie normale HTML-Elemente direkt untereinander gestellt werden (wie in unserem Visitenkartenbeispiel die <p>). So wird das kleine Display optimal ausgenutzt.
/* Dynamisches Layout */ @media only screen and (min-width: 481px) { ul.Menue { width: 10em; margin: 0; padding: 2pt; } li.Menue { list-style: none; margin: 2pt; padding: 2pt; border: 1px solid gray; background-color: silver; } } /* Spezielle Defintionen für Mobilgeräte */ @media only screen and (max-width: 480px) { ul.Menue { display: inline; } li.Menue { list-style: none; border: 1px solid gray; background-color: silver; display: inline; } } @media only screen and (max-width: 480px) { #KopfDiv { position: static; height: auto; width: 100%; } #MenueDiv { position: static; padding: 0; width: 100%; height: 50px; } #InhaltDiv { position: static; min-width: 50%; min-height: 50%; } }
Dateien: index.html (beispiele/04_erweiterte_Webpraesenz/index.html), schmetterling.js (beispiele/04_erweiterte_Webpraesenz/vorlagen/schmetterling.js)
Mit doppelt animierter Grafik ist hier gemeint, dass die Grafik selbst ein animiertes GIF (mit transparenten Hintergrund) ist und dieses GIF zusätzlich noch die Position auf der Seite wechselt. Die entsprechenden Stellen sind im Quelltext mit „Animation Schmetterling“ gekennzeichnet.
Durchsuchen wir zunächst wieder den Quelltext der Index-Seite des Beispiels: Als erstes finden wir dort mehrere Positionen (.pos0 - .pos9), welche im JavaScript-Teil zur Animation benutzt werden. Hier können sie ihrem Schmetterling also die Flugroute vorgeben.
/* Animation Schmetterling (für function animateButterfly()) */ .pos0 { position:absolute; Left:230px; Top:60px; } .pos1 { position:absolute; Left:215px; Top:70px; } .pos2 { position:absolute; Left:225px; Top:60px; } .pos3 { position:absolute; Left:240px; Top:65px; } .pos4 { position:absolute; Left:255px; Top:75px; } .pos5 { position:absolute; Left:285px; Top:90px; } .pos6 { position:absolute; Left:275px; Top:110px; } .pos7 { position:absolute; Left:255px; Top:135px; } .pos8 { position:absolute; Left:270px; Top:170px; } .pos9 { position:absolute; Left:295px; Top:195px; }
Dann finden wir das <img>-Tag des Schmetterlings innerhalb eines <div> (mit der Vorgabepoition .pos1). Interessant ist das neue Attribut onmouseover="", welches die JS-Funktion animateButterfly() startet, wenn die Maus über das Element (hier das Bild) fährt.
<div class="pos1" id="butterflyDiv"> <!-- Animation Schmetterling per mouseover starten --> <img id="butterflyImg" src="bilder/schmetterling.gif" height="80" alt="animierter Schmetterling" onmouseover="javascript:animateButterfly())"/> </div>
Ein Stückchen weiter unten wird diese Funktion noch einmal innerhalb eines Links aufgerufen. Der Link bekommt dazu als Schema „javascript:“ angewiesen, damit er weiss, dass er Javascript aufrufen soll.
<p> <!-- Animation Schmetterling per Link starten --> <a href="javascript:animateButterfly()"> Flieg, Schmetterling, flieg! </a> </p>
Den eigentlichen JavaScript-Code in schmetterling.js werden wir nicht genauer analysieren, da er an dieser Stelle viel zu komplex ist.
Animationen auf Webseiten erreichen sie mittels
Dateien: index.html (beispiele/04_erweiterte_Webpraesenz/index.html), standard.css (beispiele/04_erweiterte_Webpraesenz/vorlagen/standard.css), erweitert.css (beispiele/04_erweiterte_Webpraesenz/vorlagen/erweitert.css), switchStyle.js (beispiele/04_erweiterte_Webpraesenz/vorlagen/switchStyle.js)
Ein immer wieder interessanter Effekt, ist das Umschalten des Stylesheets im laufenden Betrieb.
Auch hier starten wir wieder im Quelltext der Hauptseite. Zunächst stossen wir da innerhalb der Definition der internen Stylesheets auf die Zeile <link rel="stylesheet" type="text/css" href="vorlagen/standard.css" />. Hier verlinken wir zusätlich zum normalen Stylesheet layout.css ein leeres standard.css.
<!-- Stylesheet umschalten - Einbinden des Stylesheets ================================================= --> <link rel="stylesheet" type="text/css" href="vorlagen/standard.css" />
Weiter unten findet sich dann nur noch der Aufruf der JS-Funktion changeCSSFile() aus einem Link heraus, wie schon oben beim Schmetterling beschrieben.
<!-- Stylesheet umschalten ===================== --> <a href="javascript:changeCSSFile('vorlagen/standard.css', 0);">Style „Standard“</a> / <a href="javascript:changeCSSFile('vorlagen/erweitert.css', 0);">Style „Erweitert“</a>
Diese Funktion findet sich in der Datei vorlagen/switchStyle.js. Sie ersetzt die Zeile <link rel="stylesheet" type="text/css" href="vorlagen/standard.css" /> durch <link rel="stylesheet" type="text/css" href="vorlagen/erweitert.css" />.
Dateien: index.html (beispiele/04_erweiterte_Webpraesenz/index.html), toggleDiv.js (beispiele/04_erweiterte_Webpraesenz/vorlagen/toggleDiv.js)
Das Ein- und Ausblenden von Elementen auf Webseiten ist zwar ein interessanter Effekt. Stellt aber für manche Nutzer durchaus eine Barriere dar und sollte deshalb nur sparsam eingesetzt werden.
Im Quelltext der Hauptseite findet sich dazu zunächst innerhalb der internen Stylesheets zwei Definitionen #Absatz1 {display:none;} und #Absatz2 {display:none;}. Die Eigenschaft display:none; verhindert das Anzeigen des so formatierten Tags. Die Defintion auf der Seite ist durchaus gewollt, da das Verstecken der Absätze ja auch nur für diese Seite gilt!
/* Absätze einblenden (function toggleDiv(myDiv)) */ #Absatz1 { display:none; } #Absatz2 { display:none; }
Um sie wieder einzublenden, findet sich der Aufruf der JS-Funktion toggleDiv() mit dem Parameter „Absatz1“ oder „Absatz2“ jeweils vor dem versteckten Absatz. Bitte beachten sie, dass der Parameter und die id="" übereinstimmen müssen.
Anmerkung: Hier macht übrigens wieder eine „ID“ Sinn, da sich das Ein-/Ausblenden jeweils nur auf einen bestimmten Absatz auswirken soll.
<!-- Absatz 1 einblenden --> <a href="%%1%%"> mehr ... </a> </p> <div id="Absatz1">
In der Datei vorlagen/toggleDiv.js ist diese Funktion definert. Sie manipuliert den Wert display: zwischen "" (leer) und block. Der leere Wert provoziert das Standardverhalten (hidden) aus dem Stylesheet und block ist der Standardwert für ein <div> (Blockelement). Damit zeigt block den <div> an.
Dateien: anfahrt.html (beispiele/04_erweiterte_Webpraesenz/anfahrt.html), osm.js (beispiele/04_erweiterte_Webpraesenz/vorlagen/osm.js), osm.css (beispiele/04_erweiterte_Webpraesenz/vorlagen/osm.css)
Für eine Anfahrtsbeschreibung bietet sich heute die Verwendung von OpenStreetMap (http://www.openstreetmap.de) an. Openstreetmap ist die Wikipedia der Landkarten, es stellt also frei Geodaten und Karten zur Verfügung.
Das Beispiel dazu finden sie nicht auf der Hauptseite sondern unter anfahrt.html.
Hier finden sich drei Stellen: im Header das Einbinden von drei zusätzlichen JS-Funktionsbibliotheken und der CSS-Datei, im <body> der Aufruf der darstellenden Funktion drawmap() und im Inhalte-Div ein <div id="map">, der Platz für die Karte schafft (formatiert in osm.css).
Anmerkung: Beachten sie, dass die Reihenfolge der JavaScript-Bibliotheken wichtig ist. osm.js benutzt OpenStreetMap.js und OpenLayers.js, OpenStreetMap.js wiederum benutzt OpenLayers.js. Entsprechend müssen sie zuerst OpenLayers.js dann OpenStreetMap.js und zuletzt osm.js einbinden.
<head> … <!-- Anfahrt mit Open Source --> <link rel="stylesheet" type="text/css" href="vorlagen/osm.css" /> <script type="text/javascript" src="http://www.openlayers.org/api/OpenLayers.js"></script> <script type="text/javascript" src="http://www.openstreetmap.org/openlayers/OpenStreetMap.js"></script> <script type="text/javascript" src="vorlagen/osm.js"></script> … </head>
<!-- Anfahrt mit Open Source Map darstellen --> <body onload="drawmap(13.150072,52.714831,12,'CIS - Ch. Hartnick, Sandweg 10<br/>16727 Oberkrämer OT Bärenklau')">
<body onload="…"> … <!-- Anfahrt mit Open Source Bereich --> <div id="map"></div> … </body>
Den eigentlichen JavaScript-Code werden wir nicht genauer analysieren, da er viel zu komplex ist. Allerdings können wir über die Aufrufparameter die Karte beeinflussen.
# | Beschreibung |
---|---|
1 | Längengrad (erscheint unten rechts als erstes, wenn Maus über die Karte fährt) |
2 | Breitengrad (erscheint unten rechts als zweites, wenn Maus über die Karte fährt) |
3 | Zoom-Faktor der Karte |
4 | Text der bei Klicken auf den roten Pfeil erscheinen soll |
Für die Parameter können sie unter www.osm.org (http://www.osm.org) auf das Symbol für „Teilen“ (Viereck mit Pfeil) klicken und ihren Kartenausschnitt wählen. Markieren sie „Kartenmarker setzen“. Die Daten für Zoom, Längengrad und Breitengrad erscheinen dann in der Eingabezeile des Browsers (allerdings in umgekehrter Reihenfolge).
Openstreetmap ist ein Mitmachprojekt. Sollten sie mitmachen wollen, finden sie alles für den Einstieg auf der Homepage (http://www.openstreetmap.de) unter „Wie kann ich mitmachen“. Auf der Projektseite (http://www.osm.org) können sie mit dem Symbol „Hinweis/Fehler melden“ (Sprechblase) Anmerkungen zur Karte geben.
Dateien: bilder.html (beispiele/04_erweiterte_Webpraesenz/bilder.html), jquery-1.10.2.min.js (beispiele/04_erweiterte_Webpraesenz/vorlagen/jquery-1.10.2.min.js), lightbox-2.6.min.js (beispiele/04_erweiterte_Webpraesenz/vorlagen/lightbox-2.6.min.js), lightbox.css (beispiele/04_erweiterte_Webpraesenz/vorlagen/lightbox.css)
Moderne Webpräsenzen sind ohne eine animierte Bildergallerie kaum denkbar. Dafür müssen wir JavaScript benutzen. Natürlich programmieren wir eine entsprechende Funktion nicht selbst, sondern nutzen ein bestehende Bibliothek aus dem Netz: LightBox von Lokesh Dhakar (http://www.lokeshdhakar.com/projects/lightbox2/) (Download LightBox 2.6 (beispiele/04_Lightbox/lightbox2.6.zip))
Anmerkung: Auf der Website von Lokesh steht mittlerweile eine neuere Version zur Verfügung. Deshalb ist es sinnvoll alle Dateien/Bibliotheken immer auf die eigene Site zu kopieren.
Sowohl JQuery (http://de.wikipedia.org/wiki/JQuery) als auch Lightbox sind in einer Minimalversion (.min.js) beigelegt, die nicht für Sichtbarkeit, sondern für möglichst kleine Dateigrößen ausgelegt sind. Sie sind also auf Ladezeit optimiert. Sollten sie externes JavaScript verwenden, achten sie immer auf solche Minimalversionen!
Die Dateien jquery-1.10.2.min.js, lightbox-2.6.min.js und lightbox.css sind im Header der HTML-Datei eingebunden.
<!-- LightBox --> <link rel="stylesheet" type="text/css" href="vorlagen/lightbox.css" /> <script type="text/javascript" src="vorlagen/jquery-1.10.2.min.js"></script> <script type="text/javascript" src="vorlagen/lightbox-2.6.min.js"></script>
Im bilder-Ordner finden sie die Dateien close.png, loading.gif, prev.png und next.png, die lightbox.css benötigt. Die Orginaldatei von Lokesh Dhakar sucht sie im Ordner img, das habe ich aber für unser Beispiel angepaßt.
Jedes Bild wird als Link (<a href="">) in der Seite eingebunden. Dieser Link bekommt ein spezielles Attribut (<a href="" data-lightbox="Gruppe">), damit er von Lightbox behandelt wird. Das innerhalb des Links eingebundene Bild selbst sollte ein Thumbnail (Vorschaubild (http://de.wikipedia.org/wiki/Vorschaubild)) des eigentlichen Bildes sein.
Dieses Attribut data-lightbox="" sollte bei einer einzelnen Grafik eindeutig sein:
<a href="bilder/single.jpg" data-lightbox="Einzeln" title="Bildüberschrift"><img src="bilder/thumb_single.jpg" /></a>
Bei einer Diashow sollte er dagegen für alle Bilder gleich sein.
<div class="Bilder"> <a href="bilder/image-1.jpg" data-lightbox="Gruppe1" title="Bild1"><img src="bilder/thumb-1.jpg" /></a> <a href="bilder/image-2.jpg" data-lightbox="Gruppe1" title="Bild2"><img src="bilder/thumb-2.jpg" /></a> <a href="bilder/image-3.jpg" data-lightbox="Gruppe1" title="Bild3"><img src="bilder/thumb-3.jpg" /></a> <a href="bilder/image-4.jpg" data-lightbox="Gruppe1" title="Bild4"><img src="bilder/thumb-4.jpg" /></a> <a href="bilder/image-5.jpg" data-lightbox="Gruppe1" title="Bild5"><img src="bilder/thumb-5.jpg" /></a> </div>
Anmerkung: Vielleicht ist es ihnen ja aufgefallen. Lightbox wird nicht auf der HTML-Seite aufgerufen (kein Funktionsaufruf). Dies ist (natürlich) kein Fehler, sondern ein Trick im Javascript Code.
HTML-Formulare brauchen immer eine „Gegenstelle“ auf dem Server, der sie die eingegebenen Daten übergeben können. Zwar kann man die Formulardaten auch mit JavaScript weiterverarbeiten, doch irgendwann müssen sie gespeichert werden. Deshalb benötigen wir zum Testen des folgenden Beispiels einen lokalen oder entfernten Webserver (s.Anhang XAMPP).
Referenz: Formulare (http://de.selfhtml.org/navigation/html.htm#formulare) in SelfHTML.
Folgende Tags existieren für Formulare:
Die einzelnen Tags haben recht vielfältige Attribute:
GET und POST sind Verfahren um die Werte von Formularen an eine Auswerteseite zu übergeben. GET versendet die Werte in der URI (name.html?variable=wert) und kann so etwa bis zu 200 Zeichen übergeben. GET ist schneller als POST.
POST versendet die Werte über die Standardeingabe (also direkt). Die Werte erscheinen so nicht in der URI und werden damit nicht in den Log-Dateien des Servers gespeichert. Außerdem sind Passwörter nicht zu sehen.
Get und Post in SelfPHP (http://www.selfphp.info/praxisbuch/praxisbuchseite.php?site=183&group=32)
<label for="FeldID"> bezeichnet ein Eingabefeld. Dies kann zwar auch mittels normalen HTML erfolgen, aber <label> ist barrierefrei und besser mit CSS zu händeln.
Dateien: kontakt.html (beispiele/04_erweiterte_Webpraesenz/kontakt.html), antwort.php (_show_plain.php?name=beispiele/04_erweiterte_Webpraesenz/antwort.php) formular.css (beispiele/04_erweiterte_Webpraesenz/vorlagen/formular.css)
Beachten sie, dass dieses Beispiel nur auf einem Webserver funktioniert! Sie sehen schon an der Dateiendung ".php (http://de.wikipedia.org/wiki/PHP)", das es sich bei der Antwortdatei (antwort.php) um ein Serverskript handelt.
Ähnlich wie bei Javascript können sie viele freie PHP-Skripte im Netz finden und benutzen. Selbst die meisten großen Webanwendungen wie Conten Management Systeme und Shops sind im Endeffekt PHP-Skripte.
Neben PHP existieren noch andere Sprachen für Server. Klären sie mit ihrem Provider, welche ihr Hostingangebot unterstützt. (s. Webserver)
PHP-Dateien werden auf dem Server interpretiert. Dieser liefert dann die interpretierte Datei als reine HTML-Datei aus. PHP-Code ist deshalb auf dem Client niemals zu sehen.
Ich gehe hier kurz auf den PHP-Code ein, damit sie eine Vorstellung bekommen, wie dieser Aussieht. Beachten sie das PHP und Javascript zwei völlig verschiedene Sprachen sind, auch wenn hier zur Unterscheidung von HTML die selbe Farbe eingesetzt wird!
Wenn sie das Mailformular auf ihrer Seite verwenden wollen, benötigen sie sicherlich nicht alle Formularfelder. Wenn sie nun Felder in der HTML-Datei löschen, müssen sie diese auch in der PHP-Datei entfernen.
Suchen sie dazu unter dem Kommentar //Hole alle Inhalte der Formularfelder das entsprechende Feld über das Attribut name="". Merken sie sich die zugehörige Variable. Mit dieser finden sie die entsprechenden Zeilen unter dem Kommentar //Prüfen der Felder und //Zusammenfügen der Mail. Diese Zeilen unter den Kommentaren können sie dann löschen.
Ein Favicon (Favoriten-Symbol) ist ein 16×16 oder 32×32 Pixel großes Symbol. Es dient der Wiedererkennung einer Webpräsenz. Das Favicon taucht auch in der Lesezeichenliste (Favoriten), bei den Registerkarten und unter Windows beim Speichern einer Seite auf dem Desktop auf.
Um ein Favicon einzubinden, existieren zwei Möglichkeiten:
Das Attribut type="" wird bei anderen Formaten als .ico verwendet:
Die Standardgrößen für .ICO sind 16×16 Pixel oder 32×32 Pixel. Die Farbtiefen können 16 bis 16,7 Millionen Farben (4-16 Bit). Für .GIF und .PNG entsprechend 16×16 Pixel und 256 Farben (8 Bit).
Die einfachste Art eine Favicon zu erstellen, ist ein Webgenerator:
Favicon Generator (http://www.favicon.cc/)
Robots.txt (http://de.wikipedia.org/wiki/Robots.txt) in der Wikipedia.
# robots.txt # Zugriff auf alle Dateien erlaubenUser-agent: * Disallow:
.htaccess (http://de.wikipedia.org/wiki/.htaccess) in der Wikipedia.
http://www.mediaevent.de/xhtml/manifest.html
Eine Vorlage für eine Webpräsenz haben wir am Ende des letzten Hauptkapitels mit unserem Vorlagensystem kennengelernt. Dieses können wir relativ einfach noch ein wenig erweitern.
Als Vorüberlegung trennen wir eine Webseite aus der Webpräsenz in verschiedene Sektionen auf. Bisher haben wir die Unterseiten seiten_vorlage.html, kopf.html und menu.html. Innerhalb der Seitenvorlage haben wir noch die Sektion für den Inhalt.
Die Idee für unser Mini-Generator ist nun folgende: Unsere Vorlage wird jetzt per Platzhalter (%%menu%% und %%inhalt%%) mit dem automatisch generierten Menu und den Inhaltsdateien (index.source, ….source) befüllt. Der Kopf ist in die Vorlage integriert. Außerdem können beliebige Platzhalter (%%Seitentitel%%, %%Autor%%) mittels der Datei ersetzen.liste ersetzt werden.
Das Generieren des Menüs (cms/_menu.template) und das Ersetzen der Platzhalter übernimmt ein kleines Programm (Windows: generate.bat / Linux: generate.sh). Wobei das Windows-Programm das Linux-Programm mittels einer Windows-Bash (http://de.wikipedia.org/wiki/Bourne-again_shell) einfach aufruft. (Beispiel Generate)
Die eigentlichen Inhalte bekommen jeweils eine eigene Datei mit der Endung .source im Unterverzeichnis cms. Außerdem wird jeder Source-Datei eine Ziffer vorangestellt, die die Reihenfolge des Menüs vorgibt (0index.source, 1anfahrt.source, 2…). Das System verwaltet also höchstens zehn Seiten.
Unser Projekt sieht dann so aus:
Der Vorteil des Mini-CMS besteht darin, das immer alles neu generiert wird - also sich selbst Änderungen in der Datei cms/vorlage.template in den generierten Seiten auswirken. Außerdem müssen sie sich nicht um das Menü kümmern. Darin liegt dann auch gleich der größte Nachteil. Mehr als zehn Seiten lassen sich nicht verwalten und es gibt kein hierarchisches Menü.
Übung:
Laden sie sich das Archiv mit dem Beispiel herunter. Spielen sie damit herum.
Hagen (HTML-Generator) funktioniert nach dem selben Prinzip, ist aber um Größenordnungen komplexer. Es unterstützt den Webentwickler bei nahezu alle Aufgaben.
Zu Hagen existiert ein eigenes Handbuch (http://buch.im-ned.de/hagen/).
Übung:
Laden sie sich das Archiv mit dem Beispiel herunter. Spielen sie damit herum.
Der Begriff Hosting (http://de.wikipedia.org/wiki/Hosting) bedeutet „Gastgeber sein“. Wenn sie eine Webpräsenz geschaffen haben, möchten sie diese auch der Allgemeinheit zugänglich machen. Dazu mieten sie normalerweise bei einem Provider (http://de.wikipedia.org/wiki/Provider) oder Webhoster (http://de.wikipedia.org/wiki/Webhoster) Dienstleistungen wie
Außerdem kümmern sich Webhoster um
Normalerweise haben Hoster verschiedene Angebote für private Websites, Firmen-Websites und kommerzielle Internetprojekte.
Beispiel: WEBHOSTONE (http://www.webhostone.de)
Es gibt verschiedene Arten von Webservern. Für den einfachen Einstieg bekommt man Webspace (http://de.wikipedia.org/wiki/Webspace) bei Sharehostern (http://de.wikipedia.org/wiki/Sharehoster). Dort kann man beliebige Dateien im Netz ohne eigenem Domainnamen speichern.
Bei einem Webhoster bekommt man verschieden Angebote wie: Eine eigene Domain auf einem geteilten Server (virtuelle Domain (http://de.wikipedia.org/wiki/Virtual_Hosting) (IP/Name)), eine eigene Domain auf einem virtuellen Server (virtuelle Maschine (http://de.wikipedia.org/wiki/Virtuelle_Maschine)), eine eigene Domain auf einem echten Server (dedicated Server (http://de.wikipedia.org/wiki/Server#Dedizierte_Server) bzw. RootServer (http://de.wikipedia.org/wiki/Host_%28Informationstechnik%29#Einem_Kunden_zugeordnet_.28dedicated_to_customer.29)), oder eine eigene Domain auf einem eigenem Server (Homing (http://de.wikipedia.org/wiki/Homing_%28Informationstechnologie%29)/Eigener Server). Wenn der Server vom Provider gewartet wird, spricht man vom managed Server (http://de.wikipedia.org/wiki/Managed_Server#Managed_Host).
Beispiel: WHO Produkte (http://www.webhostone.de/webspace.html)
In einem Hosting-Vertrag sind meist Inklusivdomains enthalten. Man sollte darauf achten das der Traffic (http://de.wikipedia.org/wiki/Datenverkehr) (Datenverkehr) nicht extra berechnet wird (also eine Art Flatrate). Wird die eigene Webpräsenz plötzlich stark frquentiert, könnte es sonst teuer werden.
Die Leistungsfähigkeit wird auch stark durch die Anbindung ans Internet beschränkt. Je nach Anwendungsfall sollte es schon mindestens Fast Ethernet (http://de.wikipedia.org/wiki/Fast_Ethernet) (100MBit) seien. Normalerweise werden sie ein freies Unix (Linux, BSD) als Betriebssystem bekommen, manche Provider bieten allerdings auch Windows. Achten sie auch auf die Rechnerressourcen wie CPU (http://de.wikipedia.org/wiki/CPU) und Speicher (http://de.wikipedia.org/wiki/Arbeitsspeicher).
Fast jedes Webhosting bietet heute auch gleich Email-Dienste an. So können sie gleich vernünftige Adressen auf ihrer Webpräsenz angeben. Weitere Leistungen sind SSL (http://de.wikipedia.org/wiki/Transport_Layer_Security), PHP (http://de.wikipedia.org/wiki/PHP), MySQL (http://de.wikipedia.org/wiki/MySQL), CMS (http://de.wikipedia.org/wiki/Content-Management-System) und ähnliches.
Außerdem sollte es eine Administrationsoberfläche mit Zugriff auf Statistiken, Backups, das eigentliche Angebot (FTP, SSH)und Support geben. Die Verwaltung des Angebots sollte das Anlegen von Subdomains, Zugängen und Mailkonten, den Neustart des Systems, das Verändern der Konfiguration, das Einspielen von Updates und eine virtuelle Konsole (http://de.wikipedia.org/wiki/Kommandozeile) umfassen.
Beispiel: WHO Adminpanel (http://www.webhostone.de/who_adminpanel_einfuehrung.html)
n.v.
Im Internet bewegt man sich in der Öffentlichkeit. Und eine Präsenz dort ist wie ein Schaufenster in der Realität. Es ist also wichtig auch das drumherum zu beachten.
Die Web_Accessibility_Initiative (WAI (http://de.wikipedia.org/wiki/Web_Accessibility_Initiative)) ist eine Gruppe innerhalb des W3C, die sich um Standards (WCAG) zum barrierfreien Zugang im Web kümmert.
Auszug aus Wikipedia (cc-by-sa):
Zur Einhaltung des Standards WCAG 1.0 bedarf es insbesondere der folgenden vierzehn Punkte:
WCAG 2.0 wurde am 11. Dezember 2008 als W3C Recommendation veröffentlicht. Während die WCAG 1.0 stark an HTML und CSS gebunden waren, und daher nach einigen Jahren nicht mehr dem Stand der Technik entsprachen, haben die WCAG 2.0 zum Ziel, unabhängig von bestimmten Technologien zu sein.
Die Richtlinien sind in 4 Prinzipien gruppiert:
Die Barrierefreie Informationstechnik Verordnung (BITV (http://de.wikipedia.org/wiki/Barrierefreie-Informationstechnik-Verordnung)) ist an WCAG angelehnt. Sie ist für den öffentlicher Bereich verpflichtend, wird aber auch in private Zielvereinbarungen aufgenommen.
Typische Barrieren für Behinderte im Web sind:
www.einfach-fuer-alle.de (http://www.einfach-fuer-alle.de)
Wer sich im Internet präsentiert, muss das Telemediengesetz (TMG (http://de.wikipedia.org/wiki/Telemediengesetz)) beachtet. Es enthält unter anderen folgende Regelungen:
Internetwerbung (http://de.wikipedia.org/wiki/Internetwerbung) in der Wikipedia.
Begriff | Erläuterung |
---|---|
Ad(vertising) | Werbeanzeige auf Webseite |
Ad-Impression (AI) | Anzahl der Anzeigen einer Werbung |
Ad-Server | speziller Server zum Ausliefern von Werbung |
Cost per click Cost per lead | Kosten pro Klick Kosten pro Action |
Click through rate | Verhältnis AI zu realen clicks |
Lead | Werbeaktion |
Page-impressions | Seitendarstellungen |
Visit | Besucher einer Präsenz |
Targeting | Werbung auf bekannten Besucher zuschneiden |
Datenschutz (http://de.wikipedia.org/wiki/Datenschutz) beruht auf einem Grundrecht (Recht auf
informationelle Selbstbestimmung)
(Aber: Ausland)
Bundesdatenschutzgesetz (http://de.wikipedia.org/wiki/Bundesdatenschutzgesetz)
https://www.google.com/webmasters
n.v.
Ein vernünftige Planung erleichtert das Erstellen einer Webpräsenz. Projektmanagement ist dafür das probate Mittel.
„Baustellenschilder“ sind verboten! Projekte werden erst nach Fertigstellung online gestellt!
Die Phase der Ideenfindung reicht von der Ideensammlung bis zu einem ersten Ergebnisbericht.
Zusammenfassung der Protokolle als Dokumentation der Ideenfindungsphase.
Dann erfolgt der eigentliche Projektbeginn.
Die Phase Initialisierung verbindet die übergeordnete Ideenfindung mit der operativen Ausführungsebene und schafft für das Projekt eine definierte Ausgangsbasis.
(eventuell Abbruch des Projekts)
Die Phase Analyse ist ein Klärungsprozess, der mit vertretbarem Aufwand eine Entscheidung über die grundsätzliche Art der Systemrealiserung herbeiführt. Unwirtschaftliche oder nicht realisierbare Vorhaben sollen erkannt und rechtzeitig abgebrochen werden.
Die Situationsanalyse ist keine objektive IST-Analyse sondern die Betrachtung der augenblicklichen subjektiven Situation, die zum Projektstart führt.
Die Sollanalyse beschreibt das zukünftige System.
Lösungsvorschläge
eventuell Abbruch des Projekts oder Rückschritt zur „Initialisierung“
Die Konzeptphase dient zur Verfeinerung des gewählten Lösungsvorschlags und ermöglicht eine fundierte Beurteilung des Systems. Das erarbeitete Konzept legt den Rahmen für die nachfolgenden Realisierung und Einführung fest.
eventuell Rückschritt zur Initialisierung oder Analyse bei definitorischen oder analytische Schwächen.
Die Realisierungsphase dient zur Erstellung des einführbereiten Systems einschließlich Migrationsverfahren und schafft die Voraussetzungen für die nachfolgende Einführung.
Ein Testplan ist anzugeben. Er enthält Testfälle (Eingaben und erwartete Ausgaben) oder auch Testszenarien (z.B. Einfügen, Anschauen, Ändern, Anschauen, Löschen, Anschauen).
eventuell Rückschritt zur Analyse oder zum Konzept bei analytischen oder konzeptionellen Schwächen
Die Phase Einführung dient der Installation des Systems und der Aufnahme des Betriebs. Sie gewährleistet einen sicheren Übergang vom bestehenden System zum neuen System.
Durchführung der Migration/Installation nach dem Handbuch.
Entscheid über den Projektabschluss
eventuell Rückschritt zur Realisierung zwecks Nachbesserung
Der Betrieb ist wie die Planung kein Teil des eigentlichen Projekts. Allerdings sollten die Projektphasen einen sichern Betrieb ermöglichen (Handbücher, Entwicklung).
n.v.
Im dritten Kursteil steigern wir unsere fortgeschrittenen Kentnisse zum Profi.
http://www.mediaevent.de/css/display-flex.html
@font-face { font-family: WRWestern; src: url( images/WesternNormal.eot ); src: local('Ø'), url( images/WesternNormal.woff) format('woff'), url( images/WesternNormal.ttf) format('truetype'); }
p { font-size: medium; widows:5; orphans:5; text-align: justify; } p+p { text-indent: 1em; }
//li.level1:before { content:counter(kz1) ' '; } li.level2:before { content:counter(kz1) '.' counter(kz2,lower-alpha) ' '; } li.level3:before { content:counter(kz3) ' '; } li.level1 { counter-increment:kz1; counter-reset:kz2; } li.level2 { counter-increment:kz2; counter-reset:kz3; } li.level3 { counter-increment:kz3; }
http://www.mediaevent.de/2012/12/mathml-formeln-in-webseiten-mit-html5/
http://www.mediaevent.de/xhtml/canvas.html http://www.mediaevent.de/javascript/canvas.html
// -------------------------------------------------------------- // Cookie Handling // -------------------------------------------------------------- function cookie_restore() // Auslesen des Zustands aus Cookie // -------------------------------------------------------------- { var cookiecontent; var sprache = ""; if (document.cookie) { // Wert aus Cookie lesen cookiecontent = unescape(document.cookie); cookiearray = cookiecontent.split(";"); for (var i = 0; i < cookiearray.length; i++) { name_wert = cookiearray[i].split("="); if ( name_wert[0]=="sprache" ) sprache = String (name_wert[1]); } } return sprache; }
// -------------------------------------------------------------- function cookie_persist(sprache) // -------------------------------------------------------------- { var Verfallszeit; var Auszeit; var jetzt; // Verfall berechnen: 1 Jahr Verfallszeit = 1000*60*60*24*365; // 1 Jahr in Millisekunden jetzt = new Date(); Auszeit = new Date(jetzt.getTime() + Verfallszeit); // Werte _einzeln_ in cookie schreiben document.cookie = "sprache=" + sprache + ";expires=" + Auszeit.toGMTString() + ";"; // Wahr zurückgeben return true; }
// -------------------------------------------------------------- // CSS Handling // -------------------------------------------------------------- function changeCSSFile(cssFile,cssLinkIndex) { // -------------------------------------------------------------- var oldlink = document.getElementsByTagName("link").item(cssLinkIndex); var newlink = document.createElement("link"); newlink.setAttribute("rel", "stylesheet"); newlink.setAttribute("type", "text/css"); newlink.setAttribute("href", cssFile); document.getElementsByTagName("head").item(0).replaceChild(newlink,oldlink); cookie_persist(cssFile); } var sprache = ''; sprache = cookie_restore(); if ((sprache=='') & (navigator.language.indexOf("de") > -1)) sprache = 'de.css'; if (sprache!='') changeCSSFile(sprache,0);
.en { display: auto; } .de { display: none; }
.en { display: none; } .de { display: auto; }
<p> <img src="images/en.png" onclick="javascript:changeCSSFile('en.css',0)" /> | <img src="images/de.png" onclick="javascript:changeCSSFile('de.css',0)" /> </p> <h1> <span class="en">Hagen user manual</span> <span class="de">Hagen Benutzerhandbuch</span> </h1> <div class="en"> <p>Hagen is a open source (lgpl) cross platform html generator (or client side cms). It supports the web developer by generating a website and writing the pages. For that purpose Hagen will automate as much tasks as it can. </p> <p>You can use Hagen to write a slideshow in cooperation with slidy too. To do this look in <a href="slidy/">this slideshow</a>. </p> <p>Hagen was developed with Lazarus. </p> </div><!-- Div: en --> <div class="de"> <p>Hagen ist ein HTML-Generator / Client-Side CMS. Er unterstützt den Webentwickler beim Anlegen von Webpräsenzen und Schreiben der Seiten. Dazu automatisiert Hagen möglichst viele Aufgaben. </p> <p>Hagen kann auch zusammen mit slidy zum Schreiben von Präsentationen benutzt werden. Sehen sie dazu <a href="slidy/">diese Präsentation</a>. </p> <p>Hagen wird mit Lazarus entwickelt. </p> </div><!-- Div: de -->
http://www.mediaevent.de/2013/04/svg-in-html-seiten/ http://www.mediaevent.de/2014/03/svg-in-einem-image-tag/
http://www.mediaevent.de/javascript/filereader.html
http://www.yaml.de
http://www.scriptol.com/html5/frameworks.php http://www.sinnfly.de/web/html-und-css-frameworks/
n.v.
Im dritten Kursteil beschäftigen wir uns mit Content Management Systemen (CMS).
Dazu bauen wir selbst ein kleines Content Management System und schauen uns ein professionelles CMS (Joomla) an.
n.v.
Zunächst besprechen wir den allgemeinen Aufbau eines CMS und danach die Unterschiede zwischen einen client-basierten und einem server-basierten CMS.
Nach der Adressauflösung (DNS) sendet der Client (Browser) die Webseitenanfrage an den Server. Sollten weitere Objekte (CSS, JavaScript, Bilder, Text, ...) auf der Seite eingebunden sein, werden auch diese von den entsprechenden Servern angefragt. Die Server liefern dann die Ergebnisse an den Client zurück und dieser stellt sie dar.
Bevor der Browser die Abfragen losschickt, prüft er deren Vorhandensein im lokalen Cache. Sind diese noch aktuell, verwendet er diese. Hat er alle Objekte zusammen, baut er daraus die komplette Webseite auf. Dazu muss er natürlich den HTML-, CSS- und JS-Code korrekt interpretieren. Er bestimmt also, welche Tags und Eigenschaften (Versionen) benutzt werden können.
Die Webserver holen die angefragten Daten aus dem lokalen Dateisystem. Ein Webserver war am Anfang entsprechend sehr einfach gestrickt. Allerdings übernimmt er heute noch viele andere Aufgaben (Server-Skripte, …) und ist entsprechend komplex geworden.
Wenn wir Inhalte händisch erstellen, entwicken und strukturieren wir sie lokal. Dazu legen wir Dateien und Verzeichnisse an. Das müssen wir dann entsprechend auf dem Server wiederholen (lassen - von einem Programm).
Auf dem Client benutzen wir dazu zwei Programme: Den Webeditor und einen FTP-Client (FTP-Dateimanager oder FTP-Synchronisator). Der Editor erstellt die Inhalte und der FTP-Client kopiert sie auf den Server.
Das Gegenstück zum FTP-Client auf dem Server heißt entsprechend FTP-Server. Auch er ist ein relativ einfach gestricktes Programm. Er sorgt dafür, das wir mit einem FTP-Client mit Dateien und Verzeichnissen wie auf dem lokalen System arbeiten können.
Content Management kann man mit Inhalteverwaltung übersetzen. Das ist für uns eigentlich nichts neues - irgendwie müssen wir die Inhalte unserer Webseiten ja erstellen und anordnen. Content Mangement Systeme (CMS) sind Programme die uns dabei helfen. Sie haben vor allen Dingen folgende Funktionalitäten:
CMS sind Client- oder Serverbasiert.
"Händisches" CM | |
---|---|
Struktur | Eigene Verantwortung Keine Unterstützung |
Inhalte | selbstverwaltet Entwicklung auf dem Client |
Benutzer | Zusammenarbeit ist schwer zu händeln |
Client-basiertes CM | |
Struktur | Meist Vorgegeben Automatische Verwaltung |
Inhalte | systemverwaltet Entwicklung auf dem Client |
Benutzer | Meist auf einen Rechner beschränkt |
CMS | |
Struktur | Fast immer Vorgegeben Automatische Verwaltung |
Inhalte | systemverwaltet Entwicklung auf dem Server Module |
Benutzer | Benutzer- bis hin zur Rechteverwaltung |
Darüber hinaus gibt es noch sogenannte Web- oder Homepagebaukästen (http://de.wikipedia.org/wiki/Homepage-Baukasten) wie Jimdo (http://de.jimdo.com/) oder Webnode (http://de.webnode.com/). Sie sind meist Server-basiert.
Mit diesen können sie mit wenigen Klicks eine Webseite zusammenklicken. Vorteile:
Nachteile:
Client-CMS generieren Webpräsenzen auf einem Rechner (siehe Generatoren in Webpräsenz generieren). Im Prinzip funktioniert jedes Client-CMS wie das Beispielsystem dort. Die meisten haben natürlich mehr Komfort und Funtionalität (s. Hagen (http://buch.im-ned.de/hagen/)).
Es gibt einige Desktop CMS: googlen: Desktop CMS. (Weblica, Zeta Producer, BuddyW, …)
Ein Server-Side CMS stellt ein sogenanntes Backend zum Erstellen und Verwalten von Strukturen sowie ein Frontend zur Darstellung der Inhalte (Content) zur Verfügung. Das CMS (meist in PHP oder anderen Serversprachen geschrieben) nimmt die Eingaben des Frontends entgegen und speichert sie (Datenbank).
Beim Seitenabruf holt der Server die Dateien nicht mehr aus dem Dateisystem, sondern aus einer Datenbak, wo er sie besser verwalten kann und zeigt sie im Frontend an.
Während auf der Clientseite alles beim Alten bleibt, geschieht alle Programmlogik jetzt auf dem Server (php). Das System sucht sich aus dem Dateisystem und der Datenbank alle Bestandteile zusammen, fügt sie dann zusammen und liefert sie aus. Wenn das System eine Benutzer-/Rechteverwaltung hat, prüft es vorher noch diese Zugriffsrechte.
Die Seitenerstellung geschieht jetzt auch ganz über den Server im Backend.
Zur Seitenerstelllung zeigt der Server im Browser einen entsprechenden Editor (wysiwyg) an und speichert zuletzt die Inhalte in der Datenbank. Meist können die Inhalte durch Kategorien strukturiert und Medieninhalte (Bilder, Videos, ...) verwaltet werden.
Im Server speichert das CMS die Daten in der Datenbank oder im Dateisystem.
n.v.
Joomla ist ein freies CMS, das gerne auf kleineren bis mittleren Webpräsenzen eingesetzt wird.
Ich will das Rad nicht doppelt erfinden. Also folgt hier ein Verweis auf externe Literatur: (PDF unter „Book Details“)
Joomla ist einfach zu erlernen, sobald man das Begriffsystem verstanden hat:
Begriff | Erläuterung |
---|---|
Frontend | Die Darstellung der Webpräsenz |
Backend | Verwaltung (Administration) der Webpräsenz |
Benutzer | Anwender, der sich an das System anmelden kann |
Administrator | Spezieller Benutzer, der System(-teile) verwaltet. |
Author – Editor – Publisher | Spezielle Benutzer für Inhalte |
Manager - Administrator | Spezielle Benutzer für Verwaltung |
Benutzerverwaltung | Benutzer gewisse Rechte gewähren (bsp. Administration oder Ansichten) |
Beiträge | Ein Text mit einem Titel und Grafiken … |
Kategorien | Jeder Beitrag kann genau einer Kategorie aus dem Kategorienbaum zugewiesen werden. |
Begriff | Erläuterung |
---|---|
Menü | Das kennen wir schon. Es gibt aber mehrere |
Templates | Wie unsere Seitenvorlage, aber mit viel mehr und flexibleren Sektionen (Modulpositionen) |
Module | Anzeige auf Modulpositionen: Alles was kein Beitrag ist (Menüs, Anmeldung, ...) |
Komponenten | Anzeige im <body>: Foren, Shops, Galerien, Blogs, … |
Plug-Ins | Meist keine Anzeige: Anwendungen im Backend |
Lokalisierung | Joomla unterstützt von Anfang an mehrere Sprachen |
TinyMCE | Wysiwyg-Editor Plug-In Markdown ist über Erweiterungen verfügbar |
Benutzergruppen für das Frontend
Benutzergruppen für das Backend
Zugriffsebenen
Joomla kann beliebige viele Menüs verwalten, die Inhalte anzeigen oder Funktionen zur Verfügung zustellen.
Die Menüs werden durch CSS-Klassen formatiert (div class=""): (Die Klassen stammen aus dem Framework „Bootstrap (http://getbootstrap.com/)“ und müssen im Menüklassensuffix eingetragen werden.)
Alle Arten von Inhalten in Joomla können (müssen aber nicht) zur Strukturierung in Kategorien eingeteilt werden.
Sie werden erst durch Menüeinträge oder Module sichtbar.
und dazu
Module in Beiträge einfügen:
Einige Beispiele
Zunächst bauen wir uns ein Grundgerüst für ein Layout. Im Beispiel legen wir ein dreispaltiges Layout mit Header und Footer an. Die Spalten heißen „sidebarLeft“, „sidebarRight“ und „Content“.
Um ein Template zu erzeugen, sollten sie zunächst ein Arbeitsverzeichnis erstellen und dort die Testdatei template_test.html anlegen. Neben dem Verweis auf eine CSS-Vorlage (im Beispiel css/format.css) sollten in der Datei Divisions (<div>) für „header“, „footer“, „sidebarLeft“, „sidebarRight“ und „Content“ stehen.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>Template Test</title> <link rel="stylesheet" href="css/format.css" type="text/css" /> </head> <body> <div id="wrap"> <div id="header"> <img src="images/logo.png" /> </div> <div id="sidebarLeft"><div class="padd"> <ul class="nav"> <li><a href="#">Hyperlink 1</a></li> <li><a href="#">Hyperlink 2</a></li> <li><a href="#">Hyperlink 3</a></li> <li><a href="#">Hyperlink 4</a></li> </ul> </div></div> <div id="content"><div class="padd"> <h1>Inhalt</h1> <p>mit Text und Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec</p> </div></div> <div id="sidebarRight"><div class="padd"> <p>Anmeldung</p> </div></div> <div id="footer"><div class="padd"> <p>Fußzeile</p> </div></div> </div> </body> </html>
Positioniert und gefärbt wird die Webseite in der CSS-Datei format.css, die im Unterverzeichnis css liegen sollte. Die drei Spalten werden dabei mit der Formatierung „float: left;“ erzeugt. Der zusätzliche <div class="padd"> setzt ein Padding im umgebenden <div> ohne das Layout zu zerstören (s. Boxmodell).
Natürlich ist diese Einteilung für das Joomla- Template nicht maßgeblich und kann beliebig an die eigenen Bedürfnisse angepaßt werden.
body { background-color: #f0f0f0; } #wrap { margin: 0 auto; background-color: lightblue; border:1px solid black; } #header { background-color: lightblue; } #sidebarLeft { float: left; width: 20%; background-color: aqua; } #content { float: left; width: 60%; background-color: silver; } #sidebarRight { float: left; width: 20%; background-color: aqua; } #footer { clear: both; background-color: lightblue; } .padd { padding: 1em; }
Perfektionieren sie erst diese Testdateien, bevor sie mit dem Erzeugen des eigentlichen Templates fortfahren.
Um die Datei template_test.html in ein Template umzuwandeln, müssen sie sie zunächst in index.php umkopieren. Wie sie bereits wissen, ist Joomla in PHP programmiert und entsprechend ist das Template auch in dieser Sprache geschrieben.
Fügen sie ganz oben in die Datei die folgenden, roten Zeilen ein und passen sie den HTML-Header entsprechend an:
<?php $app = JFactory::getApplication(); $doc = JFactory::getDocument(); $sitename = $app->getCfg('sitename'); $itemid = $app->input->getCmd('Itemid', ''); JHtml::_('bootstrap.framework'); JHtmlBootstrap::loadCss(); JHtmlBootstrap::loadCss($includeMaincss = false, $this->direction); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <jdoc:include type="head" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="stylesheet" href="<?php echo $this->baseurl ?>/templates/<?php echo $this->template ?>/css/format.css" type="text/css" /> </head> …
Die ersten vier Zeilen holen Objekte und Variablen aus dem Joomla Framework (http://www.joomla-wiki.de/dokumentation/Joomla!_Framework). Die nächsten drei binden das Bootstrap (http://getbootstrap.com/) Framework ein. Beide werden für den Zugriff auf und die Formatierung des Templates benötigt.
<jdoc:include type="head" /> erweitert den HTML-Header durch Joomla-Definitionen und ihre Eingaben in den entsprechenden Konfigurationsfeldern (System / Konfiguration / Globale Metadaten). Damit bleibt der Header variabel anpassbar.
Nun müssen im Body noch die Joomla-Platzhalter statt des Beispieltextes eingefügt werden.
… <body> <div id="wrap"> <div id="header"> <a href="<?php echo $this->baseurl ?>"> <img src="<?php echo $this->baseurl ?>/templates/<?php echo $this->template ?>/images/logo.png" alt="Logo" /> </a> <jdoc:include type="modules" name="banner" style="xhtml" /> <jdoc:include type="modules" name="position-1" style="xhtml" /> </div> <div id="sidebarLeft"><div class="padd"> <jdoc:include type="modules" name="left" style="xhtml" /> <jdoc:include type="modules" name="position-8" style="xhtml" /> </div></div> <div id="content"><div class="padd"> <jdoc:include type="modules" name="breadcrumb" style="xhtml" /> <jdoc:include type="modules" name="position-3" style="xhtml" /> <jdoc:include type="component" /> <jdoc:include type="message" /> <jdoc:include type="modules" name="debug" /> </div></div> <div id="sidebarRight"><div class="padd"> <jdoc:include type="modules" name="position-7" style="xhtml" /> <jdoc:include type="module" name="search" style="xhtml" /> <jdoc:include type="modules" name="right" style="xhtml" /> </div></div> <div id="footer"><div class="padd"> <jdoc:include type="modules" name="footer" style="xhtml" /> </div></div> </div> </body> </html>
<jdoc:include type="component" /> ist der Platzhalter für den eigentlichen Inhalt wie Beiträge und/oder Kategorieübersichten. <jdoc:include type="module" name="search" style="xhtml" /> wird vom Suchmodul verwendet. <jdoc:include type="message" /> zeigt Systemnachrichten wie eine fehlgeschagene Anmeldung an. Und <jdoc:include type="modules" name="debug" /> gibt Fehlermeldungen aus, sofern dies in der Konfiguration eingeschaltet ist.
Alle anderen Platzhalter können für Modulpositionen verwendet werden. Die Positionen mit den Nummern sind zur Kompatibilität mit dem Protostar Template eingefügt.
Außerdem ist im Header eine Logo-Grafik (logo.png) eingebunden. Diese Datei liegt im Unterverzeichnis „images“. Konstrukte wie <?php echo $this->baseurl ?> (oder ->template) fügen an dieser Stelle den entsprechenden Basispfad (oder Template-Pfad) von Joomla ein.
Damit man sich eine Vorstellung vom Template machen kann, müssen zwei Vorschaubilder erstellt werden. Dazu machen sie eine Bildschirmkopie der Ausgabe des Template-Tests. Diese werden mit der Breite von 400 Pixeln als „template_preview.png“ und mit 200 Pixeln als „template_thumbnail.png“ gespeichert.
Damit ist das Template praktisch fertiggestellt. Es können noch die Dateien „component.php“ (Funktionserweiteerung), „error.php“ (Fehlerseite) und „offline.php“ (Offline-Seite) ergänzt und angepasst werden. Diese können sie aus dem Protostar sowie Standard Templates kopieren oder aus der Beispieldatei extrahieren.
Zuletzt legen sie die Datei templateDetails.xml an, welche der Joomla Installation die Information liefert.
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE install PUBLIC "-//Joomla! 2.5//DTD template 1.0//EN" "http://www.joomla.org/xml/dtd/1.6/template-install.dtd"> <extension version="2.5" type="template" client="site"> <name>Simplate</name> <creationDate>22. November 2013</creationDate> <description>Simple Template</description> **Christian Hartnick</author> <authorEmail>hilfe@hartnick.de</authorEmail> <authorUrl>http://hilfe.hartnick.de</authorUrl> <copyright>Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <version>2.5.0</version> <files> <filename>component.php</filename> <filename>error.php</filename> <filename>index.html</filename> <filename>index.php</filename> <filename>offline.php</filename> <filename>favicon.ico</filename> <filename>template_preview.png</filename> <filename>template_thumbnail.png</filename> <filename>templateDetails.xml</filename> <filename>css/format.css</filename> <filename>images/logo.png</filename> </files> <positions> <position>left</position> <position>breadcrumb</position> <position>search</position> <position>right</position> <position>footer</position> <position>banner</position> <position>position-1</position> <position>position-3</position> <position>position-7</position> <position>position-8</position> </positions> </extension>
Wie sie leicht erkennen können, werden hier alle wichtigen Informationen zum Template aufgeführt. Wenn hier Namen und Pfade nicht mit der Realität übereinstimmen, wird die Installation des Templates verweigert!
Zuletzt werden die Dateien und Verzeichnisse gezippt und können dann als Erweiterung installiert werden. (Achtung! Nicht das Verzeichnis sondern alle Dateien und Unterverzeichnisse zippen)
n.v.
Typo 3 ist ein freies CMS, das gerne auf mittleren bis großen Webpräsenzen eingesetzt wird.
Ich will das Rad nicht doppelt erfinden. Also folgt hier ein Verweis auf externe Literatur: (PDF unter „Book Details“)
Joomla ist einfach zu erlernen, sobald man das Begriffsystem verstanden hat:
Begriff | Erläuterung |
---|---|
Frontend | Die Darstellung der Webpräsenz http://www.domain.tld |
Backend | Verwaltung (Administration) der Webpräsenz http://www.domain.tld/typo3 |
Benutzer | Anwender, der sich an das System anmelden kann |
Admin(istrator) | Spezieller Benutzer, der System(-teile) verwaltet. |
Author – Editor – Publisher | Spezielle Benutzer für Inhalte - in Typo3 selbst anzulegen und in Workspaces verwalten |
Benutzerverwaltung | Benutzer gewisse Rechte gewähren (bsp. Administration, Zugriff oder Ansichten) |
Seiten | Seiteinhalte (Links, Normal, Rdchts, Rand) |
Kategorien | Kategorien für Seiten |
Dateiliste | Mediainhalte hochladen (Bilder, Schriften, …) |
Begriff | Erläuterung |
---|---|
Menü | Das kennen wir schon. Es gibt aber mehrere |
Ordner | Datenbanken für Nutzer, News, Kalender … |
Templates | Wie unsere Seitenvorlage, aber viel flexibler durch TypoScript |
TypoScript | Objektbaum mit Fallunterscheidung |
Erweiterungen | Erweiterungen für das System (Suche, Skripte …) |
Lokalisierung | Typo3 unterstützt von Anfang an mehrere Sprachen |
Achtung! Die Bedienung erfolgt teilweise direkt oder über Rechtsklick.
Backend-Menü passt sich dem Benutzer an
http://meine-typo3-seite.tld/typo3
¹: von Erweiterungen abhängig
http://meine-typo3-seite.tld
Benutzergruppen für das Frontend → Erweiterungen
Einige Beispiele
config.admPanel=1 config.admPanel { enable.edit=1 module.edit.forceDisplayFieldIcons=1 }
Zunächst bauen wir uns ein Grundgerüst für ein Layout. Im Beispiel legen wir ein dreispaltiges Layout mit Header und Footer an. Die Spalten heißen „sidebarLeft“, „sidebarRight“ und „Content“.
Um ein Template zu erzeugen, sollten sie zunächst ein Arbeitsverzeichnis erstellen und dort die Testdatei template_test.html anlegen. Neben dem Verweis auf eine CSS-Vorlage (im Beispiel css/format.css) sollten in der Datei Divisions (<div>) für „header“, „footer“, „sidebarLeft“, „sidebarRight“ und „Content“ stehen.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>Template Test</title> <link rel="stylesheet" href="css/format.css" type="text/css" /> </head> <body> <div id="wrap"> <div id="header"> <img src="images/logo.png" /> </div> <div id="sidebarLeft"><div class="padd"> <ul class="nav"> <li><a href="#">Hyperlink 1</a></li> <li><a href="#">Hyperlink 2</a></li> <li><a href="#">Hyperlink 3</a></li> <li><a href="#">Hyperlink 4</a></li> </ul> </div></div> <div id="content"><div class="padd"> <h1>Inhalt</h1> <p>mit Text und Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec</p> </div></div> <div id="sidebarRight"><div class="padd"> <p>Anmeldung</p> </div></div> <div id="footer"><div class="padd"> <p>Fußzeile</p> </div></div> </div> </body> </html>
Positioniert und gefärbt wird die Webseite in der CSS-Datei format.css, die im Unterverzeichnis css liegen sollte. Die drei Spalten werden dabei mit der Formatierung „float: left;“ erzeugt. Der zusätzliche <div class="padd"> setzt ein Padding im umgebenden <div> ohne das Layout zu zerstören (s. Boxmodell).
Natürlich ist diese Einteilung für das Joomla- Template nicht maßgeblich und kann beliebig an die eigenen Bedürfnisse angepaßt werden.
body { background-color: #f0f0f0; } #wrap { margin: 0 auto; background-color: lightblue; border:1px solid black; } #header { background-color: lightblue; } #sidebarLeft { float: left; width: 20%; background-color: aqua; } #content { float: left; width: 60%; background-color: silver; } #sidebarRight { float: left; width: 20%; background-color: aqua; } #footer { clear: both; background-color: lightblue; } .padd { padding: 1em; }
Perfektionieren sie erst diese Testdateien, bevor sie mit dem Erzeugen des eigentlichen Templates fortfahren.
Um die Datei template_test.html in ein Template umzuwandeln, müssen sie sie zunächst in index.php umkopieren. Wie sie bereits wissen, ist Joomla in PHP programmiert und entsprechend ist das Template auch in dieser Sprache geschrieben.
Fügen sie ganz oben in die Datei die folgenden, roten Zeilen ein und passen sie den HTML-Header entsprechend an:
<?php $app = JFactory::getApplication(); $doc = JFactory::getDocument(); $sitename = $app->getCfg('sitename'); $itemid = $app->input->getCmd('Itemid', ''); JHtml::_('bootstrap.framework'); JHtmlBootstrap::loadCss(); JHtmlBootstrap::loadCss($includeMaincss = false, $this->direction); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <jdoc:include type="head" /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="stylesheet" href="<?php echo $this->baseurl ?>/templates/<?php echo $this->template ?>/css/format.css" type="text/css" /> </head> …
Die ersten vier Zeilen holen Objekte und Variablen aus dem Joomla Framework (http://www.joomla-wiki.de/dokumentation/Joomla!_Framework). Die nächsten drei binden das Bootstrap (http://getbootstrap.com/) Framework ein. Beide werden für den Zugriff auf und die Formatierung des Templates benötigt.
<jdoc:include type="head" /> erweitert den HTML-Header durch Joomla-Definitionen und ihre Eingaben in den entsprechenden Konfigurationsfeldern (System / Konfiguration / Globale Metadaten). Damit bleibt der Header variabel anpassbar.
Nun müssen im Body noch die Joomla-Platzhalter statt des Beispieltextes eingefügt werden.
… <body> <div id="wrap"> <div id="header"> <a href="<?php echo $this->baseurl ?>"> <img src="<?php echo $this->baseurl ?>/templates/<?php echo $this->template ?>/images/logo.png" alt="Logo" /> </a> <jdoc:include type="modules" name="banner" style="xhtml" /> <jdoc:include type="modules" name="position-1" style="xhtml" /> </div> <div id="sidebarLeft"><div class="padd"> <jdoc:include type="modules" name="left" style="xhtml" /> <jdoc:include type="modules" name="position-8" style="xhtml" /> </div></div> <div id="content"><div class="padd"> <jdoc:include type="modules" name="breadcrumb" style="xhtml" /> <jdoc:include type="modules" name="position-3" style="xhtml" /> <jdoc:include type="component" /> <jdoc:include type="message" /> <jdoc:include type="modules" name="debug" /> </div></div> <div id="sidebarRight"><div class="padd"> <jdoc:include type="modules" name="position-7" style="xhtml" /> <jdoc:include type="module" name="search" style="xhtml" /> <jdoc:include type="modules" name="right" style="xhtml" /> </div></div> <div id="footer"><div class="padd"> <jdoc:include type="modules" name="footer" style="xhtml" /> </div></div> </div> </body> </html>
<jdoc:include type="component" /> ist der Platzhalter für den eigentlichen Inhalt wie Beiträge und/oder Kategorieübersichten. <jdoc:include type="module" name="search" style="xhtml" /> wird vom Suchmodul verwendet. <jdoc:include type="message" /> zeigt Systemnachrichten wie eine fehlgeschagene Anmeldung an. Und <jdoc:include type="modules" name="debug" /> gibt Fehlermeldungen aus, sofern dies in der Konfiguration eingeschaltet ist.
Alle anderen Platzhalter können für Modulpositionen verwendet werden. Die Positionen mit den Nummern sind zur Kompatibilität mit dem Protostar Template eingefügt.
Außerdem ist im Header eine Logo-Grafik (logo.png) eingebunden. Diese Datei liegt im Unterverzeichnis „images“. Konstrukte wie <?php echo $this->baseurl ?> (oder ->template) fügen an dieser Stelle den entsprechenden Basispfad (oder Template-Pfad) von Joomla ein.
Damit man sich eine Vorstellung vom Template machen kann, müssen zwei Vorschaubilder erstellt werden. Dazu machen sie eine Bildschirmkopie der Ausgabe des Template-Tests. Diese werden mit der Breite von 400 Pixeln als „template_preview.png“ und mit 200 Pixeln als „template_thumbnail.png“ gespeichert.
Damit ist das Template praktisch fertiggestellt. Es können noch die Dateien „component.php“ (Funktionserweiteerung), „error.php“ (Fehlerseite) und „offline.php“ (Offline-Seite) ergänzt und angepasst werden. Diese können sie aus dem Protostar sowie Standard Templates kopieren oder aus der Beispieldatei extrahieren.
Zuletzt legen sie die Datei templateDetails.xml an, welche der Joomla Installation die Information liefert.
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE install PUBLIC "-//Joomla! 2.5//DTD template 1.0//EN" "http://www.joomla.org/xml/dtd/1.6/template-install.dtd"> <extension version="2.5" type="template" client="site"> <name>Simplate</name> <creationDate>22. November 2013</creationDate> <description>Simple Template</description> **Christian Hartnick</author> <authorEmail>hilfe@hartnick.de</authorEmail> <authorUrl>http://hilfe.hartnick.de</authorUrl> <copyright>Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <version>2.5.0</version> <files> <filename>component.php</filename> <filename>error.php</filename> <filename>index.html</filename> <filename>index.php</filename> <filename>offline.php</filename> <filename>favicon.ico</filename> <filename>template_preview.png</filename> <filename>template_thumbnail.png</filename> <filename>templateDetails.xml</filename> <filename>css/format.css</filename> <filename>images/logo.png</filename> </files> <positions> <position>left</position> <position>breadcrumb</position> <position>search</position> <position>right</position> <position>footer</position> <position>banner</position> <position>position-1</position> <position>position-3</position> <position>position-7</position> <position>position-8</position> </positions> </extension>
Wie sie leicht erkennen können, werden hier alle wichtigen Informationen zum Template aufgeführt. Wenn hier Namen und Pfade nicht mit der Realität übereinstimmen, wird die Installation des Templates verweigert!
Zuletzt werden die Dateien und Verzeichnisse gezippt und können dann als Erweiterung installiert werden. (Achtung! Nicht das Verzeichnis sondern alle Dateien und Unterverzeichnisse zippen)
n.v.
Sollten sie noch nie vorher mit der Programmierung von Computern zutun gehabt haben, lesen sie das Kapitel Programme verstehen aus dem ersten Teil.
Zur Wiederholung hier der Aufbau eines Programms. Man unterscheidet einen Definitionsbereich und den eigentlichen Programmablauf. Der Definitionsbereich gibt an was alles benötigt wird und was im Programm vorhanden ist. Der Ablauf gibt dem Computer Anweisungen, die mit Bedingungen und Schleifen kontrolliert werden.
Zusätzlich müssen wir uns noch genauer mit dem DOM und mit Ajax Beispiel beschäftigen.
n.v.
Traditionell teilt man Computerprogramme in die zwei Bereiche Definitionen und Programmablauf. Der Definitionsteil bindet externe Funktionen ein und deklariert Variablen und Objekte. Oder traditionell gesagt: Was wird benutzt und was brauche ich.
Das entsprach in unserem Bauplan:
Wie man externe JS-Funktionen benutzt und in bestehende Projekte einbindet, steht schon in Kursteil I. Lesen sie dazu das Kapitel Dynamik.
In unserem Bauplan haben wir an dieser Stelle Werkzeuge und Materialien aufgeführt, die wir zusätzlich benötigen. Entsprechendes gilt auch für Programmiersprachen. Vieles müssen wir nicht neu erfinden, sondern finden es schon in externen Funktionen.
Innerhalb von JS ist es nicht vorgesehen, andere Funktionen (http://de.wikipedia.org/wiki/Funktion_(Programmierung)) und Bibliotheken (http://de.wikipedia.org/wiki/Programmbibliothek) einzubinden. Das unterscheidet es von den meisten anderen Programmiersprachen (http://de.wikipedia.org/wiki/Programmiersprache).
Möchten sie JS-Funktionen benutzen, so müssen sie diese im HTML-Header in der richtigen Reihenfolge einbinden. Eine Bibliothek (OpenStreetMap), die eine andere (Openlayers) benutzt, muss nach dieser im HTML-Quelltext eingebunden werden.
Als Beispiel dazu lesen sie Kapitel Anfahrt (OSM).
In unserem Bauplan hatten wir an dieser Stelle beschrieben, was dem Paket (Tisch) beiliegt. Übertragen auf unser Programm hatten wir das auf Konstrukte wie Variablen, Funktionen und Objekte, welche wir selbst schreiben. Das heißt, an dieser Stelle machen wir dem Browser (der JavaScript ausführt) diese Konstrukte bekannt.
Dabei müssen wir zwischen diesen Konstrukten klar unterscheiden: Einfache Variablen werden hier nur deklariert. Objekte und Arrays als Datenstrukturen müssen genauer definiert werden und haben deshalb ein eigenes (nachfolgendes) Kapitel.
Zuletzt müssen auch Funktion definiert sein, da sie aber nur Anweisungen zusammenfassen, besprechen wir sie erst im Ablauf.
In unserer Einführung hatten wir eine Variable mit einem Zettel verglichen. Auf den Zettel schrieben wir eine Zahl, um sie uns zu merken. Auch aus der Mathematik kennen wir Variablen (http://de.wikipedia.org/wiki/Variable_(Mathematik)), die Werte speichern. Im Gegensatz zur Mathematik können sie in JS-Variablen (http://de.wikipedia.org/wiki/Variable_(Programmierung)) auch Zeichenketten (http://de.wikipedia.org/wiki/Zeichenkette) und Wahrheitswerte (http://de.wikipedia.org/wiki/Wahrheitswert) speichern.
JS hat eine sehr laxe Syntax und kann Variablen einfach überall ohne Deklaration (http://de.wikipedia.org/wiki/Deklaration_(Programmierung)) verwenden. Eine Deklaration können sie sich wie eine Struktur auf dem Zettel (Variablenspeicher) vorstellen. Es wird auf dem Zettel vermerkt, wieviel Platz und welchen Typ (Zahl, Datum, …) eine Variable annehmen darf.
In anderen Programmiersprachen müssen Variablen immer erst deklariert werden. Dazu wird im Definitionsbereich Name und Typ (Wertebereich) der Variable bekannt gegeben. Auch JS erlaubt dies und wir sollten das auch verwenden, um einfacher Fehler zu finden.
Dazu kennt JS das Schlüsselwort (http://de.wikipedia.org/wiki/Schlüsselwort_(Programmierung)) var und den Aufzählungsoperator ,. var deklariert die Variable (sie wird dem Computer bekannt gemacht) und , erlaubt es mehrere Variablendeklarationen nacheinander zu schreiben.
var x = 1; var y = 2; var Vorname = "Christian", Nachname = "Hartnick";
Zur Bildung von Variabelnamen schlagen sie bitte im Anhang: JS-Bezeichner nach.
Die Werte, die in einer Variablen gespeichert werden, haben einen (Daten-)Typ (http://de.wikipedia.org/wiki/Datentyp). Diese Typen ergeben sich aus der Verwendung. So besteht der Unterschied zwischen einer Zahl und einem Text darin, dass man Zahlen berechnen kann. Texte dagegen, kann man durchsuchen, zerlegen und zusammensetzen. Am Typ erkennt der Computer also, wie er eine Variable intern speichern und verwenden soll.
Hinweis: Werte, die direkt im Quelltext stehen, bezeichnet man auch als Literale (http://de.wikipedia.org/wiki/Literal#Literale_in_Programmiersprachen).
JS konvertiert automatisch zwischen den verschieden Datentypen. Dass heißt, dass eine Zahl automatisch in eine Zeichenkette verwandelt wird, wenn sie diese als Zeichenkette benutzen. In den wenigen Fällen in denen eine automatische Konvertierung nicht funktioniert, müssen sie entsprechende Funktionen zur Konvertierung verwenden (Anhang: JS-Funktionen und Objekte).
JS kennt im Gegensatz zu anderen Sprachen nur Zahlen (keine Ganzzahlen (http://de.wikipedia.org/wiki/Ganzzahl), Gleitkomma (http://de.wikipedia.org/wiki/Gleitkommazahl), und so weiter).
Zahlen werden - wie im englischen üblich - mit dem Dezimalpunkt „.“ zwischen „Vorkomma“- und „Nachkomma“-Anteil getrennt. Zehnerpotenzen schreibt man mit trennenden „e“ oder „E“.
Beispiele:
Eine Zeichenkette repräsentiert Texte, also beliebige Kombinationen von Zeichen, Ziffern und Sonderzeichen. Zeichenketten werden in Hochkommas ('') oder in Hochkommata ("") eingeschlossen. Zeichenketten nennt man auf gut neudeutsch auch Strings.
Zu Zeichenketten beachten sie auch bitte den Anhang: JS Escape-Sequenzen.
Beispiel: "Das ist eine Zeichenkette!"
Ein Wahrheitswert kann nur die beiden Werte „wahr“ (true) oder „falsch“ (false) annehmen. Wahrheitswerte nennt man auf gut neudeutsch auch boolsche Werte. Man benötigt sie vor allem für Vergleiche. Das Ergebnis eines Vergleichs ist entweder „wahr“ oder „falsch“
In JS hat eine Funktion den Datentyp Function. Alle weiteren Daten (Objekte, Arrays, …) sind vom Typ Object. In der Praxis bedeutet das, man kann auch Funktionen und Objekte einer Variablen zuweisen. Dazu später mehr.
Anmerkung: Zuweisungen gehören eigentlich in den Programmablauf. Da JS aber schon während der Deklaration Zuweisungen erlaubt, sprechen wir sie kurz an. Später folgt dann die genauere Beschreibung.
Bei einer Zuweisung wird einer Variablen ein Wert mit dem Zuweisungsoperator = zugewiesen: x = 5 (x hat jetzt den Wert 5). Steht eine Variable nicht links vom =, repräsentiert die Variable ihren Wert: y = x + 5 (x steht für 5; y bekommt den Wert 10).
Variablen, denen noch kein Wert zugewiesen wurde, gelten als nicht initialisiert (http://de.wikipedia.org/wiki/Variable_(Programmierung)#Initialisierung). Allerdings sorgt die automatische Konvertierung von JS dafür, dass eine leere Variable bei Gebrauch als Zeichenkette den Wert "" (Leerstring), bei Gebrauch als Zahl den Wert 0 und bei Gebrauch als Wahrheitswert den Wert „falsch“ hat.
<script type="text/javascript"> var x = 5, y = x + 5; var Ergebnis = "x=5 und y=x+5. y="; alert(Ergebnis+y); </script>
Variablen die mit var deklariert wurden, sind innerhalb einer Funktion Funktion(){ Anweisungen; } immer lokal, dass heißt sie sind nur innerhalb dieses Blocks gültig. Ein weiterer guter Grund, Variablen immer zu deklarieren.
Genaueres zu Funktionen lesen sie in den nächsten Kapiteln.
Variablen die sie ohne Deklaration verwenden, sind immer global, also immer überall innerhab eines Dokuments verwendbar. So können sie schnell mit Variablen aus externen Skripten in Konflikt geraten.
Im internen Definitionsbereich deklarieren sie neben einfachen Variablen auch komplexe Datenstrukturen wie Arrays oder Objekte.
Komplexere Datenstrukturen kennen sie aus der Realität vor allem als Listen und Tabellen. Aber auch alle Strukturen wie Listen mit Unterpunkten können als Daten benutzt werden. Alle diese Konstrukte können sie in JS mit Arrays und Objekten nachbilden.
Datenstrukturen (http://de.wikipedia.org/wiki/Datenstruktur) (komplexe Variablen) sind in JS vor allen verschiedene Array-Typen aber auch Objektklassen.
Arrays können sie sich wie durchnumerierte Schubfächer vorstellen, in denen sie Werte gleichen Typs (Zahl, Zeichenkette) ablegen können.
Schubfach | Inhalt |
---|---|
1 | "Montag" |
2 | "Dienstag" |
3 | "Mittwoch" |
4 | "Donnerstag" |
5 | "Freitag" |
6 | "Samstag" |
7 | "Sonntag" |
In JS schreibt man das dann wie folgt:
var tage = new Array ("Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag");
Allerdings beginnt die automatische Numerierung (der Schubfächer) bei Null und nicht bei Eins. Der Zugriff auf ein Schubfach erfolgt mit tage[Schubfachnumer].
tage[3] → "Donnerstag"
Sie können allerdings Arrays nur über die Elementeanzahl (Bespiel → 10) auch ohne Angabe konkreter Elemente mit
var tage = new Array (10);
deklarieren oder sogar ganz ohne Anzahl mit
var tage = new Array ();
Mehrdimensionale Arrays erzeugen wir, in dem wir einen normalen Array-Element wieder ein Array zuweisen (allerdings meist in einer Schleife):
var Dim1 = new Array (4);
Dim1[0] = new Array (3);
Dim1[1] = new Array (3);
Dim1[2] = new Array (3);
Dim1[3] = new Array (3);
In diesem Fall haben wir also die Schubladen der Spalte 0-3 und der Reihe 0-2.
0 / 0 | 1 / 0 | 2 / 0 | 3 / 0 |
0 / 0 | 1 / 1 | 2 / 1 | 3 / 1 |
0 / 0 | 1 / 2 | 2 / 2 | 3 / 2 |
Der Zugriff erfolg dann mit a[x][y]
Anmerkung: Wenn sie jetzt an Excel und seine Organisation in Zellen denken, liegen sie sicherlich nicht verkehrt.
In normalen Arrays greifen sie auf die Elemente mit einen Zahlenindex (auch Schlüssel genannt) zu. So ein Schlüssel muss allerdings nicht unbedingt eine Zahl sein, sondern kann auch eine Zeichenkette sein. Dann spricht man vom assoziativen Array.
Da allerdings JS assoziative Arrays nur als Sonderform des Objekts benutzen kann, werden wir diese dort besprochen.
Objektklassen (auch Objekttypen oder einfach nur Klassen genannt) sind die Definitionen von Objekten (http://de.wikipedia.org/wiki/Objekt_(Programmierung)) (auch (Objekt-)Instanzen). Die Objektorientierte Programmierung (http://de.wikipedia.org/wiki/Objektorientierte_Programmierung) (OOP) versucht das Konzept (http://de.wikipedia.org/wiki/Konzept) eines Objektes der realen Welt in die Welt der Informatik zu übertragen.
Objektorientierung umfaßt:
function Klassenname() {
this.Attribut = "Wert";
this.Methode = MethodenFunktion;
}
function MethodenFunktion(Parameter1) {
Anweisungsblock;
}
var Objekt = new Klassenname();
Da Objekte mit ihren Methoden sich wie Funktionen verhalten, besprechen ich sie ausführlich weiter unten im „Ablauf“.
n.v.
Traditionell teilt man Computerprogramme in die zwei Bereiche Definitionen und Programmablauf. Der Programmablauf ist das eigentliche Programm - also die Funktionalität.
Das entsprach in unserem Bauplan:
Um eine einfachen Einstieg in eine Programmiersprache zu schaffen, nutzt man traditionell ein Hello-World-Programm (http://de.wikipedia.org/wiki/Hello_World). In diesem ist die einfachste Form eines lauffähigen Programms verwirklicht. Meist ist das eine Anweisung (http://de.wikipedia.org/wiki/Anweisung_(Programmierung)) die „Hallo Welt“ ausgibt.
Anmerkung: Javascript kennt zwei Arten von Kommentaren. // leitet einen Kommentar bis zum Zeilenende ein. /* und */ umschließen einen Kommentar.
<script type="text/javascript"> 'use strict'; // Ausgabe als Meldungsfenster alert('Hallo Welt'); // Ausgabe im HTML-Dokument document.write('Hallo Welt'); // Ausgabe in die Log-Datei (gibt es nicht bei allen Browsern) console.log('Hallo Welt'); </script>
Eine Anweisung ist also ein Befehl der den Computer anweist etwas zu tun („Hallo Welt“ ausgeben). In JS trennt man Anweisungen mit einem ; oder einem Zeilenumbruch. Allerdings sollte man übersichthalber, immer dem Semikolon den Vorzug geben.
Beispiele für Anweisungen:
An bestimmten Stellen innerhalb von JS muss man Anweisungen zu einem Block zusammenfassen. Für JS ist dann dieser Block eine Anweisung. Einen Anweisungsblock umschließen sie mit geschweiften Klammern {}.
Beispiele für Anweisungsblöcke finden sie in den folgenden Kapiteln unter Funktionen, Bedingungen und Schleifen.
Funktionen (http://de.wikipedia.org/wiki/Funktion_(Programmierung)) fassen Anweisungen zusammen, um diese dann (parametrisiert (http://de.wikipedia.org/wiki/Parameter_(Informatik))) immer wieder aufrufen zu können. Mit solchen Funktionen stellen Programmierer ihre JS-Anwendungen auch der Allgemeinheit zur Verfügung (s. Kursteile I und II).
Stellen sie sich eine parametrisierte Funktion wie eine Bohrmaschine vor, die sie je nach Aufsatz (Parameter) verschieden verwenden können. Bohrmaschine(5,Bohrer) wäre dann eine Bohrmaschine mit einem 5mm Bohrer und Bohrmaschine(10,Fräse) entspräche einer 1cm Fräse.
Eine weitere Besonderheit von JS ist, das nicht innerhalb einer Funktion stehender Code, immer sofort ausgeführt wird. Das ist allerdings nur in den seltesten Fällen erwünscht. Beachten sie dabei, das JS im <head> ausgeführt wird, wenn die Seite noch gar nicht vollständig geladen ist. Im <body> wird der Code an der Stelle ausgeführt, an der er steht. Wenn sie ihn erst ausführen wollen, wenn die Seite geladen wurde, gehört er in <body onload="">.
Funktionen heißen auf gut Deutsch auch Unterprogramme und das nicht zu unrecht. Eine Funktion stellt ein eigenes kleines Programm dar und deshalb sind beispielsweise alle innerhalb der Funktion deklarierten Variabeln lokal. Eine Funktion sollte also wie ein Programm immer mit einem Deklarationsteil beginnen.
Bevor man eine Funktion vewenden kann, muss sie (ähnlich wie Variablen) erst definiert werden. In JS ist es üblich alle Funktionen deshalb am Anfang des Quelltexts zu stellen. Wenn eine Funktion eine andere aufruft, muss sich die aufgerufene vor der aufrufenden befinden (sonst wäre sie ja noch nicht definiert!).
Eine Funktion wird formal wie folgt definiert:
function fnname(parameter1,…,parameterN){ Anweisungen; return Wert; }
Die Syntax (http://de.wikipedia.org/wiki/Syntax) setzt sich dabei wie folgt zusammen:
Hinweis: Eine Funktion kann auch fnname = function (parameter1,…,parameterN) { … } definiert werden.
Hinweis: Ein Schlüsseltwort ist ein reserviertes Wort (s. Anhang: JS reservierte Wörter) welches für die Programmiersprache eine besondere Bedeutung hat.
Zur Bildung von Funktions- und Parameternamen schlagen sie bitte im Anhang: JS-Bezeichner nach.
Wenn eine Funktion definiert ist, kann sie dann wie folgt aufgerufen werden:
fnname()
oder bei Funktionen mit Parametern:
fnname(wert1,…,wertN)
oder bei Funktionen mit Parametern und Rückgabewert:
rueckgabewert = fnname(wert1,…,wertN)
Die Syntax setzt sich dabei wie folgt zusammen:
<script type="text/javascript"> function Addiere(param1,param2){ return param1 + param2; } alert(Addiere(2,2)); </script>
Call by value (http://de.wikipedia.org/wiki/Call_by_value): Bei der Übergabe einer Variablen an eine Funktion benutzt diese den Wert der Variablen. Selbst wenn der Variablen innerhalb der Funktion ein neuer Wert zugewiesen wird. Außerhalb der Funktion ändert sich der Wert der Variablen deshalb nicht.
Wenn sie wieder an unseren Zettel denken, wird der Zettel innerhalb der Funktion abgeschrieben. Der ursprüngliche Zettel verändert sich so nicht.
Das ist die Standardübergabe für Zahlen, Zeichenketten und Wahrheitswerte.
Call by reference (http://de.wikipedia.org/wiki/Call_by_reference): Wenn sie Objekte als Ganzes übergeben, wird nur eine Referenz auf dieses übergeben. Alle Änderungen am Objekt gelten dann auch außerhalb der Funktion.
Hier wird also nicht innerhalb der Funktion ein neuer Zettel verwendet, sondern der ursprüngliche Zettel direkt.
Vordefinierte Funktionen finden sie im Anhang Anhang: JS-Funktionen und Objekte.
http://aktuell.de.selfhtml.org/artikel/javascript/organisation/#closures
Funktionen ohne Namen
Im Definitionsbereich haben wir schon eigene Objekte definiert. Nun wollen wir mit Objekten arbeiten.
Beispiel:
function Benutzer(vn,nn) { // Attribute this.Vorname = vn; this.Nachname = nn; this.Name = BenutzerName; } // Methoden function BenutzerName() { return (this.Vorname + " " + this.Nachname); } var Nutzer1 = new Benutzer("Christian","Hartnick"); var Nutzer2 = new Benutzer("Max","Mustermann");
Anmerkung: Das Schlüsselwort this ist immer eine Referenz auf das aktuelle Objekt. Das funktioniert zum Beispiel auch im HTML-Quelltext bei „on“-Ereignissen: <input type="button" value="OK" onclick="alert( this.form.Feld.value )">.
Der Zugriff auf Attribute und Methoden geschieht über den .-Operator bei Attributen
Nutzer2.Vorname = "Petra";
und Methoden
alert (Nutzer1.Name() + ", " + Nutzer2.Name());
, also im Endeffekt wie bei einer Variable und bei einer Funktion.
Zur Vereinfachung kann man Objektebezeichner auch mit dem Schlüsselwort with voraussetzen:
with (Nutzer2) { Vorname = "Petra"; Nachname = "Musterfrau"; alert (Name()); }
Die große Stärke von JS ist die hohe Anzahl vordefinierter Objektklassen. Diese können sie wie eine eingebaute Funktionsbibliothek einfach benutzen. Innerhalb dieser Objekte müssen wir zwischen JS-Objekten und Browser-Objekten unterscheiden.
s. Anhang: JS-Funktionen und Objekte
JS-Objekte stellen so etwas wie eine Bibliothek von Basisfunktionen dar. Sie haben mit ihnen Zugriff auf mathematische Funktionen und Datumsfunktionen. Außerdem haben alle Datentypen (Zahlen (Number), Zeichenketten (String), Wahrheitswerte (Boolean)) eigene Klassen. Außerdem gibt es eine Klasse für Reguläre Ausdrücke (http://de.wikipedia.org/wiki/Regulärer_Ausdruck), die wir hier allerdings nicht besprechen.
Das Datumsobjekt (Date) besitzt beispielsweise die Methoden:
<script type="text/javascript"> var Datum = new Date(); with (Datum) { alert(toLocaleString(getDate())); } </script>
Auch der Browser stellt viele Objekte bereit (damit sind sie aber auch abhängig von dem Browser und der Browserversion). Diese Objekte werden aus dem HTML-Quelltext und der Browserkonfiguration dynamisch erzeugt.
Auf diese Objekte werden wir im Kapitel DOM genauer eingehen.
<script type="text/javascript"> var Liste = new Array(); for (var Element in window) { Liste.push ( "(" + typeof (window[Element]) + ") " + Element + "\n"); } alert(Liste.sort().join("")); </script>
Bei assoziativen Arrays erfolgt der Zugriff auf einzelne Elemente mit einer Zeichenkette. Im Gegensatz zu anderen Programmiersprachen gibt es in JavaScript keine assoziativen Arrays. Man kann jedoch mit Objekten ein assoziatives Arrays grundlegend nachbauen.
Alternativ zum .-Operator funktioniert auch der Index-Operator (objekt["attribut"]) bei Objekten. So lassen sich über Attribute beliebige Schlüssel erzeugen.
Anmerkung: Ein solches "unechtes" assoziatives Array besitzt nicht die gewöhnlichen Methoden und Eigenschaften eines Arrays. So können sie nicht über length() die Anzahl der Elemente zu ermitteln. Die Elemente eines solchen „Arrays“ können sie nur über den Namen oder über eine for-in-Schleife ansprechen.
Zuweisungen (http://de.wikipedia.org/wiki/Zuweisung) von Variablen kennen wir schon. Allerdings kennt JS auch an anderen Stellen Zuweisungen, die wir teilweise schon implizit benutzt haben.
Überall wo etwas zugewiesen wird, wird auch ein Ausdruck (http://de.wikipedia.org/wiki/Ausdruck_(Programmierung)) erwartet, der einen Wert bereitstellt. Im einfachsten Fall ist das der Wert einer Variable oder der Rückgabewert einer Funktion.
Ausdrücke können aber viel komplexer sein. Sie können auch berechnet werden. Dafür existieren in JS verschiedene Operatoren (http://de.wikipedia.org/wiki/Operator_(Mathematik)) und Funktionen.
Mit Zuweisung (x = 3):
Bitoperatoren brauchen sie so gut wie nie. Sollten sie sie trotzdem interessieren lesen sie bitte über Bit-Operatoren (http://de.wikipedia.org/wiki/Bitweiser_Operator) in der Wikipedia nach.
Alle bisherigen Operatoren haben Zahlen manipuliert (Mathematik). Da sie Wahrheitswerte wie Zahlen (wahr=1, falsch=0) benutzen können, gelten sie auch für diese.
Zeichenketten haben einen einzigen Operator:
Wenn sie eine Zahl und eine Zeichenkette mit + verknüpfen, wird die Zahl automatisch in eine Zeichenkette gewandelt!
JS kennt einige vordefinierte Funktionen, um Variablen auszuwerten:
JS kennt mehrere Operatoren, um Werte miteinander zu vergleichen. Der Rückgabewert einer solchen Operation ist ein Wahrheitswert (wahr/falsch).
Beispiel:
<script type="text/javascript"> var Datum = new Date(); var vormittags = ( Datum.getHours() < 13 ); alert(vormittags); </script>
Achtung: Verwechseln sie nicht den Zuweisungsoperator = und den Vergleichsoperator ==. JS gibt keinen Fehler bei der falschen Verwendung aus, da eine Zuweisung immer „wahr“ ist!
Mit den logischen Verknüpfungen können sie mehrere Wahrheitswerte (also auch Vergleiche) miteinander verknüpfen. So können sie komplexe Vergleiche mit mehreren Variablen erschaffen.
a=true; b=false;
Beispiel:
<script type="text/javascript"> var Datum = new Date(); var tagsueber = ( (Datum.getHours() > 6) && (Datum.getHours() < 18) ); alert(tagsueber); </script>
Mit dem bedingten Operator können sie Vergleiche innerhalb eines Ausdrucks verwenden, da dieser einen Wert zurück gibt.
Beispiel:
<script type="text/javascript"> var Datum = new Date(); var Begruessung = "Guten " + ((Datum.getHours() > 17) ? " Abend." : " Tag."); alert(Begruessung); </script>
Auch den Programmablauf sollten sie mittels Vergleich beeinflussen können. Dazu existiert das if () {} else {} Konstrukt. Wenn (if) der Wahrheitswert des Vergleichs wahr ist, werden die Anweisungen direkt danach ausgeführt, sonst (else) die Anweisungen nach „else“. Allerdings ist der „else“-Teil optional, er muss also nicht geschrieben werden.
if (Wahrheitswert) { Anweisungen wenn wahr; } else { Anweisungen wenn falsch; }
Beispiel:
<script type="text/javascript"> var Datum = new Date(); var Stunde = Datum.getHours(); if (Stunde<17) { alert("Guten Tag"); } else { alert("Guten Abend"); } </script>
Wenn sie nicht nur zwischen „wahr“ und „falsch“ unterscheiden wollen, können sie auch per Schalter (switch) die Werte einer Variable auf bestimmte Fälle (case) prüfen. Allerdings ist ein Abbruch (break) dieser Prüfung jederzeit möglich und vielleicht auch nötig. Der Standardablauf (default) wird gewählt, wenn sonst kein Fall eingetreten ist.
switch (Eingabe) { case "1": alert("Sie haben „1“ gewählt!"); break; case "2": alert("Sie haben „2“ gewählt!"); break; case "3": alert("Sie haben „3“ gewählt!"); break; default: alert("Sie haben weder „1“ noch „2“ noch „3“ gewählt!"); break; }
Beispiel:
<script type="text/javascript"> var Datum = new Date(); var Stunde = Datum.getHours(); switch (Stunde) { case 4: case 5: case 6: case 7: alert("Guten Morgen!"); break; case 8: case 9: case 10: case 11: alert("Guten Vormittag!"); break; case 12: case 13: alert("Mahlzeit!"); break; case 14: case 15: case 16: case 17: alert("Guten Nachmittag!"); break; case 18: case 19: case 20: case 21: alert("Guten Abend!"); break; default: alert("Gute Nacht!"); break; } </script>
Zur bedingten Ausführung gehören auch sogenannte Eventhandler. Diese kennen wir schon aus HTML (<body onload="javascript:funktionsname()">. Die Funktion die diesem Handler zugewiesen wird, ruft erst dessen Ereignis auf.
windows.onload = fnname;
http://www.mediaevent.de/javascript/event-handler.html
try … catch(e) … throw
Schleifen führen Anweisungen mehrfach hintereinander aus, bis eine bestimmte Bedingung erfüllt ist.
Bei Zählschleifen ist die Bedingung ein Zähler oder eine Elementanzahl.
Die For-Schleife erwartet als Parameter einen Anfangsausdruck (Deklaration und Initialisierung der Zählervariable: var i=0), danach eine Bedingung (Test der Zählervariable: i<10) und zuletzt eine Veränderung (verändern der Zählervariable: i++). Im Gegensatz zu Funktionsparametern werden diese mit Semikolon getrennt.
Der Anfangsausdruck wird vor Schleifenbeginn ausgeführt. Dann werden die Anweisungen im Block ausgeführt. Die Bedingung wird nach jeden Schleifendurchlauf geprüft und die Veränderung zuletzt durchgeführt.
Anmerkung: Für Zählervariablen nimmt man gerne die Variablennamen „i“, „j“, „n“ und „m“.
for (Anfangsausdruck; Bedingung; Veränderung) { Anweisungen; }
Beispiel:
<script type="text/javascript"> var Schleife = "Durchlauf:"; for (var i=0; i<10; i++) { Schleife = Schleife + " " + i; } alert(Schleife); </script>
Die For-Schleife über eine Elementanzahl braucht keine Bedingung und Veränderung. Die Zählervariable durchläuft automatisch die Anzahl der Elemente des Objekts, das nach dem Schlüsselwort in angegeben ist.
Beachten sie, dass die Zählervariable numerische Werte enthält. Wollen sie beispielsweise die Elemente eines Arrays durchlaufen, greifen sie auf dessen Elemente mit [Zählervariable] zu.
for (var Element in Array/Objekt) { Anweisungen; }
Beispiel:
<script type="text/javascript"> var Tiere = new Array ('Hund','Katze','Maus'); var Schleife = "Tiere:"; for (var t in Tiere) { Schleife = Schleife + " " + Tiere[t]; } alert(Schleife); </script>
Schleifen laufen nicht nur über eine Anzahl, sondern können auch eine allgemeine Bedingung (Ereignis) als Abbruch haben. Dass heißt, es ist vorher noch nicht bekannt, wieviele Durchläufe eine Schleife hat.
Diese Art von Schleifen können anfangs- oder endbedingt sein.
Bei anfangsbedingten Schleifen wird die Schleifenbedingung vor dem ersten Durchlauf der Schleife geprüft. So kann es sein, dass die Schleife auch gar nicht ausgeführt wird. Diese Schleifenart benötigt nur eine Bedingung und einen Anweisungsteil:
while (Wahrheitswert) { Anweisungen; }
Beispiel:
<script type="text/javascript"> var Anzahl = 0; while (confirm("Nochmal? (" + Anzahl + ")")) { Anzahl++; } </script>
Bei endbedingten Schleifen wird die Schleifenbedingung nach dem ersten Durchlauf der Schleife geprüft. So wird die Schleife immer mindens einmal ausgeführt. Diese Schleifenart benötigt nur eine Bedingung und einen Anweisungsteil:
do { Anweisungen; } while (Wahrheitswert);
Beispiel:
<script type="text/javascript"> var Anzahl = 0; do { Anzahl++; } while (confirm("Nochmal? (" + Anzahl + ")")) </script>
Um noch flexibler innerhalb von Schleifen auf Bedingungen eingehen zu können, können sie mit break und continue den Schleifenablauf noch besser kontrollieren.
Beispiel:
<script type="text/javascript"> var Anzahl = 0; do { if (!confirm("Nochmal? (" + Anzahl + ")")) break; continue; Anzahl++; } while (true) </script>
n.v.
Document Object Model
http://aktuell.de.selfhtml.org/artikel/javascript/organisation/#schichtenmodell
GetElementById
appendChild(dasNeueObjekt)
insertBefore(dasNeueObjekt, BezugsObjekt)
n.v.
Hier im Anhang finden sie Fachbegriffe und Referenzen zu HTML, CSS und JavaScript.
n.v.
Hier im Anhang finden sie Fachbegriffe und Referenzen.
Dieses Buch ist im Rahmen meiner Kurse „Webseiten gestalten“ an der VHS Aschaffenburg und der KVHS Oranienburg entstanden.
Es enthält im ersten Teil ein durchgehendes Beispiel von einer (web-)Visitenkarte bis zu einer Webpräsenz (http://de.wikipedia.org/wiki/Webpräsenz). Im zweiten und dritten Teil (Fortgeschrittenen und Profi-Kurs) werden dann neue Techniken sowie Tipps und Tricks eingeführt.
Kursteil 4 beschäftigt sich mit Content Management Systemen (Inhalteverwaltung) und der letzte Teil mit der JavaScript-Programmierung.
Dieses Buch steht unter der Creative Commons-Lizenz (http://de.wikipedia.org/wiki/Creative_Commons) CC-BY-NC-SA (http://de.wikipedia.org/wiki/Creative_Commons#Die_Rechtemodule)
Dieses Buch verwendet verschiedene Kennzeichnung, die dem Leser das Leben vereinfachen sollen:
Ein ganz wichtiges Wort. Und ein Stück HTML-Code, CSS-Code und JavaScript-Code. Neu eingeführte Syntax (http://de.wikipedia.org/wiki/Syntax) sieht so aus: HTML-Code, CSS-Code und JS-Code.
Übung:
Übungen geben Arbeitsanweisungen, die der Leser nachvollziehen soll.
So ist ein Quelltext gekennzeichnet. HTML: <tag attribut="Wert"> Text </html-tag> CSS: selektor {color:blue;} JavaScript: reserviertes Wort, Quellcode, Wert, Bezeichner
Kommando | Beschreibung |
---|---|
Alt+Tab | Anwendung umschalten |
Alt+F4 | Anwendung schließen |
Kommando | Beschreibung |
---|---|
Strg+O | Datei öffnen |
Strg+S | Datei speichern |
Strg+Shift+S | Datei speichern unter neuen Namen |
Strg+A | Alles markieren |
Strg+X | Markierten Text in Zwischenablage ausschneiden |
Strg+C | Markierten Text in Zwischenablage kopieren |
Strg+V | Zwischenablage einfügen |
Kommando | Beschreibung |
---|---|
Strg+O | Datei öffnen |
Strg+' | Link im neuen Tab öffnen |
Strg+U | Seitenquelltext im neuen Fenster anzeigen |
Shift+Alt+U | Seitenquelltext im neuen Tab anzeigen (mit Web Developer Erweiterung) |
Shift+Alt+C | CSS-Text im neuen Tab anzeigen (mit Web Developer Erweiterung) |
Strg+T | Neuen Tab öffnen |
Strg+W | Aktuellen Tab schließen |
Strg+A | Alles markieren |
Strg+C | Markierten Text in Zwischenablage kopieren |
Strg+V | Zwischenablage einfügen |
Strg++ | Darstellung vergrößern |
Strg+- | Darstellung verkleinern |
Strg+0 | Darstellung auf Standard |
Kommando | Beschreibung |
---|---|
Strg+A | Alles markieren |
Strg+X | Markierte Datei in Zwischenablage ausschneiden |
Strg+C | Markierte Datei in Zwischenablage kopieren |
Strg+V | Zwischenablage einfügen |
Von Dateiversion zu Dateiversion sind die Änderungen mit gelben Hintergrund gekennzeichnet. Sobald externes CSS / JS dazukommt, ist die jeweilige Datei hinten angehängt.
Christian Hartnick Dipl.-Wirtsch.-Inf. Freier Berater Sandweg 10 16727 Oberkrämer OT Bärenklau ----------------------------- - Telefon 03304 5081620 - Fax 03304 5081621 - Mobil 01517 5081620 Email hilfe@hartnick.de Web http://hilfe.hartnick.de
Christian Hartnick Dipl.-Wirtsch.-Inf. Freier Berater Sandweg 10 16727 Oberkrämer OT Bärenklau ----------------------------- - Telefon 03304 5081620 - Fax 03304 5081621 - Mobil 01517 5081620 Email hilfe@hartnick.de Web http://hilfe.hartnick.de
<p> Christian Hartnick Dipl.-Wirtsch.-Inf. Freier Berater </p> <p> Sandweg 10 16727 Oberkrämer OT Bärenklau </p> ----------------------------- <p> - Telefon 03304 5081620 - Fax 03304 5081621 - Mobil 01517 5081620 </p> <p> Email hilfe@hartnick.de Web http://hilfe.hartnick.de </p>
<p> Christian Hartnick <br /> Dipl.-Wirtsch.-Inf. <br /> Freier Berater </p> <p> Sandweg 10 <br /> 16727 Oberkrämer OT Bärenklau </p> ----------------------------- <p> - Telefon 03304 5081620 <br /> - Fax 03304 5081621 <br /> - Mobil 01517 5081620 </p> <p> Email hilfe@hartnick.de <br /> Web http://hilfe.hartnick.de </p>
<p> Christian Hartnick <br /> Dipl.-Wirtsch.-Inf. <br /> Freier Berater </p> <p> Sandweg 10 <br /> 16727 Oberkrämer OT Bärenklau </p> ----------------------------- <p> - Telefon <a href="tel:033045081620">03304 5081620</a> <br /> - Fax <a href="fax:033045081621">03304 5081621</a> <br /> - Mobil <a href="tel:015175081620">01517 5081620</a> </p> <p> Email <a href="mailto:hilfe@hartnick.de">hilfe@hartnick.de</a> <br /> Web <a href="http://hilfe.hartnick.de">hilfe.hartnick.de</a> </p>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> <title>06 Meine Visitenkarte (Zwischenstand)</title> </head> <body> <p> Christian Hartnick <br /> Dipl.-Wirtsch.-Inf. <br /> Freier Berater </p> <p> Sandweg 10 <br /> 16727 Oberkrämer OT Bärenklau </p> ----------------------------- <p> - Telefon <a href="tel:033045081620">03304 5081620</a> <br /> - Fax <a href="fax:033045081621">03304 5081621</a> <br /> - Mobil <a href="tel:015175081620">01517 5081620</a> </p> <p> Email <a href="mailto:hilfe@hartnick.de">hilfe@hartnick.de</a> <br /> Web <a href="http://hilfe.hartnick.de">hilfe.hartnick.de</a> </p> </body> </html>
<!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> <title>07 Visitenkarte (Kommentar)</title> </head> <!-- Dies ist ein Kommentar --> <!-- Kommentare sind Anmerkungen zum HTML-Text, die nicht im Browser erscheinen --> <!-- Mit Kommentaren können sie Tags auskommentieren: <p> erscheint nicht </p> --> <body> <p> Christian Hartnick <br /> Dipl.-Wirtsch.-Inf. <br /> Freier Berater </p> <p> Sandweg 10 <br /> 16727 Oberkrämer OT Bärenklau ----------------------------- <p> - Telefon <a href="tel:033045081620">03304 5081620</a> <br /> - Fax <a href="fax:033045081621">03304 5081621</a> <br /> - Mobil <a href="tel:015175081620">01517 5081620</a> </p> <p> Email <a href="mailto:hilfe@hartnick.de">hilfe@hartnick.de</a> <br /> Web <a href="http://hilfe.hartnick.de">hilfe.hartnick.de</a> </p> </body> </html>
<!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> <title>08 Meine Visitenkarte (formatiert)</title> </head> <body> <p> <b>Christian Hartnick</b><br /> <span style="font-weight:bold;">Dipl.-Wirtsch.-Inf.</span><br /> Freier Berater </p> <address> Sandweg 10 <br /> 16727 Oberkrämer OT Bärenklau </address> <hr style="width:300px; margin-left:0;" /> <ul> <li>Telefon <a href="tel:033045081620">03304 5081620</a></li> <li>Fax <a href="fax:033045081621">03304 5081621</a></li> <li>Mobil <a href="tel:015175081620">01517 5081620</a></li> </ul> <p> Email <a href="mailto:hilfe@hartnick.de">hilfe@hartnick.de</a><br /> Web <a href="http://hilfe.hartnick.de">hilfe.hartnick.de</a> </p> </body> </html>
<!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> <title>09 Meine Visitenkarte (css inline)</title> <style type="text/css"> #Name { font-weight: bold; } #Grad { font-size: small; } .Beruf { font-style: italic; } </style> </head> <body> <p> <span id="Name">Christian Hartnick</span><br /> <span id="Grad">Dipl.-Wirtsch.-Inf.</span><br /> <span class="Beruf">Freier Berater</span> <address> Sandweg 10 <br /> 16727 Oberkrämer OT Bärenklau </address> <hr style="width:300px; margin-left:0;" /> <ul> <li>Telefon <a href="tel:033045081620">03304 5081620</a></li> <li>Fax <a href="fax:033045081621">03304 5081621</a></li> <li>Mobil <a href="tel:015175081620">01517 5081620</a></li> </ul> <p> Email <a href="mailto:hilfe@hartnick.de">hilfe@hartnick.de</a><br /> Web <a href="http://hilfe.hartnick.de">hilfe.hartnick.de</a> </p> </body> </html>
<!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> <title>10 Meine Visitenkarte (css datei)</title> <link rel="stylesheet" type="text/css" href="10_visitenkarte.css" /> <style type="text/css"> address { font-style:normal; } </style> </head> <body> <p> <span id="Name">Christian Hartnick</span><br /> <span id="Grad">Dipl.-Wirtsch.-Inf.</span><br /> <span class="Beruf">Freier Berater</span> <address> Sandweg 10 <br /> 16727 Oberkrämer OT Bärenklau </address> <hr /> <ul> <li><span class="label">Telefon</span> <a href="tel:033045081620">03304 5081620</a></li> <li><span class="label">Fax</span> <a href="fax:033045081621">03304 5081621</a></li> <li><span class="label">Mobil</span> <a href="tel:015175081620">01517 5081620</a></li> </ul> <p> <span class="label">Email</span> <a href="mailto:hilfe@hartnick.de">hilfe@hartnick.de</a><br /> <span class="label">Web</span> <a href="http://hilfe.hartnick.de">hilfe.hartnick.de</a> </p> </body> </html>
/* Formatvorlage "Name" für Tag mit Attribut id="Name" */ #Name { font-weight:bold; } /* Formatvorlage "Grad" für Tag mit Attribut id="Grad" */ #Grad { font-size: small; } /* Formatvorlage "Beruf" für Tag mit Attribut class="Beruf" */ .Beruf { font-style: italic; } /* Formatvorlage für das Tag <a> */ a { text-decoration:none; color:WindowText;} /* Formatvorlage für den Platz vor dem Tag <a> */ a:before { content:"→"; color: blue; } /* Formatvorlage für das Tag <a> wenn die Maus darüber ist */ a:hover { color: blue; } /* Formatvorlage für Tag <hr> */ hr { width: 300px; margin-left: 0; } /* Einheitliche Breite für Label (Bezeichner) */ .label { display: inline-block; width: 3em; }
<!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> <title>11 Meine Visitenkarte (js inline)</title> <link rel="stylesheet" type="text/css" href="visitenkarte.css" /> </head> <body> <p> <span id="Name">Christian Hartnick</span><br /> <span id="Grad">Dipl.-Wirtsch.-Inf.</span><br /> <span class="Beruf">Freier Berater</span> <address> Sandweg 10 <br /> 16727 Oberkrämer OT Bärenklau </address> <hr /> <ul> <li><span class="label">Telefon</span> <a href="tel:033045081620">03304 5081620</a></li> <li><span class="label">Fax</span> <a href="fax:033045081621">03304 5081621</a></li> <li><span class="label">Mobil</span> <a href="tel:015175081620">01517 5081620</a></li> </ul> <p> <span class="label">Email</span> <script type="text/javascript"> var name = "hilfe"; var domain = "hartnick"; var tld = "de"; document.write('\n<a href=\"mailto:' + name + '@' + domain + '.' +tld + '\">' + name + '@' + domain + '.' +tld + '<\/a>'); </script> <noscript> hilfe_at_hartnick_._de </noscript><br /> <span class="label">Web</span> <a href="http://hilfe.hartnick.de">hilfe.hartnick.de</a> </p> </body> </html>
<!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> <title>12 Meine Visitenkarte (js extern)</title> <link rel="stylesheet" type="text/css" href="visitenkarte.css" /> <script src="12_visitenkarte.js" type="text/javascript"></script> </head> <body> <p> <span id="Name">Christian Hartnick</span><br /> <span id="Grad">Dipl.-Wirtsch.-Inf.</span><br /> <span class="Beruf">Freier Berater</span> <address> Sandweg 10 <br /> 16727 Oberkrämer OT Bärenklau </address> <hr /> <ul> <li><span class="label">Telefon</span> <a href="tel:033045081620">03304 5081620</a></li> <li><span class="label">Fax</span> <a href="fax:033045081621">03304 5081621</a></li> <li><span class="label">Mobil</span> <a href="tel:015175081620">01517 5081620</a></li> </ul> <p> <span class="label">Email</span> <script type="text/javascript"> insertEmail("hilfe","hartnick","de") </script> <noscript> hilfe_at_hartnick_._de </noscript><br /> <span class="label">Web</span> <a href="http://hilfe.hartnick.de">hilfe.hartnick.de</a> </p> </body> </html>
// insertEmail fügt als Spamschutz an der Aufrufstelle einen Email-Adress-Link (name@domain.tld) ein function insertEmail(name,domain,tld) { document.write('\n<a href=\"mailto:'+name+'@'+domain+'.'+tld+'\">'+name+'@'+domain+'.'+tld+'</a>'); }
<!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> <title>13 Meine Visitenkarte (js dom)</title> <link rel="stylesheet" type="text/css" href="visitenkarte.css" /> <script src="13_visitenkarte.js" type="text/javascript"></script> </head> <body onload="convertEmail('Email')"> <p> <span id="Name">Christian Hartnick</span><br /> <span id="Grad">Dipl.-Wirtsch.-Inf.</span><br /> <span class="Beruf">Freier Berater</span> <address> Sandweg 10 <br /> 16727 Oberkrämer OT Bärenklau </address> <hr /> <ul> <li><span class="label">Telefon</span> <a href="tel:033045081620">03304 5081620</a></li> <li><span class="label">Fax</span> <a href="fax:033045081621">03304 5081621</a></li> <li><span class="label">Mobil</span> <a href="tel:015175081620">01517 5081620</a></li> </ul> <p> <span class="label">Email</span> <a class="Email" href="mailto:em1_at_domain_dot_de">em1_at_domain_dot_de</a><br /> <span class="label">Email</span> <a class="Email" href="mailto:em2_at_domain_dot_de">em2_at_domain_dot_de</a><br /> <span class="label">Web</span> <a href="http://hilfe.hartnick.de">hilfe.hartnick.de</a> </p> </body> </html>
// convertEmail(Klasse) konvertiert bestehende Email-Links mit dem Attribut <a class="Klasse" ...> // Aufbau des href: <a href="mailto:name_at_domain_dot_tld">beliebiger Text</a> function convertEmail(ClassName) { var adresse,name,domain,tld,temp; var anker; var i; i = 0; while (document.getElementsByClassName(ClassName)[i]) { anker = document.getElementsByClassName(ClassName)[i]; adresse = anker.href; temp = adresse.split("_at_"); name = temp[0]; domain = temp[1]; temp = domain.split("_dot_"); domain = temp[0]; tld = temp[1]; adresse = name + "@" + domain + "." + tld; anker.href = adresse; anker.firstChild.nodeValue = adresse.substr(7,255); i++; } }
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="de-de"> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> <meta content="author" name="Fügen sie hier ihren Namen ein" /> <title>Christian Hartnick - Kontakt</title> <link rel="stylesheet" type="text/css" href="css/layout.css" /> <style type="text/css"> /* Interne CSS-Formatvorlagen */ </style> <script type="text/javascript" src="js/funktionen.js"></script> </head> <body onload="convertEmail('Email')"> <div id="KopfDiv"> <iframe src="iframes/kopf.html" frameborder="0" scrolling="no" width="100%" height="100%"> <h1 class="Kopf">Fügen sie ihren Seitentitel hier ein</h1> </iframe> </div> <div id="MenuDiv"> <iframe src="iframes/menu.html" frameborder="0" scrolling="no" width="100%" height="100%"> <a class="Menue" href="iframes/menu.html">Sitemap</a> </iframe> </div> <div id="InhaltDiv"> <p> <span id="Name">Christian Hartnick</span> <br /> <span id="Grad">Dipl.-Wirtsch.-Inf.</span><br /> <span class="Beruf">Freier Berater</span> </p> <address> Sandweg 10 <br /> 16727 Oberkrämer OT Bärenklau </address> <hr /> <ul> <li> <span class="label">Telefon</span> <a href="tel:033045081620">03304 5081620</a> </li> <li> <span class="label">Fax</span> <a href="fax:033045081621">03304 5081621</a> </li> <li> <span class="label">Mobil</span> <a href="tel:015175081620">01517 5081620</a> </li> </ul> <p> <!-- Alle Email-Links sind mit class="Email" zum Konvertieren gekennzeichnet! --> <span class="label">Email</span> <a class="Email" href="mailto:hilfe_at_hartnick_dot_de">hilfe_at_hartnick_dot_de</a><br /> <span class="label">Email</span> <a class="Email" href="mailto:christian_at_hartnick_dot_de">christian_at_hartnick_dot_de</a><br /> <span class="label">Web</span> <a href="http://hilfe.hartnick.de">hilfe.hartnick.de</a> </p> </div> </body> </html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="de-de"> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> <title>Kopf</title> <link rel="stylesheet" type="text/css" href="../css/layout.css" /> </head> <body class="KopfFrame"> <p class="Kopf"> <a href="http://hilfe.hartnick.de" target="_top"> <img class="Kopf" src="../bilder/logo.png" alt="logo hilfe.hartnick.de" /> </a> </p> </body> </html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="de-de"> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> <title>Sitemap</title> <link rel="stylesheet" type="text/css" href="../css/layout.css" /> </head> <body class="MenuFrame"> <h1 class="Menu">Menü</h1> <ul class="Menu"> <li class="Menu"><a class="Menu" href="../index.html" target="_top">Start</a> <ul class="Menu"> <li class="Menu"><a class="Menu" href="../kontakt.html" target="_top">Kontakt</a></li> <li class="Menu"><a class="Menu" href="../impressum.html" target="_top">Impressum</a></li> </ul> </li> <li class="Menu"><a class="Menu" href="http://de.selfhtml.org" target="_top">SelfHTML</a></li> <li class="Menu"><a class="Menu" href="http://www.drweb.de" target="_top">Dr. Web</a></li> </ul> </body> </html>
/* Allgemeine Definitionen */ body { background-color: #000040; font-family: "Arial",Helvetica,sans-serif;} h1 { font-size: x-large; color: darkblue; } h2 { font-size: large; color: darkblue; } p { font-size: medium; } #Name { font-weight: bold; } #Grad { font-size: small; } .Beruf { font-style: italic; } a { text-decoration: none; color: WindowText;} a:hover { color: blue; } hr { width: 300px; margin-left: 0; } address { font-style: normal; } .label { display: inline-block; width: 3.5em; } /* Definitionen für den Kopf der Webpräsenz */ /* Hintergrundfarbe hier und bei .KopfFrame muss gleich sein! */ #KopfDiv { background-color: #88f; border: 0; padding: 2pt; position: absolute; left: 2%; top: 0px; width: 95%; height: 100%; z-index: 1; } .KopfFrame{background-color: #88f;} p.Kopf { text-align:center; } /* Definitionen für das Menü der Webpräsenz */ /* Hintergrundfarbe hier und bei .MenueFrame muss gleich sein! */ #MenuDiv { background-color: #44f; border: 0; padding: 2pt; position: fixed; left: 0px; top: 95px; width: 200px; height: 300px; z-index: 2; } .MenuFrame{background-color: #44f; overflow: hidden; } ul.Menu { padding-left: .5em; } li.Menu { list-style: none; margin: 3px } a.Menu { display: inline-block; width: 7em; padding: 1px; padding-left: 1em; border: 1px solid gray; background-color: silver; } /* Definitionen für den Inhalt der Webpräsenz */ #InhaltDiv { background-color: #eee; border: .5em ridge #fff; padding: 1em; position: absolute; left: 210px; top: 95px; min-width: 50%; min-height: 50%; z-index: 3; }
HTML-Syntax (Satzlehre/Rechtschreibung) steht stets in einer HTML-Datei. Entsprechend steht CSS- und JS-Syntax in den entsprechenden Dateien. Allerdings steht CSS-Syntax auch zwischen <style type="text/css"> und </style> sowie innerhalb des style="" Attributs. Entsprechend steht JS-Syntax auch zwischen <script> und </script> sowie als Referenz mit dem Schema „javascript:“ (<a href="javascript:">) und nach HTML-Ereignissen wie onload="".
Konstrukt | HTML | CSS | JavaScript |
---|---|---|---|
Anweisung | <leerestag /> | @import | Anweisung; |
Funktion | <starttag> </endtag> | Selektor { } | Funktion () { } |
Zuweisung | attribut="wert" | eigenschaft: wert; | variable = wert; |
Bedingung | onload="wert" | @media print {} | if (Bed) { Anw; } |
Schleife | * | for (Bed) { Anw; } | |
Kommentar | <!-- Kommentar --> | /* Kommentar */ // bis Zeilenende | /* Kommentar */ // bis Zeilenende |
HTML | CSS | JavaScript |
---|---|---|
<!DOCTYPE html> <html> <head> <meta http-equiv="content-type" *content="text/html; charset=UTF-8" /> <title>Meine Visitenkarte</title> <script src="funktionen.js" type="text/javascript"></script> <link rel="stylesheet" type="text/css" href="vorlagen.css" /> <style type="text/css"> address { font-style:normal; } </style> </head> <body> <p> <span id="Name">Christian Hartnick</span><br /> <span id="Grad">Dipl.-Wirtsch.-Inf.</span><br /> <span class="Kursiv">Freier Berater</span> <address> Sandweg 10 <br /> 16727 Oberkrämer OT Bärenklau </address> <p> <script type="text/javascript"> insertEmail("hilfe","hartnick","de") </script> <noscript> hilfe_at_hartnick_._de </noscript><br /> <a href="http://hilfe.hartnick.de"> hilfe.hartnick.de </a> </p> </body> </html> <!DOCTYPE html> <html> <head> <meta http-equiv="content-type" *content="text/html; charset=UTF-8" /> <title>Impressum</title> <script src="funktionen.js" type="text/javascript"></script> <link rel="stylesheet" type="text/css" href="vorlagen.css" /> </head> <body> <p> … </p> </body> </html> <!DOCTYPE html> <html> <head> <meta http-equiv="content-type" *content="text/html; charset=UTF-8" /> <title>Bildergallerie</title> <script src="funktionen.js" type="text/javascript"></script> <script src="gallerie.js" type="text/javascript"></script> <link rel="stylesheet" type="text/css" href="vorlagen.css" /> <link rel="stylesheet" type="text/css" href="gallerie.css" /> </head> <body> <p> … </p> </body> </html> |
#Name { font-weight:bold; } #Grad { font-weight:lighter; } .Kursiv { font-style:italic; } a { text-decoration:none; color:WindowText;} a:before { content:"\21d2"; color:#0000ff; } a:hover { color:#0000ff; } … |
function insertEmail(name,domain,tld) { document.write( '\n<a href=\"mailto:' +name+'@'+domain+'.'+tld+'\">' +name+'@'+domain+'.'+tld +'</a>'); } … |
s. Software
Da wir Firefox benutzen, ist für uns FireFTP als Addon am besten geeignet.
FTP-Clients benutzen sie wie einen lokalen Dateimanager (Browser). Unter Windows ist das der Explorer, unter Mac der Finder und unter Linux existieren diverse wie Nautilus, Dolfin, PCManFM, Thunar usw.
Meist ist ein FTP-Client zweigeteilt. Links sind die lokalen Dateien und rechts die entfernten (auf dem FTP-/Webserver). Um eine Verbindung zum FTP-Server zu bekommen, müssen wir uns auf diesem anmelden. Dazu bekommen wir von unserem Provider Zugangsdaten.
Sobald wir angemeldet sind, können wir die Dateien und Verzeichnisse einer Webpräsenz ganz normal hin- und herkopieren.
n.v.
Hier im Anhang finden sie Fachbegriffe und Referenzen zu HTML.
Die meisten formatierenden Tags sind in der Strict-Variante von HTML 4 verboten. Manche bekommen in HTML 5 eine neue Semantik.
Alle Entities lassen sich auch &Dezimalwert; schreiben.
Referenz: HTML Zeichenreferenz (http://wiki.selfhtml.org/wiki/Referenz:HTML/Zeichenreferenz) im selfHTML Wiki.
Z. | Dez. | Hex. | Entity |
---|---|---|---|
0-8 | 00-08 | nicht belegt | |
09 | 09 | Tabulator | |
10 | 0A | Zeilenumbruch | |
11-31 | 0B-1F | nicht belegt | |
„leer“ | 32 | 20 | &sp; |
! | 33 | 21 | ! |
" | 34 | 22 | " |
# | 35 | 23 | # |
$ | 36 | 24 | $ |
% | 37 | 25 | % |
& | 38 | 26 | & |
' | 39 | 27 | ' |
( | 40 | 28 | ( |
) | 41 | 29 | ) |
* | 42 | 2A | * |
+ | 43 | 2B | + |
, | 44 | 2C | , |
- | 45 | 2D | ‐ − |
. | 46 | 2E | . |
/ | 47 | 2F | / |
0-9 | 48-57 | 30-39 | Ziffern |
: | 58 | 3A | : |
; | 59 | 3B | ; |
< | 60 | 3C | < |
= | 61 | 3D | = |
> | 62 | 3E | > |
? | 63 | 3F | ? |
@ | 64 | 40 | @ |
A-Z | 65-90 | 41-5A | Großbuchstaben |
[ | 91 | 5B | [ |
\ | 92 | 5C | \ |
] | 93 | 5D | ] |
^ | 94 | 5E | ˆ |
_ | 95 | 5F | _ ― |
` | 96 | 60 | ` |
a-z | 97-122 | 61-7A | Kleinbuchstaben |
{ | 123 | 7B | { |
| | 124 | 7C | | |
} | 125 | 7D | } |
~ | 126 | 7E | ˜ |
127 | 7F | nicht belegt |
Z. | Dez. | Hex. | Entity |
---|---|---|---|
€ | 128 | 80 | € |
129 | 81 | nicht belegt | |
‚ | 130 | 82 | ‚ |
ƒ | 131 | 83 | ƒ |
" | 132 | 84 | „ |
… | 133 | 85 | … &ldots; |
† | 134 | 86 | † |
‡ | 135 | 87 | ‡ |
ˆ | 136 | 88 | ˆ |
‰ | 137 | 89 | ‰ |
Š | 138 | 8A | Š |
‹ | 139 | 8B | ‹ |
Œ | 140 | 8C | Œ |
141 | 8D | nicht belegt | |
Ž | 142 | 8E | Ž |
143 | 8F | nicht belegt | |
144 | 90 | nicht belegt | |
‘ | 145 | 91 | ‘ ’ |
’ | 146 | 92 | ’ |
" | 147 | 93 | “ ” |
” | 148 | 94 | ” |
• | 149 | 95 | • |
– | 150 | 96 | – |
— | 151 | 97 | — |
˜ | 152 | 98 | ˜ |
™ | 153 | 99 | ™ |
š | 154 | 9A | š |
› | 155 | 9B | › |
œ | 156 | 9C | œ |
157 | 9D | nicht belegt | |
ž | 158 | 9E | ž |
Ÿ | 159 | 9F | Ÿ |
160 | A0 | | |
¡ | 161 | A1 | ¡ |
¢ | 162 | A2 | ¢ |
£ | 163 | A3 | £ |
¤ | 164 | A4 | ¤ |
¥ | 165 | A5 | ¥ |
¦ | 166 | A6 | ¦ &brkbar; |
§ | 167 | A7 | § |
¨ | 168 | A8 | ¨ ¨ |
© | 169 | A9 | © |
ª | 170 | AA | ª |
« | 171 | AB | « |
¬ | 172 | AC | ¬ |
| 173 | AD | ­ |
® | 174 | AE | ® |
¯ | 175 | AF | ¯ &hibar; |
° | 176 | B0 | ° |
± | 177 | B1 | ± |
² | 178 | B2 | ² |
³ | 179 | B3 | ³ |
´ | 180 | B4 | ´ |
µ | 181 | B5 | µ |
¶ | 182 | B6 | ¶ |
· | 183 | B7 | · |
¸ | 184 | B8 | &cidil; |
¹ | 185 | B9 | ¹ |
º | 186 | BA | º |
» | 187 | BB | » |
¼ | 188 | BC | ¼ |
½ | 189 | BD | ½ ½ |
¾ | 190 | BE | ¾ |
¿ | 191 | BF | ¿ |
Z. | Dez. | Hex. | Entity |
---|---|---|---|
À | 192 | C0 | À |
Á | 193 | C1 | Á |
 | 194 | C2 |  |
à | 195 | C3 | à |
Ä | 196 | C4 | Ä |
Å | 197 | C5 | Å |
Æ | 198 | C6 | Æ |
Ç | 199 | C7 | Ç |
È | 200 | C8 | È |
É | 201 | C9 | É |
Ê | 202 | CA | Ê |
Ë | 203 | CB | Ë |
Ì | 204 | CC | Ì |
Í | 205 | CD | Í |
Î | 206 | CE | Î |
Ï | 207 | CF | Ï |
Ð | 208 | D0 | Ð |
Ñ | 209 | D1 | Ñ |
Ò | 210 | D2 | Ò |
Ó | 211 | D3 | Ó |
Ô | 212 | D4 | Ô |
Õ | 213 | D5 | Õ |
Ö | 214 | D6 | Ö |
× | 215 | D7 | × |
Ø | 216 | D8 | Ø |
Ù | 217 | D9 | Ù |
Ú | 218 | DA | Ú |
Û | 219 | DB | Û |
Ü | 220 | DC | Ü |
Ý | 221: | DD | Ý |
Þ | 222 | DE | Þ |
ß | 223 | DF | ß |
à | 224 | E0 | à |
á | 225 | E1 | á |
â | 226 | E2 | â |
ã | 227 | E3 | ã |
ä | 228 | E4 | ä |
å | 229 | E5 | å |
æ | 230 | E6 | æ |
ç | 231 | E7 | ç |
è | 232 | E8 | è |
é | 233 | E9 | é |
ê | 234 | EA | ê |
ë | 235 | EB | ë |
ì | 236 | EC | ì |
í | 237 | ED | í |
î | 238 | EE | î |
ï | 239 | EF | ï |
ð | 240 | F0 | ð |
ñ | 241 | F1 | ñ |
ò | 242 | F2 | ò |
ó | 243 | F3 | ó |
ô | 244 | F4 | ô |
õ | 245 | F5 | õ |
ö | 246 | F6 | ö |
÷ | 247 | F7 | ÷ |
ø | 248 | F8 | ø |
ù | 249 | F9 | ù |
ú | 250 | FA | ú |
û | 251 | FB | û |
ü | 252 | FC | ü |
ý | 253 | FD | ý |
þ | 254 | FE | þ |
ÿ | 255 | FF | ÿ |
Unterschied | HTML | XHTML |
---|---|---|
Schreibweise der Tags | Alles erlaubt: <br>,<Br>,<BR> | nur klein: <br /> |
Tags ohne Inhalt | <br> | entweder leeres Tag: <br /> oder mit Endtag: <br></br>) |
Endtag | weglassen erlaubt: <ul> <li>Text <li>Text </ul> | immer angeben <ul> <li>Text</li> <li>Text</li> </ul> |
Attributwert in "" | Optional: <img alt=Grafik> | Immer: <img alt="Grafik"> |
boolesche Attribute | Erlaubt: <input type="radio" checked> | Name als Wert angeben: <input type="radio" checked="checked" /> |
<!DOCTYPE html> <html lang="de"> <head> <meta charset="utf-8" /> <title>Seitentitel</title> </head> <body> <p>content</p> </body> </html>
header { background-color: yellow; } nav { background-color: orange; } section { background-color: yellowgreen; } footer { background-color: deepskyblue; } // Für ältere Browser header, nav, section, footer {display: block;}
Für IE:
<script> document.createElement("header"); document.createElement("nav"); document.createElement("section"); document.createElement("footer"); </script>
Dokumente, die den Medientyp „text/html“ besitzen, gelten als HTML-Dokumente. Sie werden mit dem HTML-Parser verarbeitet. Diese Variante wird umgangssprachlich als HTML5 bezeichnet.
Dokumente, die einen XML-Medientyp – z. B. „application/xhtml+xml“ oder „application/xml“ – besitzen, gelten als XML-Dokumente, die von einem XML-Parser verarbeitet werden. Diese Variante wird umgangssprachlich als XHTML5 bezeichnet.
n.v.
Hier im Anhang finden sie Fachbegriffe und Referenzen zu CSS.
Allgemeine CSS-Syntax:
Selektor { Eigenschaft1: Wert1; …; EigenschaftN: WertN; }
Referenz: CSS Selektoren (http://wiki.selfhtml.org/wiki/Referenz:CSS/Selektoren) in selfHTML Wiki.
Flexbox:
Referenz: Box-Modell (http://wiki.selfhtml.org/wiki/CSS/Box-Modell) im selfHTML Wiki und in css4you (http://www.css4you.de/wsboxmodell/index.html).
Die Eigenschaften left (links), right (rechts), top (oben) und bottom (unten) sowie alternativ width (Breite) und height (Höhe) legen die Position eines Blockelements fest. Und zwar immer relativ zum übergeordneten Blockelement. Voraussetzung dafür ist die Angabe der Positionsart mit position: absolute;, position: relative; oder position: fixed;.
top | ||||||||||
margin | ||||||||||
border | ||||||||||
pading | ||||||||||
⇱ | width | ↤ | ||||||||
left | height | Ein beliebiger Inhalt der Box! | right | |||||||
↥ | ||||||||||
bottom |
100% des Anzeigefenster oder des übergeordneten Blockelements entsprechen:
Sie können das Box-Modell mit der Eigenschaft box-sizing anpassen:
Referenz: CSS Einheiten (http://wiki.selfhtml.org/wiki/CSS/Wertetypen/Zahlen,_Maße_und_Maßeinheiten) in selfHTML Wiki.
Referenz: CSS Farben (http://wiki.selfhtml.org/wiki/Referenz:CSS/Farben) in selfHTML Wiki.
Color | Farbe | #rrggbb | Farbe |
---|---|---|---|
aqua | Türkis | #00FFFF | |
black | Schwarz | #000000 | |
blue | Blau | #0000FF | |
fuchsia | Purpurrot | #FF00FF | |
gray | Grau | #808080 | |
green | Grün | #008000 | |
lime | Hellgrün | #00FF00 | |
maroon | Kastanienbraun | #800000 | |
navy | Marineblau | #000080 | |
olive | Oliv | #808000 | |
orange | Orange | #FFA500 | |
purple | Violett | #800080 | |
red | Rot | #FF0000 | |
silver | Silber | #C0C0C0 | |
teal | Aquamarin | #008080 | |
white | Weiß | #FFFFFF | |
yellow | Gelb | #FFFF00 |
n.v.
Hier im Anhang finden sie Fachbegriffe und Referenzen zu JavaScript.
Syntax | Art | Beschreibung |
---|---|---|
var name = Wert; var name1,name2; | Variable | Deklaration einer Variable (mit Wert) Variablen innerhalb einer Funktion sind lokal (nur innerhalb des) dieser gültig. |
1, 3.1414, "Hallo" | Wert (Literal) | Ein Wert ist entweder ein direkter Wert, ein Variablenwert oder ein Funktionswert. Escape: \", \', \\, \/, \n, \r, , \b, \f |
name | Bezeichner | Name für Variablen, Funktionen und Objekte. Darf nur A-Z, a-z, 0-9, und _ enthalten und muss mit einem Buchstaben beginnen. |
/* ... */ // ... | Kommentar | Kommentieren des Quelltextes. // gilt bis zum Ende der Zeile. |
Alert("Hallo Welt"); | Anweisung | Eine Anweisung ist ein Befehl den der Computer verarbeitet. Die Trenner zwische Anweisungen ist das Semikolon (;) |
{} | Anweisung Block | Die geschweiften Klammern fassen mehrere Anweisungen zu einem Block zusammen. Dieser gilt dann als eigene Anweisung. |
function name (p) {} | Funktion | Funktion mit Parametern definieren |
fn { return Wert; } | Funktion | Rückgabewert einer Funktiondefinieren |
name(Wert); | Funktion | Funktion mit Wert für Parameter aufrufen |
var obj=new klasse(); | Objekt | Erzeugt eine neue Instanz einer Klasse |
objekt.methode(); | Objekt | Methode (Funktion) eines Obj. aufrufen |
objekt.attribut; | Objekt | Attribut (Variable) eines Obj. benutzen |
function klasse(p){ this.attr = p; this.meth=function} | Objekt | Klasse mit Attributen (attr) und Methoden (meth) definieren. |
with (obj) { ... } | Objekt | Auf Methode und Attribute ohne führendes "obj." zugreifen |
var1 = Wert; | Zuweisung | Variablen einen Wert zuweisen. |
==, !=, >, => , <, <= | Operator | Vergleich (gleich ==, ungleich !=) |
+, -, /, *, % | Operator | Berechnung (Geteilt /, Mal *, Restwert %) |
++, -- | Operator | Zuweisung + Berechnung (var = var + 1) |
&&, ||, ! | Operator Operator | Logisch (und &&, oder ||, nicht !) |
>>, <<, &, |, ^, ~ | Operator | Bit-Operatoren |
+ | Operator | Zeichenketten verknüpfen "Hallo" + "Welt" |
?: | Operator | Entweder-Oder (s.u.) |
(), [] | Operator | Klammerung |
if (Vergleich) A1; else A2; | Bedingung | Wenn Vergleich wahr ist, dann Anweisung A1 sonst Anweisung A2 |
(Vergl)?W1:W2; | Bedingung | Wenn Vergleich wahr ist, dann Wert W1 sonst Wert W2 |
switch (Variable){ case "1" : A1;break; ... default : A; break;} | Bedingung | Verschiedene Anweisungen Ax je nach Wert der Variable. Wenn keine zutrifft, dann "default"-Zweig. |
while (Vgl.) A; | Schleife | Solange der Vergleich wahr ist, führe Anweisung A (meist Block {}) aus |
do A while (Vgl.); | Schleife | Solange der Vergleich wahr ist, führe Anweisung A (meist Block {})aus |
for (Var, Vgl, Zuw) A | Schleife | Variable Var einen Startwert zuweisen, Var mit Endbedingung vergleichen und Var neuen Wert zu weisen. Beispiel: for (i=0, i<=9, i++) { ... } |
break; | Schleife | Bricht eine Schleife ab |
continue; | Schleife | Setzt mit erster Anweisung einer Schleife fort. |
Genauere Beschreibung in SelfHTML (http://de.selfhtml.org/javascript/objekte/unabhaengig.htm).
Funktion sind innerhalb von JS als Objekte benutzbar. So kann eine Funktion, die ein Objekt zurück gibt (Referenz!) direkt mit den Eigenschaften und Methoden des Objekts aufgerufen werden.
Genauere Beschreibung in SelfHTML (http://de.selfhtml.org/javascript/objekte/function.htm).
Auch Zeichenketten werden JS-intern als Objekte verwaltet.
Genauere Beschreibung in SelfHTML (http://de.selfhtml.org/javascript/objekte/string.htm).
Auch Arrays sind in JS Objekte (erkennbar am new). Entsprechend gibt es einige Methoden auf Arrays:
Genauere Beschreibung in SelfHTML (http://de.selfhtml.org/javascript/objekte/array.htm).
Genauere Beschreibung in SelfHTML (http://de.selfhtml.org/javascript/objekte/index.htm).
Genauere Beschreibung in SelfHTML (http://de.selfhtml.org/javascript/objekte/index.htm).
Reserviertes Wort | Erläuterung |
---|---|
abstract | Noch nicht verwendet |
boolean | Noch nicht verwendet |
break | Als Anweisung: Abbruch in Seite Schleifen |
byte | Noch nicht verwendet |
case | Für Seite Fallunterscheidungen |
catch | Für Seite Fehlerbehandlung mit try..catch |
char | Noch nicht verwendet |
class | Noch nicht verwendet |
const | Dient zur Deklaration von Konstanten (ab JS-Version 1.5) |
continue | Als Anweisung: Fortsetzung in Seite Schleifen |
default | Für Seite Fallunterscheidungen |
delete | Operator: Seite Objekte und Objekteigenschaften löschen |
do | Für Seite Schleifen mit "do-while" |
double | Noch nicht verwendet |
else | Sonst-Fall in Seite bedingten Anweisungen mit "if" |
export | Als Anweisung: Objekte oder Funktionen für fremde Scripts ausführbar machen |
extends | Noch nicht verwendet |
false | Boolescher Wert: falsch |
final | Noch nicht verwendet |
finally | Für Seite Fehlerbehandlung mit try..catch |
float | Noch nicht verwendet |
for | Für Seite Schleifen mit "for" |
function | Für Seite Funktionen |
goto | Noch nicht verwendet |
if | Für Seite bedingte Anweisungen mit "if" |
implements | Noch nicht verwendet |
in | Für Seite spezielle Schleifen mit "for" |
instanceof | Prüft, ob ein Objekt eine Instanz eines Prototyp-Objektes ist (ab JS-Version 1.4) |
int | Noch nicht verwendet |
long | Noch nicht verwendet |
native | Noch nicht verwendet |
new | Dient zum Seite Definieren von Objekten |
null | Spezieller Null-Wert z.B. für Eigenschaften, die keinen Wert haben, oder als Rückgabewert einer Funktion |
package | Noch nicht verwendet |
private | Noch nicht verwendet |
protected | Noch nicht verwendet |
public | Noch nicht verwendet |
return | Für Seite Rückgabewerte in Funktionen |
short | Noch nicht verwendet |
static | Noch nicht verwendet |
super | Noch nicht verwendet |
switch | Für Seite Fallunterscheidungen |
synchronized | Noch nicht verwendet |
this | Für Bezug auf das Seite aktuelle Objekt |
throw | Als Anweisung: Nutzerdefinierte Ausnahme (ab JS-Version 1.4) |
throws | Noch nicht verwendet |
transient | Noch nicht verwendet |
true | Boolescher Wert: wahr |
try | Für Seite Fehlerbehandlung mit try..catch |
typeof | Operator: liefert den Seite Typ eines Elementes |
undefined | Der Wert undefiniert. Eine Variable, die ohne eine Zuweisung deklariert wird (var variable;), erhält diesen Wert (JS 1.3) |
var | Für Seite Variablendefinitionen |
void | Operator: Seite unterdrückt Rückgabewerte |
while | Für Seite Schleifen mit "while" |
with | Um Seite mehrere Anweisungen mit einem Objekt durchzuführen |
Bestimmte Zeichen werden in Javascript „escaped“, um sie innerhalb von Zeichenketten verwenden zu können. Dazu gehören natürlich ' “ \ /, aber auch nicht sichtbare Zeichen wie das Zeilenende.
Zeichen | Escape |
---|---|
' | \' |
" | \" |
\ | \\ |
/ | \/ |
Zeilenvorschub (linefeed) | \n |
Rücklauf (return) | \r |
tab | \t |
Rückschritt (backspace) | \b |
Seitenvorschub (feed) | \f |
Wenn sie in JS einen eigenen Namen (Bezeichner) vergeben (Variablen, Funktionen, …), müssen sie sich an eigene Regeln halten. Namen …
Anmerkung: Umso besser sie den Namen wählen, um so eher können sie auch nach Jahren noch den Verwendungszweck bestimmen.