Coding-Schatzkästlein Kleine Tips & Scripts zum Webdesign Start > DHTML > Durchsichtige Elemente
DHTML: Durchsichtige Elemente (Transparenz/Opacity/Überblendung)
Zusammenfassung
Name:
Transparency
Aufgabe:
Sorgt (z.Zt.) auf IE (ab Version 5), Mozilla, KHTML/WebKit-Browsern (Konqueror, Safari) und generell auf CSS-3-Browsern für die transparente Darstellung von HTML-Elementen. Die Auswahl kann direkt über ein Objekt, über das ID-Attribut, das NAME-Attribut oder ein HTML-Tag erfolgen.
Benötigt:
JavaScript 1.5 (gesichert, nicht gesichert für JavaScript 1.0)
Der Internet Explorer (mit seiner Funktion filter:Alpha), die Browser mit
Mozilla- (mit seiner eigenen CSS-Definition -moz-opacity) und
KHTML/WebKit-Engine (mit dem ebenfalls proprietären CSS -khtml-opacity -
beim Konqueror leider nur bedingt)
als auch Browser die CSS Version 3 (opacity) unterstützen erlauben es,
HTML-Elemente teiltransparent darzustellen, also den Hintergrund durchscheinen zu
lassen. Die hier vorgestellte Funktion transparency() erledigt dies
systemübergreifend für ein einzelnes Element, aber auch für eine
große Anzahl an Elementen (auf Browsern, die keine der Möglichkeiten
unterstützen, passiert nichts). Die Funktion erwartet einen Parameter, mit dem das/die
gewünschte(n) Element(e) halb durchscheinend gemacht werden. Die Art dieses Parameters
bestimmt die Menge der bearbeiteten Elemente. Übergeben werden kann:
Ein JavaScript-HTML-Objekt: Es wird genau dieses Element bearbeitet.
Der Name eines HTML-Elementes: Es werden alle Elemente mit dem passenden
Namen bearbeitet (NAME-Attribut - sofern beim Element zulässig).
Die ID eines HTML-Elementes: Es wird das Element mit der passenden ID
bearbeitet (ID-Attribut).
Ein HTML-Tagname: Es werden alle passenden HTML-Elemente bearbeitet.
Optional kann in einem zweiten Parameter der Grad der Transparenz in Prozent von
0 (keine Transparenz) bis 100 (volle Transparenz - Element ist nicht sichtbar)
eingestellt werden.
Transparenz-Beispiele voreingestellt sind 30% Transparenz
Achtung: Wenn beim Internet Explorer bis einschließlich Version 7 ein
HTML-Element nicht transparent wird, obwohl die Transparenz nicht deaktiviert
wurde (s. unten), dann fehlt dem Element
die Eigenschaft hasLayout (s. Über hasLayout)
- ein steter Quell für Anzeigefehler. Dies betrifft aber (natürlich)
nicht jedes Element ohne Layout-Eigenschaft (das wäre sonst ja logisch,
und damit kein guter Microsoft-Stil). Beispiele: IMGs haben ein Layout ->
keine Probleme. Ps haben kein Layout -> keine Transparenz. H1s haben ebenfalls
kein Layout -> Transparenz (filter:Alpha) wird dennoch dargestellt,
aber andere Filter (z.B. filter:Shadow) nicht.
Lösung: Man setzt bei diesem Element die Layout-Eigenschaft. Da das aber nicht
direkt geht (hasLayout ist sinnigerweise nur auslesbar),
muß man dem Element einen Stil zuweisen, der es in den Layout-Modus
setzt. Es bietet sich hier die CSS-Eigenschaft zoom an, die auf
1 gesetzt, keine Änderungen am Layout verursacht.
Beispiele, um bei <p id="absatz"> die Layout-Eigenschaft zu setzen:
JS: document.getElementById("absatz").style.zoom="1";
CSS: #absatz { zoom:1; }
Als weiteres Beispiel die Funktion imgBlend(),
mit der man browserübergreifend Bilder ineinander überblenden kann. Als
Beispiel dienen wieder die drei Grafiken, die wechselweise überblendet werden,
wenn man die Maus auf die Grafik bewegt (die Funktion könnte natürlich auch
z.B. bei einem Klick beginnen, oder direkt aufgerufen werden). Wird die Maus wegbewegt,
so wird eine laufende Überblendung sofort beendet, und das neue Bild sofort deckend
eingeblendet. Sollte der Browser keine Transparenz beherrschen, wird ebenfalls sofort die
neue Grafik sichtbar (allerdings läuft die Routine im Hintergrund weiter). Natürlich
lassen sich so auch andere HTML-Elemente überblenden. Allerdings ist das Beispiel
explizit auf Grafiken ausgelegt - die zu überblendende Grafik wird "einfach" zentriert
in den Hintergrund des Elternelements des IMGs "verbannt", davon ausgehend, daß Grafiken
gleicher Größe überblendet werden sollen. Sollen andere HTML-Elemente
überblendet werden, so müssen diese mit CSS übereinander gelegt werden
(mittels position und z-index).
Die Überblend-Funktion imgBlend() erwartet dabei folgende Parameter:
Das Image-Objekt (z.B. document.getElementById("blending") oder
document.images["blending"]) der Grafik, die überblendet
werden soll.
Den URL einer neuen Grafik (z.B. img/neu.gif), zu der übergeblendet
werden soll.
Optional: Die Schrittweite der Transparenzwerte (voreingestellt: 4 - also für
Überblendung mit den Transparenzwerten 100, 96, 92, ..., 8, 4, 0).
Optional: Die Wartezeit bis zum nächsten Wechsel der Transparenz in
Millisekunden (voreingestellt: 30).
Optional: Ein Funktionsobjekt. Hiermit kann eine Funktion bestimmt werden, die nach
dem Ende der Überblendung aufgerufen wird. Als erstem und einzigen Parameter
wird dieser Funktion das Image-Objekt übergeben.
Anmerkung: Da transparency() die Transparenzeffekte mit CSS setzt
(beim IE wäre auch die direkte Programmierung des Filters möglich), ist
keine Abfrage auf die tatsächlichen Browser-Eigenschaften erforderlich.
Die unterschiedlichen Transparenz-Stile können vielmehr alle gleichzeitig
gesetzt werden, da CSS per definitionem (außer in Inline-Styles) unbekannte
Eigenschaften ignoriert (wie auch HTML-Browser unbekannte Tags zu ignorieren haben -
s. Know-how).
Achtung: Während ältere Versionen des Konquerors (3.1+) die
Transparenz mit dem proprietären -khtml-opacity und spätere
Versionen gar mit dem offiziellen opacity unterstützen, wurde
diese Unterstützung in der KHTML-Engine 3.4 leider wieder entfernt
(aktuelles Konqueror-CSS -
spätestens die neue KHTML-Engine 4 wird diesen Fehler beheben)!
Ob die jeweilige Konqueror-Version Transparenz unterstützt, kann man
feststellen, indem man ein (Test-)Element teiltransparent macht (als
Wert z.B. 0.5) und den aktuellen Wert mittels getComputedStyle()
wieder ausliest. Bei Versionen ohne Transparenz erhält man nicht den
eingestellten Wert, sondern entweder 0 oder 1. WebKit,
der Safari-Zweig der KHTML-Engine, ist davon nicht betroffen.
Aber auch beim Internet Explorer kann man nicht sicher sein, ob die Transparenz
funktioniert. Ab IE 6/SP2 gibt es die Einstellungsoption "Binär- und
Skriptverhalten", deren Deaktivierung die Filter abschaltet. Zwar kann man
beim IE mit currentStyle (dem proprietären Gegenstück zum
offiziellen getComputedStyle()) den aktuell verwendeten CSS-Stil
ermitteln, aber das ist dann fälschlicherweise der gesetzte Transparenzwert,
und nicht der tatsächlich sichtbare. =:-/
Auch soll es Versionen geben, die die Transparenz bei ausgeschaltetem
ActiveX nicht darstellen. Ich habe zwar schon recht viele verschiedene
IE-Installationen gesehen und dies bei keiner bestätigen
können, aber daß es sie gibt, wurde mir glaubhaft versichert.
Hinweis: Mit der umfangreichen Funktion toggle()
können ebenfalls HTML-Elemente transparent gemacht werden. Der
Schwerpunkt liegt dabei jedoch auf dem gezielten Darstellungswechsel (nicht
nur der Transparenz) einer Vielzahl von HTML-Elementen, während der
Schwerpunkt des deutlich kompakteren transparency() auf der Darstellung
insbesondere von Bildern und Bild-Gruppen liegt. Es ist aber abzusehen,
daß toggle() früher oder später auch sämtliche
Funktionalität von transparency() besitzen wird, welches dann
möglicherweise überflüssig geworden ist. Ggf. wird dann der Link auf
diese Seite, ebenso wie auch die Funktion selbst, gelöscht werden (das werde
ich entscheiden, wenn es soweit ist - bin aber auch via E-Mail
beeinflußbar ;-)), die Seite selbst wird aber auf jeden Fall
erhalten bleiben - dann mindestens mit einer "Brücken-Funktion", die die Aufrufe
von transparency() auf das dann kompatible toggle() umbilden wird.
Updates:
09.05.2007:
Korrektur: Im Download-Script (nicht in der intern von dieser Website benutzen Version) war ein Schreibfehler in der Routine für alte Versionen der KHTML-Engine (mit Dank an Frank für den Hinweis). Bei der Gelegenheit noch ein wenig den Code optimiert ...
08.10.2005:
Erweiterung: Unterstützt nun auch den proprietären Code der Browser mit KHTML-Engine (Konqueror, Safari).
21.06.2004:
Erweiterung: Die Funktion unterstützt jetzt auch die Transparenz von CSS Version 3.