Je viens de me prendre le chou sur une découpe CSS un peu spéciale. En effet, mon client voulait une sorte de chrono qui ne bouge pas sur la page. Le chrono était présent sur la colonne gauche (float) de la page, elle même centrée avec un margin: 0 auto.
Les propriétés vicieuses du position fixed
Lorsque l’on lit les propriétés officielles du W3C, on peut lire cela sur cette propriété :
Comme dans un positionnement absolu, le contenu concerné est retiré totalement du flux. Mais il est cette fois positionné uniquement par rapport aux limites de la zone de visualisation, autrement dit la fenêtre du navigateur. Le défilement de la page n’a aucun effet sur un contenu en position fixe.
Ainsi, si tu veux fixer un div par rapport à un autre div, tu l’as dans le c**. Enfin du premier abord car j’ai trouvé comment faire en voyant le truc sur un autre site et en réglant également le problème d’IE6 (faut toujours qu’il nous les brise celui-là).
Première partie, pour les navigateurs récents
Déjà, le div que vous voulez fixer sur la page sans qu’il soit affecté par le défilement vertical, mettez lui la propriété fixe mais sans top et left. Avec ces deux propriétés d’inscrites, le div va bien être fixé mais par rapport aux bord gauche et haut de l’écran du navigateur et donc si l’utilisateur à une taille de navigateur différent du mien, le div va chevaucher les autres parties du site. Bref, voilà le code :
#chrono { //C'est mon exemple de chrono
position: fixed;}
Ainsi, en ne spécifiant pas le top et le left, les navigateurs safari, firefox et ie7 vont fixer le div sur l’écran mais également par rapport à ses div parents ! Bref, voilà l’histoire réglée pour nos navigateurs les plus récents.
Deuxième partie, pour IE6 (vivement qu’il disparaisse…)
Pour IE6, nous allons utilisé un hack. Hein ? En gros, un bout de code qui ne sera lu que par IE6. Moi, je l’ai mis dans la feuille de style dédiée à IE6. Rappel pour appeler des feuilles de style pour chaque navigateur :
<!-- Feuille de tous les navigateurs -->
<link rel="stylesheet" type="text/css" media="screen" href="css/structure.css" />
<!-- Feuille de IE7 -->
<!--[if gt IE 6]><link rel="stylesheet" type="text/css" media="screen" href="css/structure_ie7.css" /><![endif]-->
<!-- Feuille de IE6 -->
<!--[if lte IE 6]><link rel="stylesheet" type="text/css" media="screen" href="css/structure_ie6.css" /><![endif]-->
C’est donc dans la feuille de style structure_ie6.css que nous allons travailler.
Il faut entourer votre div que vous voulez fixer d’une autre div avec une classe appelée fixe :
<div class="fixe>
<div id="chrono">
</div>
</div>
Dans la feuille de style de IE6, mettez ceci :
.fixe {position: fixed;
z-index: 2;
}
*html .fixe { /* only ie6 : hack position fixe */
position: absolute;
top: expression((document.documentElement.scrollTop || document.body.scrollTop) +
this.offsetHeight+225);
left: -206px;
}La propriété top que vous voyez contient donc un code interprété uniquement par IE6. Modifiez le chiffre 225 pour descendre ou monter votre div fixé. Modifiez le left: -206px; pour rapprocher ou éloigner de la bordure gauche.
Tout ceci est validé par le W3C validator.
Voilà, c’est tout ! Enfin, quand même bien deux heures de galère… Ciao !
4 commentaires