rankspirit Visiter le site RankSpiritAller au début du texteVoir le code source de cette page

Comment utiliser les CSS pour obtenir une mise en page avec un menu fixe
sur tous les navigateurs

Solution avec une utilisation conditionnelle de Javascript

Faire en sorte de conserver un menu fixe, même lorsque l'internaute fait défiler le texte de la page, est le rêve de beaucoup de concepteurs de site. Cette disposition facilite grandement la navigation en proposant à l'internaute un repère fixe et toujours présent.

L'expérience démontre que la présence d'un menu fixe améliore le confort de navigation, fidélise les visiteurs et augmente sensiblement le temps passé sur le site et l'appréciation générale que les internautes en font.

Ce besoin tout à fait évident trouve une solution simple et élégante à l'aide des CSS. Malheureusement, si cette solution fonctionne parfaitement avec tous les navigateurs "modernes" (FireFox, Mozilla, Opera, ...), Internet Explorer 5.5 et 6.x ne reconnaissent pas les instructions qui permettent de réaliser ce type de mise en page (mais comme nous allons le voir, il y a une astuce !)

Le principe des "frames" permet de régler le problème. Les "frames" sont hélas un système obsolète qui ne répond plus aux normes Web actuelles et qui présente de graves inconvénients notamment en ce qui concerne le référencement des sites qui l'utilisent.

Devant ces difficultés, la plupart des concepteurs de site renoncent aux formidables avantages que présentent les menus fixes.

La solution présentée ici fait le pari de contourner l'ensemble des obstacles ennoncés ci-dessus et de proposer un code conforme avec les normes Web actuelles et compatible avec la quasi-totalité des navigateurs existant (dont Internet Explorer).

Mille merci à Alan du forum Alsacréation pour son aide dans la mise au point de cette solution ainsi qu'à "Batraciens", l'Université de Lille, TagSoup et Alex Robinson pour les pages qu'ils ont déjà publié sur ce thème.

 

1- Principes de base du CSS

Pour comprendre le principe de mise en page proposée, il est d'abord essentiel de bien comprendre les principes de base du positionnement des blocs avec le CSS. Si toutefois vous vous sentez parfaitement à l'aise avec le CSS, vous pouvez sauter ce paragraphe.

a) Emboîtement des blocs

<html>
<body>
<div id="mon_style_css">
</div>
</body>
</html>

Les blocs définis en CSS peuvent s'emboîter les uns dans les autres. Le premier bloc d'une page est le bloc <html> dans lequel vient se positionner le bloc <body>.

Dans un cas de ce type, on dit que le bloc <html> est le "parent" et que le bloc <body> et le fils. Tous les blocs CSS que vous créerez seront des "enfants" du bloc <body> à l'intérieur duquel ils se positionneront. Vos propres blocs pourront eux-même avoir des "enfants", ou des "frères" (blocs ayant le même parent).

b) Ascenseurs automatiques par défaut

overflow: auto

- Par défaut, le bloc <html> occupe toute la fenêtre du navigateur (bien qu'Internet Explorer réserve une petite marge à droite et une autre en bas pour les ascenseurs), et le bloc <body> remplit complètement le bloc <html>.

- Par défaut, le bloc <html> est pourvu d'ascenseurs automatiques. Si vous remplissez le bloc <body> avec une grande quantité de texte et d'image, un ascenseur sera nécessaire pour visualiser l'ensemble du contenu de la page. Etant donné que le bloc <body> n'a généralement pas d'instruction particulière concernant la gestion des ascenseurs il renvoi la demande à son bloc parent, c'est à dire <html>. Ce bloc affiche alors un ascenseur qui permet de faire défiler l'ensemble de son contenu, c'est à dire l'ensemble du bloc <body> (une vraie partie de ping-pong !).

La quasi-totalité des sites que vous pouvez visiter sur le Web utilise ce système d'ascenseur automatique : le bloc <body> est rempli avec l'ensemble du contenu à présenter et son ascenseur permet de faire défiler l'ensemble du contenu comme on voit défiler un paysage à travers la fenêtre d'un véhicule.

A l'inverse, notre proposition de mise en page vous permet de positionner des ascenseurs indépendants sur chaque bloc et multiplie donc le nombre de "fenêtres" permettant de faire défiler du contenu.

c) Positionnements " static ", " fixed ", " relative " et " absolute "

position: static

Le type de positionnement par défaut de tout bloc est "static". Avec cette propriété, le bloc sera positionné dans le "flux" de la page. C'est à dire que si ce bloc est placé au milieu d'un texte, il se déplacera avec le texte. Ajoutez du texte au dessus et le bloc descend.

Quand un bloc est positionné en "static", les propriétés, top, left, bottom, right et margin sont ignorées et ne servent à rien.

position: relative

Le bloc reste positionné dans le flux, mais peut être plus ou moins décalé à l'intérieur du flux grace aux propriétés top, left, bottom, right et margin-top, margin-left, margin-bottom, margin-right .

position: absolute

Le bloc sort du flux, c'est à dire qu'il ne tient plus du compte des autres éléments contenus dans son bloc parent.

Ne vous laissez cependant pas tromper par le terme "absolute" : cet "absolute" est en quelque sorte relatif, puisque les propriétés top, left, bottom, right et margin positionneront le bloc par rapport à son bloc parent. Si le bloc parent a pour propriété "left: 10px" et que votre bloc fils a pour propriété "left: 20px", il sera en fin de compte décalé de 10+20 = 30px par rapport au bord du bloc qui contient le bloc parent.

position: fixed

Le bloc est positionné par rapport à la fenêtre du navigateur, indépendamment du flux et de la position de son bloc parent. C'est a priori la propriété idéale pour définir un menu fixe dans une page mouvante. Malheureusement, Internet Explorer 5.5 et 6.x ne reconnaissent pas cette propriété que nous n'utiliserons donc pas dans notre conception.

d) Taille des blocs

width: xxpx ; height: xxpx

Quand on aborde la mise en page, le premier réflexe consiste à créer des blocs de hauteur et de largeur fixe, définies par " width: " et " height: ". Cette façon de procéder est toutefois bien mal adaptée à la diversité des écrans existant dans le monde. Pour que votre site reste utilisable par tout les internautes, vous devrez fixer des dimensions très faibles qui ne conviendront pas aux utilisateurs équipés de grands écrans.

width: xx% ; height: xx%

La première option consiste à fixer une hauteur et une largeur en %. Notez toutefois que cela ne pourra fonctionner que si le bloc parent a des propriétés de dimension clairement définies (le pourcentage est en effet calculé par rapport aux dimensions du bloc parent). Si l'idée est de fixer la taille d'un bloc à 100% de la hauteur ou de la largeur, ce type de dimensionnement est parfait. Si vous souhaitez par contre contre faire cohabiter plusieurs blocs côte à côte, il est essentiel que tous ces blocs soient dimensionnés en pourcentages. Mélanger un dimensionnement fixe (exprimé en px) avec un dimensionnement en pourcents n'est pas une bonne idée car le total de vos hauteurs ou de vos largeurs ne pourra plus être égal à 100%.

hauteur fixe ou en pourcentage

 

Taille fixée par top, left, bottom et right

Si on ne précise ni largeur ni hauteur, la taille d'un bloc peut être calculée à parti de la position de ses bords.

Par exemple :

- top: 0; bottom: 0; forcera la taille du bloc à 100% de la hauteur du bloc parent
- top: 0; bottom: 10px; forcera la taille du bloc à la hauteur du bloc parent moins 10 pixels.

Cette solution est idéale pour mettre en place un bloc exploitant toute la place laissée libre par un bloc de dimensions fixes.
Attention toutefois : ce type de dimensionnement ne fonctionne pas avec Internet Explorer dans ses versions antérieures à la 7.0.

 

2- Comment contourner ces limitations

A la lecture de ce qui précède, on s'apperçoit que les limitations d'Internet Explorer 5.5 et 6.x présentent deux difficultés importantes pour la réalisation d'une mise en page avec menu fixe. Voici comment nous avons contourné ces difficultés.

- Position: fixed n'est pas reconnu par Internet Explorer 5.5 et 6.0

à) L'ascenseur automatique du bloc <html> est désactivé à l'aide de l'instruction overfow: hidden . De ce fait, le "flux" de ce bloc principal est bloqué (son contenu restera fixe).

b) Tous les blocs (y compris le menu et le bloc qui contiendra le texte) sont positionnés dans le bloc <body> à l'aide de position: absolute .

<html> ayant un flux bloqué, le bloc <body> hérite de ses propriétés et restera également fixe. Dans cette configuration particulière, la position "absolute" devient donc équivalente à la position "fixed".

c) On crée un bloc qui contiendra le texte de la page et on lui donne l'attribut overflow: auto ; ce qui le dotera d'ascenseurs permettant de faire défiler son contenu.

En résumé : l'ascenseur de la page est désactivé et sera remplacé par l'ascenseur d'un bloc indépendant qui contiendra le texte de la page.

Note : une fois cette configuration mise en place, il est parfaitement possible de créer dans notre page plusieurs blocs indépendants pourvus d'ascenseurs et contenant chacun un texte. Le bloc qui contiendra les menus pourra lui-même être pourvu d'un ascenseur afin de gérer les menus trop longs pour tenir dans la page (n'oubliez pas que la page peut avoir n'importe quelle dimension selon le type d'écran de l'utilisateur et la taille qu'il souhaite donner à la fenêtre du navigateur).

 

- top, left, bottom et right permettent de donner une position, mais ne permettent pas de donner une taille avec Internet Explorer 5.5 et 6.0

Le bloc fixe contenant le menu ayant généralement une largeur et/ou une hauteur constante, il est donc délicat d'exploiter le reste de l'espace avec un bloc de taille variable. Cette difficulté est contournée par deux biais :

a) Une feuille de style particulière est fabriquée à l'attention d'Internet Explorer. Dans cette feuille, la dimension des blocs est calculée en Javascript. On obtient ainsi exactement le même résultat que si IE était capable de calculer la taille d'un bloc en fonction de la position de ses bords.

b) Une autre feuille de style est générée pour les utilisateurs équipés d'Internet Explorer et ayant désactivé le Javascript. Dans ce cas, on réactive l'ascenseur du bloc <html> et on se retrouve avec une page défilante traditionnelle (les menus ne seront plus fixes dans ce cas particulier).

En résumé : les feuilles de style générées par CSS Frame Player permettent d'obtenir une compatibilité avec l'ensemble des navigateurs, quelles que soient leurs versions. Le menu ne sera toutefois pas fixe pour les utilisateurs équipés d'Internet Explorer et ayant désactivé le Javascript (1 à 10% des utilisateurs, selon les études réalisées sur le sujet).

 

3- Les limites de cette solution de mise en page :

a) Les blocs horizontaux que vous définirez comme "fixes" consomment une partie de la hauteur de page disponible. Prenez garde à ne pas trop réduire cette hauteur sous peine de forcer vos utilisateurs à faire défiler le texte principal dans un rectangle "écrasé" offrant une faible visibilité.

b) Si votre ou vos bloc(s) fixes ont une hauteur fixe (le "header"/en-tête, par exemple), attention à ce qui peut se produire si l'utilisateur augmente la taille des polices : le texte contenu dans ces blocs risque d'être "rogné" et de devenir illisible. Essayez donc de réserver les blocs de hauteur fixe à l'affichage d'images ou placez des ascenseurs dans ces blocs. Nous vous conseillons en particulier de placer un ascenseur " auto " dans votre bloc menu pour être sûr que l'ensemble de votre menu sera toujours accessible.

c) La navigation à l'aide du clavier n'est plus possible pour Internet Explorer 5.5 et 6.x ainsi que pour Firefox antérieur à la version 1.5 : impossible de "scroller" directement via les flèches du clavier ou via la molette de souris. Un clic dans le bloc "scrollable" permet toutefois de rétablir ces fonctionnalités. A partir de la version 1.5 de FireFox, comme pour Opera, on peut également rétablir ces fonctionnalités en déplaçant le curseur sur le bloc "scrollable" à l'aide de la touche de tabulation.

Cet inconvénient pourrait être réglé avec un petit script donnant le "focus" au bloc principal au moment de l'ouverture de la page.

d) Comme nous l'indiquons plus haut, les utilisateurs équipés d'Internet Explorer 5.5 et 6.x qui ont désactivé le Javascript (1 à 10% des utilisateurs, selon les études réalisées sur le sujet) ne bénéficieront pas des menus fixes. Ils pourront toutefois naviguer sur le site en mode "traditionnel".

 

4- Une variante sans utilisation de Javascript

Une variante de ce type de mise en page n'utilisant pas le Javascript est également proposée sur ce site.

Valid HTML 4.01 Transitional