molily: position:fixed-fähige Browser erkennen

Beitrag lesen

Hallo zusammen,

In http://forum.de.selfhtml.org/archiv/2002/11/29991/ stellte ich den Artikel http://home.t-online.de/home/dj5nu/css-position-fixed.html vor, in welchem Workarounds für die Verwendung von position:fixed und Ankern diskutiert werden. Ich kam bezüglich der JavaScript-Lösung, welche an alle dokumentinternen Anker ein zusätzliches onclick mit einem window.scrollBy()-Aufruf vergibt, zu der Konklusion, dass eine möglichst serverseitige Abfrage nötig ist, welche den entsprechenden Funktionsaufruf nur einbinden darf, wenn der Benutzer einen Browser verwendet, welcher bekannt dafür ist, position:fixed zu unterstützen (siehe zweiter Absatz von "Nachteile der JavaScript-Lösungen").

Orlando kommentierte dazu:

Deine Schlussfolgerung, dass man serverseitig den Client ermitteln muss, um zu entscheiden, ob man die JS-Lösung einsetzen kann, oder nicht, kann ich nicht so recht nachvollziehen. Da du position:fixed ohnehin per Selektor einbindest (und das musst du ja), kannst du natürlich per DOM herausfinden, ob es der Browser gefunden hat, oder nicht.

Ich entgegnete:

Daran dachte ich auch schon. [...] Zwischen "der Browser interpretiert Kindselektoren" und "der Browser unterstützt position:fixed" beziehungsweise "der Browser wendet es erfolgreich an" [...] besteht meiner Vermutung nach keine zuverlässige Verbindung...

Weiterhin schlug Orlando vor:

if(document.getElementById("header").style.position == "fixed") { ...

Auf die Idee bin ich natürlich nicht gekommen, beziehungsweise ich hielt sie nicht für sehr zuverlässig, ich dachte eher daran, die top- oder left-Parameter abzufragen, sozusagen der "computed value"... oder so, da müsste es doch irgendwo ein Unterscheidungskriterium geben. Das ist aber auf den zweiten Blick Kappes.

Tatsächlich nützt es nichts, die Objekteigenschaft style.position abzufragen, sie ist entweder leer oder undefined: IE 6: leer, Opera 6.05: undefined, Opera 7: leer, Mozilla 1.2: leer.

Der Stylesheet dazu ist natürlich:

#murks {position:absolute; ...}
body > #murks {position:fixed;}

Nun habe ich versucht, den Wert zusätzlich zum Stylesheet festzulegen, um danach zu prüfen, ob er angenommen wurde:

document.getElementById('murks').style.position='fixed';

Danach lässt sich der Wert über document.getElementById('murks').style.position abrufen, jedoch interpretiert es MSIE als static (weil unbekannt), gibt aber dennoch fixed zurück. Somit ist diese Prüfung unnütz.

Wie ich vorhersagte, wäre die einzig sichere Methode getComputedStyle(), wobei dies nur von Gecko/Mozilla unterstützt wird (nicht Opera 7 :-/ ), somit kommt es für die Abfrage, ob der Browser position:fixed unterstützt, momentan nicht in Frage.

if (document.defaultView.getComputedStyle(document.getElementById('murks'), null).getPropertyValue('position')=='fixed') { ...

Das bringt mich in eine Zwickmühle, denn ich stimme Orlando im Grunde zu und würde in jedem Falle eine komplexe Browserabfrage vermeiden wollen, beziehungsweise die Empfehlung an den Leser, diese zu entwickeln.

Weitere Möglichkeiten fallen mir nicht ein, also muss anscheinend tatsächlich ein stupides Abfragen des User-Agent-Headers her... Sachdienliche Hinweise[tm] sind gewünscht.

Grüße,
Mathias

--
Remember: KING KONG Died For Your Sins!
"ich belle ich fauche ich keife ich röchle ich knurre ich schreie ich wimmer ich bibber ich zitter ich ICH!"
Naïve Nonsens-Poesïe http://home.t-online.de/home/dj5nu/lit-nonsens.html