Frames sind, genau wie das FONT
Element, eine Erfindung von Netscape, die eingeführt wurde, ohne auf Standardisierungen zu warten, oder daß über die Sinnhaftigkeit dessen oder gar Verbesserungsvorschläge diskutiert werden könnte. Es existiert noch kein HTML Standard für die Benutzung von Frames, lediglich die HTML 4.0 Recommendation enthält ein Framekonzept, zu dem Netscape fast kompatibel ist. Bei dieser Recommendation gehören Frames aber ebenfalls nicht zur strict-Version, sondern zu einer eigenen DTD names HTML 4.0 Frameset, deren Untermenge sogar noch HTML 4.0 Transitional, die Übergangslösung zwischen HTML 3.2 und HTML 4.0, ist.
Die Umsetzung von Frames in den Browsern sorgte schon für viel Probleme und Kritiken, speziell Netscape 2 hatte einiges zu kämpfen. Es gab auch sonst sehr viel Kritiken, diese werden im Kapitel Probleme mit Frames näher betrachtet.
Frames ermöglichen es dem Leser (ja, hier ist es wirklich nur noch der Leser), verschiedene HTML Dokumente gleichzeitig in einer Browserinstanz geöffnet zu haben, z.B. einen Navigationsbalken, der nicht mitgescrollt wird, wenn in einem anderen Dokument geblättert wird.
Im folgenden wird nicht auf irgendwelche Netscape- oder Microsoft Spezifikationen eingegangen, stattdessen wird sich an den Frames Beschreibungen in der W3C Framesdefinition der HTML 4.0 Recommendation orientiert.
Ein Dokument, das Frames aufbaut, unterscheidet sich von einem normalen HTML Dokument dadurch, das anstatt des BODY
Elements ein FRAMESET
Element verwendet wird. In diesem FRAMESET
Element befinden sich FRAME
Elemente, die die einzelnen Frames näher bezeichnen.
Außerhalb des FRAMESET
Elements gibt es dann noch das NOFRAMES
Element, das Nutzern, deren Browser keine Darstellung von Frames erlauben, oder Nutzern, die auf die Darstellung von Frames verzichten, immer noch Inhalt vermitteln kann.
Neben obigem Frameslayout gibt es noch die sogenannten Inline Frames, die von Microsoft mit der Einführung des Internet Explorer 3.0 vorgestellt worden. Auch diese befinden sich in der HTML 4.0 Recommendation.
FRAMESET
Erlaubte Attribute, neben den "%coreattrs", für FRAMESET
sind:
ROWS
COLS
ONLOAD
ONUNLOAD
Die letzten zwei sollen hier nicht betrachtet werden, sie dienen zum Aufruf von Skripten. Die Attribute ROWS
und COLS
erhalten eine Komma-separierte Liste, die das Layout der Frames bestimmt. In dieser Liste können Zahlen (Pixel), Prozentzahlen sowie ein "*" Zeichen stehen. Übergibt man zum Beispiel ein
ROWS="100,*,25%"
werden drei Zeilen aufgebaut. Die erste ist 100 Pixel hoch, der dritte und unterste nimmt 25% des Browserfensters (inklusive der 100 Pixel der ersten Zeile), und die mittlere bekommt den ganzen Rest. Analog ist es beim COLS
Attribut. Man kann vor die "*" noch eine Zahl setzen, so erzeugt zum Beispiel
COLS="2*,150,3*"
drei Spalten. Die mittlere ist 150 Pixel breit, den restlichen, übriggebliebenen Platz teilen sich die linke und rechte Spalte, indem die linke 40% und die rechte 60% des übriggebliebenen Text (exklusive der 150 Pixel) erhalten. Beispiel: Beträgt die Breite des Fensters 1000 Pixel, bleiben für die linke und rechte noch 850 Pixel übrig. Davon erhält die linke 340, die rechte 510 Pixel. Ein "*" ohne eine Zahl davor zählt als "1*".
FRAMESET
Elemente können verschachtelt sein. Auf diese Weise kann man zum Beispiel erst drei Zeilen erschaffen, und die mittlere Zeile dann noch einmal in drei Spalten unterteilen:
<FRAMESET ROWS="100,*,100"> ... Inhalt des obersten Frames <FRAMESET COLS="25%,*"> ... Inhalt der linken Spalte ... Inhalt der rechten Spalte </FRAMESET> ... Inhalt des untersten Frames </FRAMESET>
Zur näheren Spezifikation der einzelnen Inhalte von Frames gibt es das FRAME
Element.
Als Attribute können hier angegeben werden:
LONGDESC
NAME
SRC
FRAMEBORDER
MARGINWIDTH
MARGINHEIGHT
NORESIZE
SCROLLING
Nun soll ein Beispiel kommen, das vier Frames aufbaut, basierend auf obigem FRAMESET
Beispiel.
<FRAMESET ROWS="100,*,100"> <FRAME SRC="open.html" NAME="oben" FRAMEBORDER="0"> <FRAMESET COLS="25%,*"> <FRAME SRC="links.html" NAME="links" FRAMEBORDER="0" MARGINWIDTH="10" MARGINHEIGHT="10"> <FRAME SRC="rechts.html" NAME="hauptseite" FRAMEBORDER="0" MARGINWIDTH="20" MARGINHEIGHT="15"> </FRAMESET> <FRAME SRC="unten.html" NAME="unten" FRAMEBORDER="1"> </FRAMESET>
Man erhält ein Set von vier Frames. Zwischen dem oberen und den beiden mittleren Frames besteht keine sichtbare Grenze, aber zwischen dem unteren und den beiden mittleren. So zumindest laut HTML Spezifikation. Um den gleichen Effekt bei Netscape zu erhalten, muß man noch im FRAMESET
Element BORDER="0"
hinzufügen.
Was sieht ein Nutzer, dessen Browser keine Frames darstellt, wenn er auf eine Seite mit obigem Beispiel trifft? Er sieht nichts, ganz einfach, weil im obigen Dokument nichts vorhanden ist, was auf seinem Browser dargestellt werden würde. Um das zu beheben, gibt es das NOFRAMES
Element.
Das NOFRAMES
Element ist dafür vorgesehen, Nutzern, deren Browser keine Frames darstellen können, oder Nutzern, die nicht wollen, daß ihre Browser Frames darstellen, und diese deshalb, falls der Browser nicht schon von Haus aus einen entsprechenden Menüpunkt zur Verfügung stellt (wie zum Beispiel Opera), ihrem Browser abgewöhnt haben, immer noch eine Zugriff auf die Webseiten zu ermöglichen.
Solch ein NOFRAMES
Element sollte mehr beeinhalten als nur ein "Sie brauchen xxxx Version x.xx, um diese Seiten zu sehen". Es bietet sich an, sollten die Frames aus der häufigen Kombinationsbalken + Hauptfenster - Kombination bestehen, einen Link auf das Linkfenster beizufügen, oder es gasp sogar in den NOFRAMES
Inhalt einzufügen.
Da framesfähige Browser, die auch zur Darstellung derselben konfiguriert sind, laut HTML Spezifikation den Inhalt jedes NOFRAMES
Elements ignorieren sollen, kann man sie sogar in die eigentlichen Seiten mit einfügen, um somit zum Beispiel für Nutzer eines nichtframefähigen Browsers trotzdem eine Navigationsleiste zur Verfügung zu stellen, während Nutzer, die Frames benutzen, die Navigationsleiste zum Beispiel im linken Frame haben. Die Betonung oben liegt aber auf laut HTML Spezifikation. Beim Internet Explorer funktioniert das auch schön. Bei Netscape aber nicht, sowohl in den Versionen 2, 3 und 4. Damit fällt diese, eigentlich sehr gute Möglichkeit, leider weg, sofern man den Nutzern von Netscape nicht zusätzliche Navigationsbalken zeigen will.
Also bleibt als Möglichkeit für die Plazierung des NOFRAMES
Element nur das Dokument, in dem die Frames definiert würden. Das könnte dann so aussehen:
<FRAMESET ROWS="100,*,100"> <FRAME SRC="open.html" NAME="oben" FRAMEBORDER="0"> <FRAMESET COLS="25%,*"> <FRAME SRC="links.html" NAME="links" FRAMEBORDER="0" MARGINWIDTH="10" MARGINHEIGHT="10"> <FRAME SRC="rechts.html" NAME="hauptseite" FRAMEBORDER="0" MARGINWIDTH="20" MARGINHEIGHT="15"> </FRAMESET> <FRAME SRC="unten.html" NAME="unten" FRAMEBORDER="1"> <NOFRAMES> Hier geht es zur <A HREF="links.html">non-frames Version</A>. </NOFRAMES> </FRAMESET>
Das IFRAME
Element ist ebenfalls Bestandteil des HTML 4.0 Working Drafts. Erlaubte Attribute sind:
LONGDESC
NAME
SRC
FRAMEBORDER
MARGINWIDTH
, MARGINHEIGHT
, SCROLLING
ALIGN
HEIGHT
WIDTH
Das IFRAME
Element erlaubt es, andere HTML Dokumente in das momentane Dokument einzufügen. Ähnlich dem OBJECT
Element, ebenfalls Bestandteil der HTML 4.0 Recommendation, kann dabei der umgebende Text um das Inline Frame herumfließen, etc.
Inhalte zwischen dem öffnenden und dem schließenden IFRAME
Tag werden von IFRAME
-fähigen Browsern nicht dargestellt, sehr wohl aber von allen anderen Browsern.
Ein Beispiel kann so aussehen:
<IFRAME SRC="was_ist_neu.html" WIDTH="300" HEIGHT="200" SCROLLING="AUTO" FRAMEBORDER="0" NAME="neu"> Um die letzten Änderungen einzusehen, können Sie <A HREF="was_ist_neu.html">dieses Dokument besichtigen</A>. </IFRAME>
Das IFRAME
Element wird momentan noch nicht von allzuvielen Browsern unterstützt (zum Beispiel nicht von Netscape), diese Situation sollte sich aber ändern, sobald die nächsten Browsergenerationen erscheinen, was natürlich nicht allzuviel heißt, vor allem sollte man sich immer bemühen, alternativen Text anbieten zu können.
Es wurden schon die NAME
Attribute für die FRAME
und IFRAME
Elemente erwähnt. Mit diesen Attributen ist es dem Autoren möglich, Links auf einem anderen Frame erscheinen zu lassen. Dazu fügt im A
Element das TARGET
Attribut ein. Im Beispiel mit den vier Frames sei links der Navigationsbalken, und rechts das Hauptfenster. Der Name des Hauptfensters war "rechts", um nun also dafür zu sorgen, daß ein Link, der im Navigationsbalken benutzt wird, auf dem rechten Fenster angezeigt wird, genügt folgender Anker:
<A HREF="test.html" TARGET="rechts">Ein Testdokument</A>
Obiger Link steht im linken Navigationsbalken, und die Angabe des TARGET
Attributs sorgt dafür, daß das Dokument "test.html" dann im rechten Frame dargestellt wird.
Es gibt für TARGET
einige schon definierte Namen. Vom Autor vergebene Namen für Targets müssen mit mit einem Buchstaben beginnen. Schon definierte Namen sind:
Es gibt sehr viele Probleme mit oben beschriebener Konzeption von Frames, da sie aber dank der Dominanz von Netscape (und dem später erstarkenden Internet Explorer, der Frames auch nicht viel anders handhabt) schon eine sehr große Verbreitung gefunden hatten, mußte sich letztendlich das W3C unterordnen. Die folgende Liste zeigt wichtige, aber bei weitem nicht alle Probleme. Es wird jeweils versucht, Tips zu geben, wie man diese Probleme wenigstens teilweise vermeiden kann.
Das Hauptproblem von Frames ist eigentlich, daß sie dem Zweck von HTML als Hypertext Markup Language entgegenwirken, da Frames sich auf Layout, anstatt die Struktur, beziehen. Eigentlich sollte HTML auf jedem HTML Wiedergabegerät, sei es nun ein graphischer Browser, ein Textbrowser, ein Sprachausgabegerät, Brailleschrift, ein Drucker oder was auch immer sein. Frames jedoch sprechen speziell graphische Browser an, und mehr noch, graphischer Browser, die auf relativ hohen Bildschirmauflösungen laufen.
Durch die vollständige Inkompatibilität mit anderen Browsern ist der Autor gezwungen, eine Menge Extrarbeit auf sich zu nehmen, will er allen die Möglichkeit geben, die Seiten betrachten zu können. Viele Autoren machen sich diese Arbeit jedoch nicht.
Das Konzept von Frames ist generell nicht sehr ausgereift, ein Resultat dessen, daß es keine richtigen Diskussionen darüber gab. Es sind aber schon auf den ersten Blick wesentlich praktischere Lösungen für viele Framesanwendungen denkbar. Die oft benutzten Navigationsbalken könnten zum Beispiel durch einfache Deklarationen im HEAD
Element oder ähnliches als frei plazierbare Leiste dargestellt werden, oder ähnliches.
Spezielle Probleme werden im folgenen betrachtet.
Eine Standardanwendung von Frames besteht in der Regel darin, irgendwo einen Navigationsbalken, und an anderer Stelle ein Hauptfenster zu haben. Das Problem bei der Benutzung des Navigationsbalkens ist nun, daß sich der URL des dargestellten Fensters nicht ändert, da sich ja das Hauptdokument mit der Framedefinition nicht ändert. Wenn der Nutzer nun, nach einigen Klicks, die Seite bookmarken will, wird aber nur das definierende Dokument gespeichert. Das heißt, wenn der Nutzer zurückkommt, findet er wieder die Hauptseite vor, und muß sich durch den Rest durchklicken.
Die Browserhersteller haben es natürlich versäumt, schlauere Bookmarkfunktionen anzulegen, die sich auch noch die URLs einzelner Frames merken können. Für Autoren bietet sich die Möglichkeit, das Problem wenigstens teilweise zu umgehen, indem jeder Link grundsätzlich ein von Grund auf neues Frameset aufbaut. Das hat auf der anderen Seite wieder den Nachteil, daß eventuelle Größeneinstellungen, die sich der Nutzer durch verschieden von Framerändern etc. selbst gemacht hatte, wieder verlorengehen.
Viele Suchmaschinen, zum Beispiel AltaVista, OpenText, etc., speichern die Inhalte von Seiten, auf die beim Suchen zugegriffen wird. Es hängt von der Suchmaschine ab, ob diese überhaupt Verweise auf Frames folgen, denn das Problem ist, das in der Regel ein einzelnes Fenster nicht die nötigen Links aufweist, um vollwertig auf die Site zuzugreifen. Theoretisch müssen im "Hauptfenster" ja überhaupt keine Links vorhanden sein, da man diese im Navigationsbalken hat. Wenn ein Nutzer nun auf solche eine, vom Framesverband losgelöste Seite, trifft, dann kann er sich zwar die dortige Information durchlesen, hat aber keine weiteren Links mehr zur Verfügung.
Andere Suchmaschinen folgen erst gar nicht, aus oben genannten Gründen, Verweisen zu Frames. Sie müssen sich stattdessen mit dem begnügen, was sie auf der Hauptseite finden. Und das ist oftmals nicht mehr als der Titel im TITLE
Element, sowie der Inhalt des NOFRAMES
Elements.
Der Autor kann auf jeder Seite, die zu einem Frameset gehört, oder darin dargestellt werden kann, einen Fuß anbringen, der einen Link zur Hauptseite beinhaltet. Damit kann ein Nutzer wenigstens nach weitergehenden Information suchen.
Die Hauptseite mit der Framedefinition sollte, natürlich neben dem sinnvollen Titel, auch vernünftige Inhalte im NOFRAMES
Element haben. Das ist ein weiterer Grund, warum eine Meldung, man hat einen "falschen" Browser, nicht nur frech, sondern letztendlich auch Blödsinn ist. Man muß sich nur einmal den Spaß machen, in AltaVista nach "You need Netscape" zu suchen, ein oft (aber bei weitem nicht der einzige) benutze Disclaimer im NOFRAMES
Element. Eine eben durchgeführte Suche brachte 2627 passende Dokumente. Eine Suche nach "frames-compatible" bringt 6505 Dokumente... Hätten die Autoren stattdessen etwas vernünftiges im NOFRAMES
Element plaziert, würde man vielleicht sogar auf ihre Seiten stoßen, wenn man etwas sucht, und ihre Seiten ein Ergebnis dieser Suche darstellen würden.
Auf jeden Fall sollte eine Webseite, wenn sie denn von Suchmaschinen gefunden werden möchte, noch Informationen im META Tag bereithalten. Das gilt zwar nicht nur für FRAME Dokumente, aber für diese ganz besonders. Diese META
Tags werden in das HEAD
Element einer Seite eingefügt. Eine entsprechende Syntax für AltaVista ist:
<HEAD> <TITLE> Ein Titel </TITLE> <META NAME="desciption" CONTENT="Beschreibung der Seite"> <META NAME="keywords" CONTENT="Star Trek, Deep Space Nine, Episode Guide"> </HEAD>
Ein Autor, der auf die Universalität und Plattformunabhängigkeit seiner Seiten Wert legt und mit dem Gedanken spielt, Frames zu benutzen, sollte sich gewissenhaft die Frage stellen, ob er diese wirklich braucht. Ein Navigationsbalken kann zum Beispiel durchaus als Kopf- und Fußzeile einer Seite dargestellt werden, die meisten Browser können diese Stellen mit einer simplen Tastenkombination oder Mausklick erreichen. Es sieht natürlich anders aus, wenn der Navigationsbalken oft aktualisiert wird (zum Beispiel mit Daten der letzten Modifikationen der entsprechen Links, etc.), denn eine solche Aktualisierung über hunderte von Seiten durchzuführen, ist bestenfalls zeitaufwendig.
Man sollte auch wirklich nur solche Frames einfügen, die auch sinnvoll sind und keine Platzverschwendung. Ein extra Frame mit einem Firmenlogo zum Beispiel wäre letzteres, es nimmt nur unnötig Platz weg, den man vielleicht, gerade bei kleineren Bildschirmauflösungen, lieber für den Text hätte, auch wenn es beim Autoren mit 1280x1024 Pixeln Auflösung wahnsinnig toll aussah. Vermeiden sollte man ebenfalls die Verwendung von NORESIZE
und SCROLLING="NO"
. Man kennt nie die Erfordernisse der Leute, die die Seiten besuchen. Jemand mit Augenproblemen, und einer daraus resultierenden Standardeinstellung von 20 Punkten für die Schrift, kann durchaus plötzlich feststellen, daß er gar nicht den ganzen Navigationsbalken erreicht, da er weder scrollen noch dessen Größe verändern kann.
Ich möchte auf keinen Fall die Verwendung von Frames verteufeln, meine Star Trek Seiten benutzten bis vor kurzem selbst welche (aus o.g. Grund der Aktualiserung des Navigationsbalkens), man sollte sich dann aber große Mühe geben, damit man durch unachtsame Erstellung der Seiten keine anderen Benutzer vor die Tür stellt.
Referenzen:
HTML Themen
HTML 4.0 Working Draft des W3C
Frames Spezifikation der HTML 4.0 Recommendation