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)
Beispiel:  transparency("img",40)
transparency("Bild1",60)
transparency(images[1])
Download:  transobj.zip

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) 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:

  1. Ein JavaScript-HTML-Objekt: Es wird genau dieses Element bearbeitet.
  2. Der Name eines HTML-Elementes: Es werden alle Elemente mit dem passenden Namen bearbeitet (NAME-Attribut - sofern beim Element zulässig).
  3. Die ID eines HTML-Elementes: Es wird das Element mit der passenden ID bearbeitet (ID-Attribut).
  4. 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
Objekt-Auswahl: onMouseOver="transparency(this,0);"
IMG-Tag-
Auswahl

Grafik 1 Grafik 2 Grafik 3
100%
90%
80%
70%
60%
50%
40%
30%
20%
10%
0%
transparency
("img",proz)
"Ab18" (ID) "Ab32" (ID) "Ab56" (ID)  
"FSK" (NAME) "FVK" (NAME)
ID-Attribut-Auswahl:
transparency(id,60)
 
NAME-Attribut-Auswahl:
transparency(name,60);

HTML-Code

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:

  1. Das Image-Objekt (z.B. document.getElementById("blending") oder document.images["blending"]) der Grafik, die überblendet werden soll.
  2. Den URL einer neuen Grafik (z.B. img/neu.gif), zu der übergeblendet werden soll.
  3. Optional: Die Schrittweite der Transparenzwerte (voreingestellt: 4 - also für Überblendung mit den Transparenzwerten 100, 96, 92, ..., 8, 4, 0).
  4. Optional: Die Wartezeit bis zum nächsten Wechsel der Transparenz in Millisekunden (voreingestellt: 30).
  5. 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.
Überblendungsbeispiel
mit 3 Grafiken
Zum Überblenden Maus über die Grafik bewegen!
FSK 'Ab 18'
Maus außerhalb der Grafik: Abbruch!

HTML-Code

Der externe Quellcode: transobj.zip

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.


Kurz-URL dieses Artikels: http://Coding.binon.net/Transparenz