<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><head>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /><title>Pseudo frames avec «&nbsp;height: expression&nbsp;»</title>

<style type="text/css">
body {
margin: 0px;
padding: 0px;
}
html {
margin: 0px;
padding: 0px;
overflow: hidden;
}
img {
border: none;
}
#top {
height: 52px;
BACKGROUND: #FFEFC5;
overflow: auto;
text-align: center;
}
#content {
position: absolute;
top: 52px;
left: 0;
right: 0;
bottom: 0;
overflow: auto;
background: #F9FFE1;
padding: 20px;
}

.decal1 {
padding-left: 30px;
}
.decal2 {
padding-left: 30px;
}
.centered {
text-align: center;
}

.rouge {color: #FF0000}

</style>
<!--[if IE 6]>
<style type="text/css">
#content {
height: expression(document.documentElement.clientHeight -52 -40);
width: expression(document.documentElement.clientWidth -0 -40);
}
</style>
<noscript>
<style>
html {OVERFLOW: auto;}
</style>
</noscript>
<![endif]-->
<!--[if lt IE 6]>
<style type="text/css">
html {OVERFLOW: auto;}
#content {OVERFLOW: hidden;}
</style>
<![endif]-->
</head>
<body>

<div id="top">
<h3 style="padding-top: 5px;top: 5px;font-size: small;"><a href="http://www.rankspirit.com/indexfr.php"><img src="paporange.gif" width="20" height="18" alt="rankspirit" /> Visiter le site RankSpirit</a> &#8226; <a href="#lorem">Aller au d&eacute;but du texte</a> &#8226; <a href="alan2_zapman2_code.htm">Voir le code source de cette page</a> </h3>
</div>

<div id="content">
<h2 class="centered"><a name="lorem" id="lorem"></a>Comment utiliser les CSS pour obtenir une mise en page avec un menu fixe<br />
sur tous les navigateurs </h2>
<h4 class="centered">Solution avec une utilisation conditionnelle de Javascript </h4>
<p> Faire en sorte de conserver un menu fixe, m&ecirc;me lorsque l'internaute fait d&eacute;filer le texte de la page, est le r&ecirc;ve de beaucoup de concepteurs de site. Cette disposition facilite grandement la navigation en proposant &agrave; l'internaute un rep&egrave;re fixe et toujours pr&eacute;sent.</p>
<p>L'exp&eacute;rience d&eacute;montre que la pr&eacute;sence d'un menu fixe am&eacute;liore le confort de navigation, fid&eacute;lise les visiteurs et augmente sensiblement le temps pass&eacute; sur le site et l'appr&eacute;ciation g&eacute;n&eacute;rale que les internautes en font.</p>
<p>Ce besoin tout &agrave; fait &eacute;vident trouve une solution simple et &eacute;l&eacute;gante &agrave; l'aide des CSS. Malheureusement, si cette solution fonctionne parfaitement avec tous les navigateurs &quot;modernes&quot; (FireFox, Mozilla, Opera, ...), Internet Explorer 5.5 et 6.x ne reconnaissent pas les instructions qui permettent de r&eacute;aliser ce type de mise en page (mais comme nous allons le voir, il y a une astuce !)</p>
<p>Le principe des &quot;frames&quot; permet de r&eacute;gler le probl&egrave;me. Les &quot;frames&quot; sont h&eacute;las un syst&egrave;me obsol&egrave;te qui ne r&eacute;pond plus aux normes Web actuelles et qui pr&eacute;sente de graves inconv&eacute;nients notamment en ce qui concerne le r&eacute;f&eacute;rencement des sites qui l'utilisent.</p>
<p>Devant ces difficult&eacute;s, la plupart des concepteurs de site renoncent aux formidables avantages que pr&eacute;sentent les menus fixes.</p>
<p>La solution pr&eacute;sent&eacute;e ici fait le pari de contourner l'ensemble des obstacles ennonc&eacute;s ci-dessus et de proposer un code conforme avec les normes Web actuelles et compatible avec la quasi-totalit&eacute; des navigateurs existant (dont Internet Explorer).</p>
<p>Mille merci &agrave; Alan du forum <a href="http://forum.alsacreations.com/forum.php">Alsacr&eacute;ation</a> pour son aide dans la mise au point de cette solution ainsi qu'&agrave; &quot;<a href="http://batraciens.net/css-astuces/zone-fixe-1.htm">Batraciens</a>&quot;, l'<a href="http://www.grappa.univ-lille3.fr/polys/htmlcss-2004/index.php?page=css_ie">Universit&eacute; de Lille</a>, <a href="http://tagsoup.com/-dev/null-/css/fixed/">TagSoup</a> et <a href="http://www.fu2k.org/alex/css/frames/">Alex Robinson</a> pour les pages qu'ils ont d&eacute;j&agrave; publi&eacute; sur ce th&egrave;me. </p>
<p>&nbsp;</p>
<h3><strong>1- Principes de base du CSS</strong></h3>
<p>Pour comprendre le principe de mise en page propos&eacute;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 &agrave; l'aise avec le CSS, vous pouvez <a href="#paragraphe2">sauter ce paragraphe</a>.</p>

<div class="decal1">

<h4>a) Embo&icirc;tement des blocs </h4>

<div class="decal2">

<p class="rouge">&lt;html&gt;<br />
&lt;body&gt;<br />
&lt;div id=&quot;mon_style_css&quot;&gt;<br />
&lt;/div&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt; </p>
<p>Les blocs d&eacute;finis en CSS peuvent s'embo&icirc;ter les uns dans les autres. Le premier bloc d'une page est le bloc &lt;html&gt; dans lequel vient se positionner le bloc &lt;body&gt;. </p>
<p>Dans un cas de ce type, on dit que le bloc &lt;html&gt; est le &quot;parent&quot; et que le bloc &lt;body&gt; et le fils. Tous les blocs CSS que vous cr&eacute;erez seront des &quot;enfants&quot; du bloc &lt;body&gt; &agrave; l'int&eacute;rieur duquel ils se positionneront. Vos propres blocs pourront eux-m&ecirc;me avoir des &quot;enfants&quot;, ou des &quot;fr&egrave;res&quot; (blocs ayant le m&ecirc;me parent).</p>
</div>

<h4>b) Ascenseurs automatiques par d&eacute;faut </h4>

<div class="decal2">

<p class="rouge">overflow: auto </p>
<p>- Par d&eacute;faut, le bloc &lt;html&gt; occupe toute la fen&ecirc;tre du navigateur (bien qu'Internet Explorer r&eacute;serve une petite marge &agrave; droite et une autre en bas pour les ascenseurs), et le bloc &lt;body&gt; remplit compl&egrave;tement le bloc &lt;html&gt;. </p>
<p>- Par d&eacute;faut, le bloc &lt;html&gt; est pourvu d'ascenseurs automatiques. Si vous remplissez le bloc &lt;body&gt; avec une grande quantit&eacute; de texte et d'image, un ascenseur sera n&eacute;cessaire pour visualiser l'ensemble du contenu de la page. Etant donn&eacute; que le bloc &lt;body&gt; n'a g&eacute;n&eacute;ralement pas d'instruction particuli&egrave;re concernant la gestion des ascenseurs il renvoi la demande &agrave; son bloc parent, c'est &agrave; dire &lt;html&gt;. Ce bloc affiche alors un ascenseur qui permet de faire d&eacute;filer l'ensemble de son contenu, c'est &agrave; dire l'ensemble du bloc &lt;body&gt; (une vraie partie de ping-pong !).</p>
<p>La quasi-totalit&eacute; des sites que vous pouvez visiter sur le Web utilise ce syst&egrave;me d'ascenseur automatique : le bloc &lt;body&gt; est rempli avec l'ensemble du contenu &agrave; pr&eacute;senter et son ascenseur permet de faire d&eacute;filer l'ensemble du contenu comme on voit d&eacute;filer un paysage &agrave; travers la fen&ecirc;tre d'un v&eacute;hicule. </p>
<p>A l'inverse, notre proposition de mise en page vous permet de positionner des ascenseurs ind&eacute;pendants sur chaque bloc et multiplie donc le nombre de &quot;fen&ecirc;tres&quot; permettant de faire d&eacute;filer du contenu.</p>

</div>

<h4>c) Positionnements &quot; static &quot;, &quot; fixed &quot;, &quot; relative &quot; et &quot; absolute &quot; </h4>

<div class="decal2">

<p class="rouge"><strong>position: static </strong></p>
<p>Le type de positionnement par d&eacute;faut de tout bloc est &quot;<span class="rouge">static</span>&quot;. Avec cette propri&eacute;t&eacute;, le bloc sera positionn&eacute; dans le &quot;flux&quot; de la page. C'est &agrave; dire que si ce bloc est plac&eacute; au milieu d'un texte, il se d&eacute;placera avec le texte. Ajoutez du texte au dessus et le bloc descend. </p>
<p>Quand un bloc est positionn&eacute; en &quot;<span class="rouge">static</span>&quot;, les propri&eacute;t&eacute;s, <span class="rouge">top, left, bottom, right</span> et <span class="rouge">margin</span> sont ignor&eacute;es et ne servent &agrave; rien.</p>
<p class="rouge"><strong>position: relative </strong></p>
<p>Le bloc reste positionn&eacute; dans le flux, mais peut &ecirc;tre plus ou moins d&eacute;cal&eacute; &agrave; l'int&eacute;rieur du flux grace aux propri&eacute;t&eacute;s <span class="rouge">top, left, bottom, right</span> et <span class="rouge">margin-top, margin-left, margin-bottom, margin-right</span> .</p>
<p class="rouge"><strong>position: absolute </strong></p>
<p>Le bloc sort du flux, c'est &agrave; dire qu'il ne tient plus du compte des autres &eacute;l&eacute;ments contenus dans son bloc parent. </p>
<p>Ne vous laissez cependant pas tromper par le terme &quot;<span class="rouge">absolute</span>&quot; : cet &quot;absolute&quot; est en quelque sorte relatif, puisque les propri&eacute;t&eacute;s <span class="rouge">top, left, bottom, right </span>et <span class="rouge">margin</span> positionneront le bloc par rapport &agrave; son bloc parent. Si le bloc parent a pour propri&eacute;t&eacute; &quot;<span class="rouge">left: 10px</span>&quot; et que votre bloc fils a pour propri&eacute;t&eacute; &quot;<span class="rouge">left: 20px</span>&quot;, il sera en fin de compte d&eacute;cal&eacute; de 10+20 = 30px par rapport au bord du bloc qui contient le bloc parent.</p>
<p class="rouge"><strong>position: fixed </strong></p>
<p>Le bloc est positionn&eacute; par rapport &agrave; la fen&ecirc;tre du navigateur, ind&eacute;pendamment du flux et de la position de son bloc parent. C'est a priori la propri&eacute;t&eacute; id&eacute;ale pour d&eacute;finir un menu fixe dans une page mouvante. Malheureusement, Internet Explorer 5.5 et 6.x ne reconnaissent pas cette propri&eacute;t&eacute; que nous n'utiliserons donc pas dans notre conception.</p>

</div>

<h4>d) Taille des blocs </h4>

<div class="decal2">

<p class="rouge"><strong>width: xxpx ; height: xxpx </strong></p>
<p>Quand on aborde la mise en page, le premier r&eacute;flexe consiste &agrave; cr&eacute;er des blocs de hauteur et de largeur fixe, d&eacute;finies par &quot; <span class="rouge">width: </span>&quot; et &quot; <span class="rouge">height: </span>&quot;. Cette fa&ccedil;on de proc&eacute;der est toutefois bien mal adapt&eacute;e &agrave; la diversit&eacute; des &eacute;crans existant dans le monde. Pour que votre site reste utilisable par tout les internautes, vous devrez fixer des dimensions tr&egrave;s faibles qui ne conviendront pas aux utilisateurs &eacute;quip&eacute;s de grands &eacute;crans.</p>
<p class="rouge"><strong>width: xx% ; height: xx% </strong></p>
<p>La premi&egrave;re option consiste &agrave; fixer une hauteur et une largeur en %. Notez toutefois que cela ne pourra fonctionner que si le bloc parent a des propri&eacute;t&eacute;s de dimension clairement d&eacute;finies (le pourcentage est en effet calcul&eacute; par rapport aux dimensions du bloc parent). Si l'id&eacute;e est de fixer la taille d'un bloc &agrave; 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&ocirc;te &agrave; c&ocirc;te, il est essentiel que tous ces blocs soient dimensionn&eacute;s en pourcentages. M&eacute;langer un dimensionnement fixe (exprim&eacute; en px) avec un dimensionnement en pourcents n'est pas une bonne id&eacute;e car le total de vos hauteurs ou de vos largeurs ne pourra plus &ecirc;tre &eacute;gal &agrave; 100%.</p>
<p class="centered"> <img src="fixe-pourcents.gif" width="300" height="107" alt="hauteur fixe ou en pourcentage" /></p>
<p>&nbsp;</p>
<p><strong>Taille fix&eacute;e par <span class="rouge">top, left, bottom et right</span> </strong></p>
<p>Si on ne pr&eacute;cise ni largeur ni hauteur, la taille d'un bloc peut &ecirc;tre calcul&eacute;e &agrave; parti de la position de ses bords. </p>
<p>Par exemple : </p>
<p>- <span class="rouge">top: 0; bottom: 0;</span> forcera la taille du bloc &agrave; 100% de la hauteur du bloc parent<br />
-<span class="rouge"> top: 0; bottom: 10px;</span> forcera la taille du bloc &agrave; la hauteur du bloc parent moins 10 pixels. </p>
<p>Cette solution est id&eacute;ale pour mettre en place un bloc exploitant toute la place laiss&eacute;e libre par un bloc de dimensions fixes.<br />
Attention toutefois : ce type de dimensionnement ne fonctionne pas avec Internet Explorer dans ses versions ant&eacute;rieures &agrave; la 7.0.</p>
<p>&nbsp; </p>
</div>
</div>

<h3>2- <a name="paragraphe2" id="paragraphe2"></a>Comment contourner ces limitations</h3>

<div class="decal1">

<p>A la lecture de ce qui pr&eacute;c&egrave;de, on s'apper&ccedil;oit que les limitations d'Internet Explorer 5.5 et 6.x pr&eacute;sentent deux difficult&eacute;s importantes pour la r&eacute;alisation d'une mise en page avec menu fixe. Voici comment nous avons contourn&eacute; ces difficult&eacute;s.</p>
<h4>- Position: fixed n'est pas reconnu par Internet Explorer 5.5 et 6.0 </h4>
<p>&agrave;) L'ascenseur automatique du bloc &lt;html&gt; est d&eacute;sactiv&eacute; &agrave; l'aide de l'instruction overfow: hidden . De ce fait, le &quot;flux&quot; de ce bloc principal est bloqu&eacute; (son contenu restera fixe). </p>
<p>b) Tous les blocs (y compris le menu et le bloc qui contiendra le texte) sont positionn&eacute;s dans le bloc &lt;body&gt; &agrave; l'aide de position: absolute . </p>
<p>&lt;html&gt; ayant un flux bloqu&eacute;, le bloc &lt;body&gt; h&eacute;rite de ses propri&eacute;t&eacute;s et restera &eacute;galement fixe. Dans cette configuration particuli&egrave;re, la position &quot;<span class="rouge">absolute</span>&quot; devient donc &eacute;quivalente &agrave; la position &quot;<span class="rouge">fixed</span>&quot;. </p>
<p>c) On cr&eacute;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&eacute;filer son contenu. </p>
<p><strong>En r&eacute;sum&eacute; </strong> : l'ascenseur de la page est d&eacute;sactiv&eacute; et sera remplac&eacute; par l'ascenseur d'un bloc ind&eacute;pendant qui contiendra le texte de la page. </p>
<p><strong>Note </strong>: une fois cette configuration mise en place, il est parfaitement possible de cr&eacute;er dans notre page plusieurs blocs ind&eacute;pendants pourvus d'ascenseurs et contenant chacun un texte. Le bloc qui contiendra les menus pourra lui-m&ecirc;me &ecirc;tre pourvu d'un ascenseur afin de g&eacute;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'&eacute;cran de l'utilisateur et la taille qu'il souhaite donner &agrave; la fen&ecirc;tre du navigateur). </p>
<p>&nbsp; </p>
<h4>- <span class="rouge">top, left, bottom et right</span> permettent de donner une position, mais ne permettent pas de donner une taille avec Internet Explorer 5.5 et 6.0 </h4>
<p>Le bloc fixe contenant le menu ayant g&eacute;n&eacute;ralement une largeur et/ou une hauteur constante, il est donc d&eacute;licat d'exploiter le reste de l'espace avec un bloc de taille variable. Cette difficult&eacute; est contourn&eacute;e par deux biais : </p>
<p>a) Une feuille de style particuli&egrave;re est fabriqu&eacute;e &agrave; l'attention d'Internet Explorer. Dans cette feuille, la dimension des blocs est calcul&eacute;e en Javascript. On obtient ainsi exactement le m&ecirc;me r&eacute;sultat que si IE &eacute;tait capable de calculer la taille d'un bloc en fonction de la position de ses bords. </p>
<p>b) Une autre feuille de style est g&eacute;n&eacute;r&eacute;e pour les utilisateurs &eacute;quip&eacute;s d'Internet Explorer et ayant d&eacute;sactiv&eacute; le Javascript. Dans ce cas, on r&eacute;active l'ascenseur du bloc &lt;html&gt; et on se retrouve avec une page d&eacute;filante traditionnelle (les menus ne seront plus fixes dans ce cas particulier). </p>
<p><strong>En r&eacute;sum&eacute; </strong> : les feuilles de style g&eacute;n&eacute;r&eacute;es par CSS Frame Player permettent d'obtenir une compatibilit&eacute; avec l'ensemble des navigateurs, quelles que soient leurs versions. Le menu ne sera toutefois pas fixe pour les utilisateurs &eacute;quip&eacute;s d'Internet Explorer et ayant d&eacute;sactiv&eacute; le Javascript (1 &agrave; 10% des utilisateurs, selon les &eacute;tudes r&eacute;alis&eacute;es sur le sujet).</p>
<p>&nbsp;</p>
</div>

<h3>3- Les limites de cette solution de mise en page : </h3>

<div class="decal1">

<p><strong>a)</strong> Les blocs horizontaux que vous d&eacute;finirez comme &quot;fixes&quot; consomment une partie de la hauteur de page disponible. Prenez garde &agrave; ne pas trop r&eacute;duire cette hauteur sous peine de forcer vos utilisateurs &agrave; faire d&eacute;filer le texte principal dans un rectangle &quot;&eacute;cras&eacute;&quot; offrant une faible visibilit&eacute;. </p>
<p><strong>b)</strong> Si votre ou vos bloc(s) fixes ont une hauteur fixe (le &quot;header&quot;/en-t&ecirc;te, par exemple), attention &agrave; ce qui peut se produire si l'utilisateur augmente la taille des polices : le texte contenu dans ces blocs risque d'&ecirc;tre &quot;rogn&eacute;&quot; et de devenir illisible. Essayez donc de r&eacute;server les blocs de hauteur fixe &agrave; l'affichage d'images ou placez des ascenseurs dans ces blocs. Nous vous conseillons en particulier de placer un ascenseur &quot; auto &quot; dans votre bloc menu pour &ecirc;tre s&ucirc;r que l'ensemble de votre menu sera toujours accessible. </p>
<p><strong>c)</strong> La navigation &agrave; l'aide du clavier n'est plus possible pour Internet Explorer 5.5 et 6.x ainsi que pour Firefox ant&eacute;rieur &agrave; la version 1.5 : impossible de &quot;scroller&quot; directement via les fl&egrave;ches du clavier ou via la molette de souris. Un clic dans le bloc &quot;scrollable&quot; permet toutefois de r&eacute;tablir ces fonctionnalit&eacute;s. A partir de la version 1.5 de FireFox, comme pour Opera, on peut &eacute;galement r&eacute;tablir ces fonctionnalit&eacute;s en d&eacute;pla&ccedil;ant le curseur sur le bloc &quot;scrollable&quot; &agrave; l'aide de la touche de tabulation.</p>
<p>Cet inconv&eacute;nient pourrait &ecirc;tre r&eacute;gl&eacute; avec un petit script donnant le &quot;focus&quot; au bloc principal au moment de l'ouverture de la page. </p>
<p><strong>d)</strong> Comme nous l'indiquons plus haut, les utilisateurs &eacute;quip&eacute;s d'Internet Explorer 5.5 et 6.x qui ont d&eacute;sactiv&eacute; le Javascript (1 &agrave; 10% des utilisateurs, selon les &eacute;tudes r&eacute;alis&eacute;es sur le sujet) ne b&eacute;n&eacute;ficieront pas des menus fixes. Ils pourront toutefois naviguer sur le site en mode &quot;traditionnel&quot;. </p>
<p>&nbsp;</p>
</div>
<h3>4- Une variante sans utilisation de Javascript </h3>
<p><a href="alan3_sans_javascript.htm">Une variante de ce type de mise en page</a> n'utilisant pas le Javascript est &eacute;galement propos&eacute;e sur ce site.</p>
<p class="centered"><a href="http://validator.w3.org/check?uri=referer"><img
src="http://www.w3.org/Icons/valid-xhtml10"
alt="Valid HTML 4.01 Transitional" /></a></p>
</div>

</body></html>