CSS-Position

Freie Wahl der Position auf der Webseite

Sowohl Netscape als auch Microsoft konnten bereits in älteren Browsern (verschiedene) Funktionen zur Positionierung von Elementen anbieten. Diese Funktionen sind durch den CSS-Standard überholt: Alle gängigen Browser beherrschen die wichtigsten Methoden zur Positionierung.
Cascading Stylesheets CSS Cascading Stylesheets
Relative Position Position bezogen auf die normale Lage eines Elements
Absolute Position Position bezogen auf das body-Element (Demo: Analog-Uhr)
Fixe Position Fixe Position bezogen auf das Bildschirm-Fenster
Pseudo-Fixiert Javascript-Tricks simulieren fixierte Position
z-Index Schichten und ihre Reihenfolge
Bewegung Bewegung von Schichten - automatisch oder interaktiv
Programmierung Entwicklungs-Tipps für Javascript
CSS-Einheiten Positions-Daten in mm, cm, px, pt, %
Position lesen Positions-Daten eines automatisch positionierten Elements ermitteln

Relative Position

Bei der relativen Position liegt der Ursprung des Koordinatensystems ("Nullpunkt") dort, wo ein Element 'normal' ohne sonstige Positionierung beginnen würde.
Steuern sie hier die Position des blauen Punkts:
left: 0px;
top: 0px;
<img id="rp1" src="blue.gif" style="position:relative; left:0px; top:0px;" />
Mit Javascript ( Live-get_relpos('rp1')-Test) können sie jederzeit die aktuelle Position des Elements lesen.
Details im Absatz Programmierung (unten).
Eine Javascript-Funktion ( Live-reset_relpos('rp1')-Test) setzt den Punkt auf seine Angangs-Position.
Details unten im Absatz 'Programmierung'.
Verwenden sie diese einfachste Art der Positionierung, wenn möglich.
Sie funktioniert mit allen gängigen Browsern
Auch negative Positions-Werte sind möglich !
Die Position gilt für die linke obere Ecke des eingestellten Elements.
Für alle Arten der Positionierung gilt: Jedes Element kann die angezeigte Fläche (hier: den Hauptrahmen) verlassen, es wird dann aber nicht mehr angezeigt.

Absolute Position

Steuern sie hier die Position des roten Punkts:
left: 0px;
top: 0px;
<img id="ap1" src="red.gif" style="position:absolute; left:0px; top:0px;" />
Mit Javascript ( Live-get_relpos('rp1')-Test) können sie jederzeit die aktuelle Position des Elements lesen.
Details im Absatz ↓ Programmierung.
Eine Javascript-Funktion ( Live-reset_relpos('rp1')-Test) setzt den Punkt auf seine Angangs-Position.
Details im Absatz ↓ Programmierung.
Verschiedene Browser und Versionen bauen eine Webseite etwas anders auf, außerdem kennen sie bei der Programmierung nicht die Größe des Browser-Fensters.
Absolute Positionierung und einfach und sinnvoll, wenn sie ein Element auf der ganzen Webseite bewegen wollen.
Wenn sie mit absoluter Positionierung eine bestimmte Stellen genau erreichen wollen, dann erfordert das zusätzlichen Aufwand:
Um z.B. den roten Punkt absolut zu positionieren, muss zuerst Live die reale Position des Text-Kastens gemessen werden, in dem sich der Punkt befinden soll. Dann wird der Punkt einige Pixel rechts unterhalb davon absolut positioniert.
Details dazu im Absatz über die ↓ Messung der Position automatisch positionierter Elemente.
Demo: CSS Analog -Uhr Live-Demonstration: → Analog-Uhr mit CSS und Javascript.  

Fixierte Position

Fix positionierte Elemente orientieren sich nicht an der Webseite sondern am Fenster. Sie bleiben daher beim Rollen (scroll) einer Webseite stehen.
Auf dieser Seite ist ein Absatz fix positioniert, wird jedoch nur auf ihren Wunsch eingeblendet:
Damit ist es z.B. möglich, feststehende Navigations-Menüs ohne Rahmen (frames) zu erstellen. Funktioniert mit allen moderenen Browsern, nicht mit M$IE. Dieser Fehler wurde angeblich in M$IE 7 behoben, das ist zumindest für die verfügbare Vorversion nicht richtig . .
Steuern sie hier die Position des fixierten Absatzes im Fenster:
left: 0px;
top: 0px;

<div id="fp1" style="position:fixed; left:0px; top:0px;"> ... </div>
Mit Javascript ( Live-get_relpos('rp1')-Test) können sie jederzeit die aktuelle Position des Elements lesen.
Details im Absatz ↓ Programmierung.
Eine Javascript-Funktion ( Live-reset_relpos('rp1')-Test) setzt den Punkt auf die Angangs-Position.
Details im Absatz ↓ Programmierung.

Pseudo-Fixierte Position

Solange veraltete Versionen des MSIE-Browsers noch keine ↑ fixierte Position beherrschen, hilft dieser Trick:
Ein pseudo-fix positionierter Absatz wird auf ihren Wunsch rechts unten angezeigt:
Das Prinzip:
Javascript misst die Größe des Fensters und seine momentane Position, berechnet daraus die absolute Position des Elements und stellt sie ein.
Die Programmierung ist relativ aufwändig und leider je nach Browser unterschiedlich. Außerdem 'hüpft' das Element bei jeder Änderung.
Details finden sie im Quelltext dieser Webseite.

Sie müssen die beiden → Ereignisse (Events) onscroll (Rollen der Seite) und onresize überwachen. In beiden Fällen muss die absolute Position eines "pseudo-fixierten" Elements geändert werden.
Dieser Trick muss verwendet werden, bis der MSIE Browser endlich die ↑ fixierte Position nach CSS-Standard beherrscht...
Allerdings hat der Hersteller bereits mehrmals bekundet, sich um irgendwelche Standards nicht zu kümmern (...hat keine Priorität...)
Die Live-Daten des letzten Messung:
Fenster-Breite = 0px
Fenster-Höhe = 0px;
Horizontaler Scroll = 0px;
Vertikaler Scroll = 0px;
Daraus berechnete absolute Position:
left = 0px;
top = 0px;

Programmierung in Javascript

Lesen und Schreiben der Positions-Daten erfolgt genauso wie bei jeder anderen Eigsnchaft des style-Objekts. Allerdings sind einige Punbkte zu beachten:

Wenn einem Element im HTML-Quellcode die 3 style-Eigenschaften position, left, top zugewiesen wurden, dann ist der Zugriff darauf mit Javascript möglich.
Das gilt auch dann, wenn die Eigenschaften mit der document.write Methode von Javascript oder mit DOM-Methoden festgelegt wurden.
Wenn diese 3 Eigenschaften nicht definiert wurden, dann sind sie unbestimmt. Von der Verwendung mit Javascript ist dann abzuraten.

Wenn die style-Eigenschaft position anfänglich festgelegt wurde, dann kann sie gelesen, aber nicht mehr geändert werden. Die beiden Eigenschaften left und top können beliebig geändert werden.

Zur Identifikation eines DOM-Knotens wird in den Beispielen die Methode getElementById verwendet, die sich auf das id-Attribut eines HTML-Elements bezieht. Alternativ kann jede andere Methode der Identifizierung verwendet werden. (Details)

Lesen der Positions-Daten:

Die Beispiel-Funktion get_pos liest die 3 Positions-Daten eines Elements und zeigt sie in einem Meldungs-Fenster an.
Voraussetzung: Diese 3 style-Eigenschaften wurden vorher definiert.

Live--Javascript mit 3 verschiedenen Elementen dieser Webseite, identifiziert durch ihre id-Attribute:
Relativ positioniert: get_pos('rp1');
Absolut positioniert: get_pos('ap1');
Fix positioniert: get_pos('fp1');
Nicht (=automatisch) positioniert: get_pos('np1');
function get_pos(id) {
var t="Position ('"+id+"'):";
var n=document.getElementById(id);
var p=n.style.position;
t+="\nposition = "+p;
var x=n.style.left;
t+="\nleft = "+x;
var y=n.style.top;
t+="\ntop = "+y;
var z=n.style.zIndex;
t+="\nz-index = "+z;
alert(t);
}

Schreiben der Positions-Daten:

Die Beispiel-Funktion reset_pos überschreibt vorhandene Positions-Daten und setzt das angesprochene Element an den Ursprung seiner position-Koordinaten.
function reset_pos(id) {
var n=document.getElementById(id);
n.style.left="0px";
n.style.top="0px";
}

Änderung der Positions-Art:

Es ist möglich, diese Eigenschaft zu ändern. Dabei bleiben jedoch die CSS-Eigenschaften left und top erhalten, d.h. das Element springt dabei an einen anderen Platz. Ändern sie daher Positions-Art und Koordinaten - wenn überhaupt - nur gemeinsam.
n=document.getElementById(id);
alert("position="+n.style.position);
n.style.position="absolute";
n.style.position="relative";

Verschieben eines Elements:

Die Beispiel-Funktion move_pos überschreibt vorhandene Positions-Daten, um ein Element um eine bestimmte Strecke (dx,dy) zu verschieben.

Die beiden Argumente dx und dy wurden evtl. als Text übergeben. Sie werden daher sicherheitshalber mit parseInt in ganze Dezimalzahlen umgewandelt.

Die aktuellen Positions-Daten x,y werden gelesen: Manche Browser liefern dabei Zahlen, andere Texte mit 'px'. Deshalb wird ein allfälliger Text 'px' mit einem → Regulären Ausdruck entfernt, der Rest in eine Dezimalzahl umgewandelt.
Damit wird die neue Position berechnet.

Beim Schreiben von Positions-Daten fügen sie am besten die ↓ Einheit 'px' dazu, das funktioniert mit allen gängigen Browsern.

Sehen sie dazu auch die Beispiele auf der Seite über CSS-Schichten.
function move_pos(id,dx,dy) {
var n=document.getElementById(id);
dx=parseInt(dx,10);
dy=parseInt(dy,10);
if(dx!=0) {
var x=n.style.left.replace(/px/,"");
x=parseInt(x,10)+dx;
n.style.left=x+"px";
}
if(dy!=0) {
var y=n.style.top.replace(/px/,"");
y=parseInt(y,10)+dy;
n.style.top=y+"px";
}
}

CSS-Einheiten

Hier werden als Einheit für die Positionierung nur Pixel (px) verwendet.
Alternativ kann man alle in CSS zulässigen Einheiten verwenden: mm, cm, %, pt, px.
Pixel (px) eignen sich nur für den Monitor. Wenn ein Ausdruck in Frage kommt, müssen sie dafür andere Einheiten wählen, noch besser eine eigene Webseite für den Druck erstellen ( Details).

Punkt (pt) wird zur Einstellung von Schrift-Eigenschaften verwendet, kommt daher für Text-Elemente in Frage.

Position und Maße von automatisch positionierten Elementen

Die Live-'Messung' der realen Position von automatisch positionierten Elementen ist Voraussetzung für die Anwendung der ↑ absoluten Positionierung:

Erst wenn sie wissen, wo sich ein bestimmtes Element (z.B. dieser Text-Kasten) befindet, können sie andere Elemente dorthin manöverieren.
In diesem Beispiel soll die absolute Position des schwarzen Punkts bestimmt werden. Der Punkt mit dem Attribut id='np1' ist nicht positioniert, d.h. seine Position ergibt sich aus dem automatischen Aufbau der Webseite.

Man sollte glauben, dass die aktuellen Positions-Daten aller Elemente einer Webseite leicht zugänglich sind. Das ist möglich, aber unerwartet mühsam:
Gecko-Browser (Firefox, Mozilla, ...) bieten die Javascript-Eigenschaften x und y, die jedes HTML-Element aufweist. Das funktioniert schnell und elegant, allerdings nicht mit M$IE (auch nicht mit der 'neuen' Version 7).

Höhe und Breite sind über die Methode getComputedStyle zugänglich, ebenfalls ohne M$IE.

Die Befehle sind in try-Blöcke eingebettet, damit allfällige Fehlermeldungen (z.B. von einem M$IE-Browser) abgefangen und ignoriert werden.

Verwenden sie diesen Live-get_relpos('rp1')-Test, um die absolute Position des schwarzen Punktes (neu) zu bestimmen und das Ergebnis rechts einzutragen.
Position:
var n = document.getElementById("np1");
try {
var x = n.x;
var y = n.y;
}
catch(e) {}
Höhe und Breite:
try {
h = window.getComputedStyle(n,null).height;
w = window.getComputedStyle(n,null).width;
}
catch(e) {}
Ergebnis:   x=?   y=?   h=?   w=?
Bei MSIE ist die Positions-Bestimmung unerfreulich kompliziert: Die Eigenschaften offsetLeft und offsetTop geben nur die Position relativ zum Eltern-Element an.

Mit dem Objekt offsetParent kann man sich das Positions-bestimmende Eltern-Element holen, dann von diesem offsetLeft und offsetTop bestimmen usw.
Diese Schleife wird bis zum <body>-Element wiederholt, sämtliche Offset-Werte summiert. Als Nebenprodukte fallen Höhe und Breite an. Dieses Verfahren funktioniert mit allen gängigen Browsern.

Höhe und Breite sind über die Methode currentStyle zugänglich.

Verwenden sie diesen Live-get_relpos('rp1')-Test, um die absolute Position des schwarzen Punktes (neu) zu bestimmen und das Ergebnis rechts einzutragen.
Der MSIE Browser liefert in vielen Fällen nur die unbrauchbare Aussage 'auto'
Position und Maße:
try{
var n = document.getElementById("np1");
var x = 0;
var y = 0;
var h = n.offsetHeight;
var w = n.offsetWidth;
while(n) {
x+=n.offsetLeft;
y+=n.offsetTop;
n = n.offsetParent;
}
}
catch(e) {}
Höhe und Breite:
try{
h = n.currentStyle.height;
w = n.currentStyle.width;
}
catch(e) {}
Ergebnis:   x=?   y=?   h=?   w=?

Ereignisse (Events)

Normalerweise messen sie die Position einmalig unmittelbar nach dem Laden der Webseite, d.h. nach dem Ereignis (event) onload. - Das Beispiel rechts enthält dort ein Alarmfenster als Platzhalter.

Wenn die aktuelle Position wichtig ist, dann wird die Berechnung zusätzlich an das Ereignis (event) onresize gebunden.
Das Layout der Webseite wird vom Browser nach jeder Änderung der Fenster-Größe neu aufgebaut.

Details zur Programmierung von Ereignissen (events) mit Javascript.
<html>
<head>
. . .
<script type="text/javascript">
function my_onload() {
alert("onLoad !"); // Position hier messen
}
</script>
</head>
<body onload="my_onload()">
. . .
</body>
</html>