Layer positionieren in Opera

con-f-use

Erfahrenes Mitglied
Preisfrage: Warum funktioniert mein Fixlayer-Script in Opera nicht, wenn es sogar im alten Netscape 4.7 läuft :confused:

Der Layer mit folgendem Inhalt
laber bla
bla laber
soll eigentlich 10px über dem unteren Rand des Browserfensters bleiben. Das macht er erwiesenermaßen in allen neueren Geckos, im IE und sogar im alten Netscape 4.7 nur eben in keinem Opera, den ich auf meiner Platte hätte.

Der Preis: Meine ewige Hochachtung. :-)
Datic, Quaese, Sven, ich zähle auf euch!
 
Zuletzt bearbeitet:
Ah, vielen Dank - gut zu wissen! :suspekt: Hab ich schon erwähnt, dass ich Browserhersteller hasse?

Mein Anliegen war eigentlich, dass es im Dreigestirn, der großen Borwser IE (win), Gecko und Qpera funktioniert. Konqueror ist zwar der KDE-standart-Borwser, aber dann doch eher exotisch und die Linux-Freunde haben ja eh fast immer einen Gecko noch mit am start.
 
Ich hab auch immer noch Mozilla und Opera drauf, man muss ja seine Seiten testen koennen. ;)
Damit ich zum Testen mit dem IE nicht rebooten muss hab ich mir jetzt sogar Win2K in einer Virtual Machine installiert, damit ich direkt unter Linux testen kann. ;)

Browserhersteller sind schon eine eigenartige Gemeinschaft.
Bin mal gespannt ob Dein Script mit dem neuen Konqueror funktioniert. Ich bin jetzt noch mit 3.4.1 unterwegs, hab aber KDE 3.5 schon runtergeladen. Immerhin besteht der neue Konqueror ja jetzt auch den Acid2-Test. :)
 
Ändere mal die erste Bedingung in
Code:
if (document.getElementById && !window.opera)
...dadurch rutscht Opera in den IE-Zweig und macht es wie gewünscht(zumindest bei mir)
 
Das war eine der ersten Sachen, die ich ausprobiert habe. Mit Opera 8.02 geht das auf jeden Fall nicht - habe es gerade nochmal getestet. Welchen Opera verwendest du denn, Sven? (Welcher Genus ist Opera eigentlich? Der, das oder die Opera?) :rolleyes:
 
Zuletzt bearbeitet:
Hehe, danke, hab's nochmal mit der neusten getestet und da geht's auf einmal so, wie du geschrieben hast. Sehr seltsam.
 
Hi,

dann will ich auch meinen Senf dazugeben.

Im Opera (7.54 u. 8.5) funktioniert das Ganze bei mir problemlos.

Anders gestaltet es sich im IE 5.01, IE5.5, im Konqueror 3.3 und im Netscape 7.1. Alle können
mit dem Objekt documentElement nichts anfangen. Stattdessen benötigen sie das body-Objekt.
Der Konqueror interpretiert zudem die clientHeight-Angabe falsch. Ich hatte hier Werte von ca. 2600.
Werden Viewport (html) und body eine Höhe von 100% zugewiesen, ist das Problem
gelöst.

Hier mein Vorschlag mit Erkennung des passenden Bodyobjekts und der Styleanpassung:
Code:
<style type="text/css">
<!--
html, body{ height: 100%;}
#menu{ position: absolute;
       left: 50%;}
-->
</style>
<script type="text/javascript">
<!--
//coded by con-f-use@gmx.net - be fair and do not remove this

var objBody = null;   // Bodyobjekt
var intOffsetY = 10;  // y-Offset

window.onload = initialize;

/* Bodyobjekt ermitteln */
function getBody(){
  if((navigator.userAgent.toLowerCase().indexOf('netscape')!=-1) ||
     (navigator.userAgent.toLowerCase().indexOf('konqueror')!=-1)){
    // Korrektur des Offsets für Netscape
    intOffsetY = 50;
    // Bodyobjekt zurückgeben
    return window.document.body;
  }else{
    //  Entsprechendes Bodyobjekt zurückgeben (CSS1Compat = Standardmode)
    return (window.document.compatMode == "CSS1Compat") ?
          window.document.documentElement : window.document.body || window.document.documentElement;
  }
}

function initialize() {
  // Passendes Bodyobjekt ermitteln
  if (document.getElementById && !window.opera)
    objBody = getBody();

  movemenu('menu');
}

function movemenu() {
  arg = movemenu.arguments;
  if(!arg[1]) arg[1]=0;

  if (document.getElementById && !window.opera) {
    obj = document.getElementById(arg[0]);
    style = obj.style;
    pos = objBody.scrollTop + objBody.clientHeight - obj.clientHeight - intOffsetY;
  } else if (document.all) {
    obj = document.all[arg[0]];
    style = obj.style;
    pos = document.body.scrollTop + document.body.clientHeight - obj.clientHeight - 10;
  } else if (document.layers) {
    obj = style = document.layers[arg[0]];
    pos = window.pageYOffset + window.innerHeight - eval('document.'+ arg[0] + '.document.height') - 10;
  }

  if (pos!=arg[1]) {
    smooth = .08 * (pos - arg[1]);
    if (smooth > 0) smooth = Math.ceil(smooth);
    else smooth = Math.floor(smooth);

    style.top = (parseInt(style.top) + smooth) + (document.layers ? '' : 'px');

    arg[1] += smooth;
  }
  setTimeout('movemenu("'+ arg[0] +'",'+ arg[1] +')', 5);
}
//-->
</script>
Vielleicht hilft dir das ja weiter.

Ciao
Quaese
 
Nur mal so zur Info: Bin grad dabei KDE 3.5 zu kompilieren, dann teste ich mal mit dem neuen Konqueror. Wird aber noch was dauern, da KDE ein Mammut-Projekt fuer den GCC ist. ;)

Nachtrag:
So, das KDE-Base-Paket ist fertig.
Auch in Konqueror 3.5 funktioniert es nicht. :(
 

Neue Beiträge

Zurück