28172 sujets

CSS et mise en forme, CSS3

Bonjour à tous, et félicitations pour votre excellent site !
Voilà, j'ai un problème qui semble récurrent, et qui a même une entrée dans votre FAQ : "Comment faire une mise en page de 100% de hauteur avec des parties fixes (en-tête, par ex) ?". Sauf que les réponses apportées ne me conviennent pas, et comme tout cela date un peu, peut être que de nouvelles solutions sont apparues depuis.

Je vous expose mon objectif plus précisément :
Je veux utiliser 100% de la largeur et de la hauteur de ma page.
Je veux un header en haut de la page avec une hauteur fixe.
En dessous je veux 3 div côte à côte qui occupent tout le reste de la hauteur de la page.
Le div de gauche contient un menu et a une largeur initialement fixée.
Le div central contient une barre de splitpane (afin de faire varier les largeurs des div de droite et de gauche).
Le div de droite contient une iframe pour afficher des pages pointées par les items de menu du div de gauche.

Mon problème est que je n'arrive pas à faire occuper 100% du reste de l'espace en hauteur à mes div sous le header. Dans l'exemple qui suit, j'ai fixé la hauteur de ces div arbitrairement à 300 px. Or il faudrait que cette hauteur soit de (hauteur de la page - hauteur du header). Et il faut que cette hauteur soit fixée, pour que mon iframe la reconnaisse quand je lui dis d'occuper 100% de la hauteur de mon div.

<!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" xml:lang="fr" lang="fr">
<head>
<title>entete hauteur fixe - hauteur 100%</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

<style type="text/css">
body {
font-family:Verdana, Arial, Helvetica, sans-serif;
font-size: 10pt;
margin: 0;
padding: 0;
}
#header {
height: 100px;
background-color: #99CCCC;
}
#gauche{
position: absolute;
left: 0;
width: 500px;
height: 300px;
background-color:#CC3300;
}
#milieu {
position: absolute;
left: 500px;
width: 20px;
height: 300px;
background-color:#999999;
}
#droite {
margin-left: 520px;
height: 300px;
background-color:#00FF33;
}
p {margin: 0 0 10px 0;}
</style>
</head>

<body>
	  <div id="header">header</div>
	  <div id="gauche">gauche</div>
	  <div id="milieu">m</div>
    <div id="droite">
      <iframe name="if1" id="if1" frameborder="0" width="100%" height="100%" src="http://www.alsacreations.com/"></iframe>
    </div>
</body>
</html>


Alors, quelqu'un a une idée pour réaliser cela en CSS (compatible IE7 et FF3). Sinon, je n'aurai plus qu'à essayer de réaliser cela avec une fonction javascript sur du onresize... mais ça va être de la bidouille Smiley ohwell
Bonjour,

Compatible IE7 et Firefox? Sans problème.
#colonne1 {
	position: absolute;
	top: 200px;
	left: 20px;
	bottom: 20px;
	width: 300px;
}

Une bonne maitrise du positionnement absolu sera nécessaire, et notamment des points suivants:
- dimensionner un bloc positionné en absolu grâce à ses coordonnées (comme dans l'exemple ci-dessus, pas de height, et on pourrait faire de même pour la largeur);
- positionner un bloc en absolu par rapport aux limites d'un conteneur positionné en relatif.
Merci Florent !!
avec du top: 100px; et du bottom: 10px; je m'en sors... c'etait si simple Smiley eek
Voir ci-dessous mon code corrigé qui fonctionne (à un détail près : la mise en page du site Alsacreation, est légèrement chamboulée)

Par contre Raphael, je n'ai pas trouvé cette solution dans la FAQ... si je peux me permettre, ce serait pas mal de faire un topo récapitulatif sur ce sujet, avec les différentes solutions disponibles... celles présentées dans la FAQ ne fonctionnaient pas pour mon iframe...

En tous cas, merci encore à vous !


<!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" xml:lang="fr" lang="fr">
<head>
<title>entete hauteur fixe - hauteur 100%</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

<style type="text/css">
body {
font-family:Verdana, Arial, Helvetica, sans-serif;
font-size: 10pt;
margin: 0;
padding: 0;
}
#header {
height: 100px;
background-color: #99CCCC;
}
#gauche{
position: absolute;
top: 100px;
bottom: 10px;
left: 0;
width: 500px;
/*height: 300px;*/
background-color:#CC3300;
}
#milieu {
position: absolute;
top: 100px;
bottom: 10px;
left: 500px;
width: 20px;
/*height: 300px;*/
background-color:#999999;
}
#droite {
position: absolute;
top: 100px;
bottom: 10px;
left: 520px;
right: 0px;
/*margin-left: 520px;
height: 300px;*/
background-color:#00FF33;
}
p {margin: 0 0 10px 0;}
</style>
</head>

<body>
	  <div id="header">header</div>
	  <div id="gauche">gauche</div>
	  <div id="milieu">m</div>
    <div id="droite">
      <iframe name="if1" id="if1" frameborder="0" width="100%" height="100%" src="http://www.alsacreations.com/"></iframe>
    </div>
</body>
</html>
J'ai parlé trop vite !!
Le code ci-dessus fonctionne bien pour FF. Mais pour IE7, ça ne le fait pas... l'iframe ne fait pas toute la hauteur de page Smiley decu
Et l'iframe, tu ne peux pas la positionner en absolu de la sorte? Vu que son conteneur est déjà positionné, tu devrais pouvoir lui appliquer un top:0; right:0; bottom:0; left: 0;. Mais il se peut qu'IE7 n'en soit tout simplement pas capable pour un élément IFRAME. Smiley ohwell
J'ai mis cela pour l'iframe :

position: absolute;
top: 100px;
bottom: 100px;
left: 100px;
right: 100px;

mais rien à faire : que ce soit ff ou ie, aucun des deux ne reconnait les propriétés right ou bottom Smiley decu (top et left fonctionnent par contre).

C'est un peu un drôle d'objet cet iframe, non ??
Modifié par cicox (09 Jan 2009 - 17:27)
Modérateur
bonsoir,

width="100%" height="100%" 
:

pour l'iframe dans le html et
position: absolute;
top: 100px;
bottom: 100px;
left: 100px;
right: 100px;

Entre en conflit , Les dimensions exprimés dans le code html l'emporte en final .

GC
Ben j'avais enlevé les 100% pour les width et height
Rien à faire, l'iframe ne se positionne pas en absolute j'ai bien peur (sur FF ou IE).

Voici le code que j'ai utilisé :

<!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" xml:lang="fr" lang="fr">
<head>
<title>entete hauteur fixe - hauteur 100%</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

<style type="text/css">
body {
font-family:Verdana, Arial, Helvetica, sans-serif;
font-size: 10pt;
margin: 0;
padding: 0;
}
#header {
height: 100px;
background-color: #99CCCC;
}
#gauche{
position: absolute;
top: 100px;
bottom: 0px;
left: 0;
width: 500px;
/*height: 300px;*/
background-color:#CC3300;
}
#milieu {
position: absolute;
top: 100px;
bottom: 0px;
left: 500px;
width: 20px;
/*height: 300px;*/
background-color:#999999;
}
#droite {
position: absolute;
top: 100px;
bottom: 0px;
left: 520px;
right: 0px;
/*margin-left: 520px;
height: 300px;*/
background-color:#00FF33;
}
#if1 {
position: absolute;
top: 0px;
bottom: 0px;
left: 0px;
right: 0px;
/*width: 100%;
height: 100%;*/
}
p {margin: 0 0 10px 0;}
</style>
</head>

<body>
	  <div id="header">header</div>
	  <div id="gauche">gauche</div>
	  <div id="milieu">m</div>
    <div id="droite">
      <iframe name="if1" id="if1" frameborder="0" src="http://www.alsacreations.com/"></iframe>
    </div>
</body>
</html>