Bild an Fenstergröße anpassen, die zweite.

Demo

Autor: ich nach Anleitung von Stefan Münz

http://de.selfhtml.org/

IE 5 IE 6 NN 4 NN 6 NN 7 OP 5 OP 6 OP 7 MOZ 1

Ein Bild kann man recht einfach an die Fensterbreite anpassen. Wenn man <img src="bild.gif" border="0" width="100%"> in seinen Quellcode schreibt, wird das Bild "bild.gif" ohne Rahmen so in die Seite eingepasst, dass es die gesamte Breite einnimmt. Wenn das Bild in einem anderen Element, z.B. einer Tabellenzelle ist, nimmt es die gesamte Breite dieser Zelle ein. Wenn man <img src="bild.gif" border="0" height="100%"> in seinen Quellcode schreibt, wird das Bild so in die Seite eingepasst, dass es die gesamte Höhe einnimmt. (Das ist nicht ganz unproblematisch und funktioniert nur unter gewissen Voraussetzungen.) Wenn man <img src="bild.gif" border="0" width="100%" height="100%"> in seinen Quellcode schreibt, werden die Breite und die Höhe des Bildes angepasst. Natürlich wird das Bild in seiner Form dann an das Fenster angepasst, was meist unerwünscht ist. Um das Bild nicht zu verzerren darf man also immer nur entweder die Breite oder die Höhe festlegen. Um ein Bild ins Fenster einpassen zu können, muss man also wissen, ob die Breite oder die Höe des Fensters die Maße des Bildes bestimmt.

Lösung: (die Teile, die von dir angepasst werden müssen wenn du das Script nachbauen willst, sind farbig dargestellt)

<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<title>Bild an Fenster anpassen</title>
<script type="text/javascript">
<!--
var b=
350;
var h=
385;
var bild="
../../Bilder/bullen.jpg";

function Fensterweite()
{
if (window.innerWidth) return window.innerWidth;
else if (document.body && document.body.offsetWidth) return document.body.offsetWidth;
else return b;
}

function Fensterhoehe()
{
if (window.innerHeight) return window.innerHeight;
else if (document.body && document.body.offsetHeight) return document.body.offsetHeight;
else return h;
}
function neuAufbau()
{
if (Weite != Fensterweite() || Hoehe != Fensterhoehe())
window.history.go(0);
}

/*Überwachung von Netscape initialisieren*/
if(!window.Weite && window.innerWidth)
{
window.onresize = neuAufbau;
Weite = Fensterweite();
Hoehe = Fensterhoehe();
}
/*Ende Überwachung von Netscape initialisieren*/
//-->
</script>
</head>
<body topmargin="0" leftmargin="0">
<script type="text/javascript">
<!--

/*Überwachung von MS Internet Explorer initialisieren*/
if(!window.Weite && document.body && document.body.offsetWidth)
{
window.onresize = neuAufbau;
Weite = Fensterweite();
Hoehe = Fensterhoehe();
}
/*Ende Überwachung von MS Internet Explorer initialisieren*/

if (Weite/Hoehe>b/h) document.write("<img border='0' src='"+bild+"' height='"+(Hoehe
-20)+"'>");
else document.write("<img border='0' src='"+bild+"' width='"+(Weite
-20)+"'>");
//-->
</script>
</body>
</html>

Es werden zunächst, wie immer, die benötigten Variablen deklariert. "b" und "h" sind die Breite und Höhe des unskalierten Hauptbildes. "bild" ist die URL des Hauptbildes. Die Funktionen "Fensterweite()" und "Fensterhoehe()" ermitteln die Fenstergröße. Die Funktion Fensterweite() prüft, ob der Browser die Eigenschaft "window.innerWidth" kennt. Der NN kennt diese Eigenschaft, der IE nicht. Wenn das der Fall ist wird der Wert der in dieser Eigenschaft gespeichert ist zurückgegeben. Kennt der Browser diese Eigenschaft nicht, wird geprüft, ob er das Objekt document.body und dessen Eigenschaft "document.body.offsetWidth" kennt. Der IE kennt diese Eigenschaft, der NN nicht. Wenn das der Fall ist wird der Wert der Eigenschaft "document.body.offsetWidth" zurückgegeben. Wenn der Browser auch das nicht kennt wird b (die tatsächliche Breite des Bildes) zurückgegeben. Die Funktion Fensterhoehe() macht das gleiche mit der Fensterhöhe. Das Script überwacht auch ob sich die Fenstergröße ändert. Das geschieht je nach Browser auf unterschiedliche Weise. Mit if(!window.Weite && window.innerWidth) wird festgestellt ob es die Variable "Weite" gibt und ob der Browser die Eigenschaft "window.innerWidth" kennt. Wenn es die Variable "Weite" nicht gibt (das ist nach dem Laden der Seite zunächst der Fall) und wenn der Browser gleichzeitig die Eigenschaft "window.innerWidth" kennt (das ist bei Netscape der Fall), dann wird mit "window.onresize = neuAufbau;" überwacht ob die Fenstergröße verändert wird und gegebenenfalls die Funktion neuAufbau aufgerufen. Außerdem werden die Variablen "Weite" und "Hoehe" festgelegt. Im IE wird das ganze aber nicht ausgeführt, weil der Browser die Eigenschaft "window.innerWidth" kennt. Das ist auch gut so, denn beim IE wird für die Erkennung der Größe die Eigenschaften "document.body.offsetWidth" und "document.body.offsetHeight" benötigt und die gibt es ja erst nachdem der Body geladen ist. Also wird die Überwachung für den IE nicht in den Head sondern in den Body gesetzt. Sie funktioniert fast genau so wie beim NN. Auch der NN 6 kennt das Objekt "document.body" und dessen Eigenschaften. Er führt jedoch diesen Scriptbereich nicht aus, weil der Browser die Variable Weite schon kennt wenn dieser Scriptbereich ausgeführt wird. Jetzt stehen die Variablen "Weite" und "Hoehe" in jedem Browser zur Verfügung. Indem das Verhältnis von "Weite" zu "Höhe" mit dem Verhältnis von "b" zu "h" verglichen wird, wird festgestellt ob die Fensterbreite oder die Fensterhöhe die Skalierung des Bildes bestimmt. Je nach dem welcher Fall eintritt wird entweder "<img border='0' src='"+bild+"' height='"+(Hoehe-20)+"'>" oder "<img border='0' src='"+bild+"' width='"+(Weite-20)+"'>" in den Quellcode geschieben. Die "-20" sind notwendig, weil NN, abweichend vom Standard, einen Rand um das Bild freilässt. Wenn die Fenstergröße geändert wird ruft der Eventhandler "window.onresize" die Funktion "neuAufbau" auf. Sie ruft noch mal die Funktionen "Fensterweite()" und "Fensterhoehe()" auf und vergleicht die zurück gegebenen Werte mit "Weite" und "Hoehe". Wenn sich die Werte unterscheiden wird der gesamte Quellcode durch "window.history.go(0)" erneut ausgeführt ohne dass die Seite neu vom Server geladen werden muß.


Um einen Link zu setzen, der direkt auf diese Seite führt, verwende folgende Url: