28173 sujets

CSS et mise en forme, CSS3

Salut à tous, content de rejoindre votre petite communauté d'alsacreations.

J'arrive avec un problème que je n'arrive pas à résoudre en css.

J'ai donc une page web avec un header, un menu, une barre de séparation et le contenu central.

je voudrais que ma page prenne toujours 100% en largeur et en hauteur de l'écran, donc pas de scrollbar sur la page entiere.

J'y arrive sans probleme en largeur (quoique des erreurs d'arrondis de explorer m'empechent de mettre width à 100%).
Par contre, en hauteur, je n'y arrive pas :
mon header prend 70px de hauteur, je ne sais pas comment dire à mon container de prendre le reste de la place en hauteur. J'ai essayé quelques solutions en jouant par exemple sur le padding-top mais rien n'y fait.
Alors avant d'assigner des hauteurs en javascript, peut-être que quelqu'un ici pourra me dire comment réaliser cela en css.


<!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>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<style type="text/css">
*
{
	margin: 0;
	padding: 0;
}

html, body 
{
	height: 100%;
	background: #FFF;
	font: #000 0.8em/1em Verdana, Arial, Helvetica, sans-serif;
/*	overflow: hidden;*/
}

#header 
{	
	position: absolute;
	height: 70px;
	width: 99.9%;
	background-color: purple;
}

#container 
{	
	position: absolute;
	top:70px;
	padding-top:-70px;
	width: 99.9%;
	height:100%;	
	background-color :yellow;
}

#menu
{
	float: left;
	width : 21.9%;
	height:80%;
	overflow: auto;
	background-color :red;
}

#splitbar
{
	float: left;
	width: 1%;
	height:80%;
	background: blue;
}

#main
{
	float: left;
	width: 77%;
	height:80%;
	overflow:auto;
	background-color :green;
}

</style>


<title>PAGE DE TEST</title>
</head>

<html>
<body>

<form>

    <div id="header">    
	  <h1>MY TEST PAGE</h1>
    </div>
	<div id="container">
        <div id="menu">
                Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi leo. Nullam dignissim auctor est. Ut justo eros, facilisis non, consequat at, venenatis egestas, risus. Curabitur eleifend, diam sit amet sollicitudin tincidunt, leo diam adipiscing nisl, vel pretium elit ante sed ligula. Proin sodales faucibus pede. Pellentesque vulputate sem eu nibh. Donec mollis metus fringilla nisi. Morbi at nisi quis nulla fringilla dapibus. Praesent euismod velit in erat. Fusce luctus fringilla neque. Quisque quis justo. Donec in nisi in mi sollicitudin dictum. Praesent vel tortor eu justo fermentum consectetuer. In ipsum erat, consectetuer quis, dapibus nec, varius sed, arcu.

        </div>   
              
        <div id="splitbar">&nbsp;</div>    
        
        <div id="main">
                Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi leo. Nullam dignissim auctor est. Ut justo eros, facilisis non, consequat at, venenatis egestas, risus. Curabitur eleifend, diam sit amet sollicitudin tincidunt, leo diam adipiscing nisl, vel pretium elit ante sed ligula. Proin sodales faucibus pede. Pellentesque vulputate sem eu nibh. Donec mollis metus fringilla nisi. Morbi at nisi quis nulla fringilla dapibus. Praesent euismod velit in erat. Fusce luctus fringilla neque. Quisque quis justo. Donec in nisi in mi sollicitudin dictum. Praesent vel tortor eu justo fermentum consectetuer. In ipsum erat, consectetuer quis, dapibus nec, varius sed, arcu.

Ut placerat mattis mauris. Nullam magna felis, mollis sit amet, molestie eu, ornare a, nunc. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nunc condimentum nisi vitae justo. Praesent in magna. Fusce consequat velit vitae nisl. Sed eu massa. Fusce consectetuer. Integer ac pede. Aliquam ut massa. Donec sagittis pellentesque metus. Ut ligula. Ut ultrices consequat metus. Proin lacus augue, feugiat sit amet, eleifend mollis, rhoncus non, orci.

Suspendisse ut urna eu metus scelerisque dictum. Sed vel lorem pretium leo suscipit tempus. Fusce condimentum, lacus sed volutpat tristique, tellus tellus luctus arcu, vitae vestibulum leo dolor vel risus. Mauris scelerisque mollis turpis. Donec sit amet dui. Curabitur eu magna. Suspendisse lacinia. Nulla fermentum iaculis lectus. Fusce non nisl ac ligula dictum viverra. Nam magna nibh, rutrum ut, laoreet sagittis, ultricies ut, nulla. Mauris non neque.

Suspendisse sapien magna, pellentesque at, dapibus sit amet, consectetuer nec, neque. Fusce placerat sodales quam. Mauris nonummy, eros quis fermentum hendrerit, sapien sapien consectetuer diam, a aliquam enim tortor eget justo. Quisque facilisis condimentum massa. Sed ante eros, ornare non, vestibulum posuere, mollis et, magna. Nulla vitae diam. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Suspendisse potenti. Maecenas vel justo et ipsum lacinia consectetuer. Vestibulum vitae mauris eget nulla aliquet pellentesque. Ut vitae neque in libero mollis congue. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nam ullamcorper justo eu massa. Sed sed est. Ut fermentum volutpat sapien. Pellentesque convallis semper augue. Aliquam mattis odio et magna. Nullam urna ligula, tempor a, dapibus eget, bibendum vitae, diam.

Phasellus imperdiet justo ac ipsum. Vestibulum eleifend dolor at ligula. Aenean facilisis elementum nisl. In accumsan felis ac leo. Suspendisse vel dui non nisl dignissim ultrices. Mauris euismod dolor eu nibh. In ultrices massa vitae erat. Suspendisse sodales. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Vivamus pretium, dui sit amet auctor tincidunt, odio ante posuere est, ac dapibus nisi libero sit amet enim. Vestibulum sed libero. Nulla suscipit. Mauris mollis facilisis turpis. Integer sed nunc at velit ultricies blandit. Ut id sem.
   
        </div>    

	</div>

</form>

</body>

</html>
Bonjour et bienvenue sur Alsacréations Smiley smile ,

a écrit :
je voudrais que ma page prenne toujours 100% en largeur et en hauteur de l'écran, donc pas de scrollbar sur la page entiere.


Pourquoi diable vouloir réaliser cela ? Smiley sweatdrop
Modifié par Igor (25 Dec 2006 - 22:34)
je me suis mal exprimé, je voulais dire :

a écrit :
je voudrais que ma page prenne toujours 100% en largeur et en hauteur du navigateur, donc pas de scrollbar sur la page entiere.


Autrement dit, si je redimenssionne la fenetre du nagivateur, mon header et mon contenu doivent toujours prendre 100% de la fenetre en hauteur.
Modifié par Bruno Duchemin (25 Dec 2006 - 23:21)
Tout ceci me semble étrange :
#container
{
	position: absolute;
	top:70px;
	padding-top:-70px;
	width: 99.9%;
	height:100%;
}

Pourquoi le positionnement absolu, le padding négatif (ça marche ??? Smiley eek ), etc ?
mpop a écrit :
le padding négatif (ça marche ??? Smiley eek )


Ben jusqu'ici non mais peut être qu'en 2007 ben ça marchera.

bon en fait j'en sais rien... Mais comme il parait qu'on vit dans une époque hyper moderne où il se passe des trucs hyper nouveaux qui vont tellement hyper vite qu'on est même pas au courant ... Alors peut être que c'est possible ...

Ou bien alors peut être aussi que ça continuera à être un non sens complet (comme aujourd'hui quoi Smiley smile )

Enfin on verra bien...
Effectivement, un padding négatif c'etait pas très malin mais ce n'était qu'une erreur de frappe, j'ai copier-coller mon code entre 2 tests (pas très malin, je le conçois).

Pour ce qui est du positionnement absolu, c'était un choix arbitraire, dans ce cas-ci je pouvais tout aussi bien mettre un positionnement relatif.

si vous copier-coller ce code dans un fichier html, vous verrez que la page déborde du navigateur de 70px ==> comment éviter ça est la question ?


voilà mon code "corrigé" :



<!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>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

<style type="text/css">

*
{
	margin: 0;
	padding: 0;
}

html, body 
{
	height: 100%;
	background: #FFF;
	font: #000 0.8em/1em Verdana, Arial, Helvetica, sans-serif;
/*	overflow: hidden;*/
}

#header 
{
	position: relative;
	height: 70px;
	width: 99.9%;
	background-color: purple;
	z-index: 20;
}

#container 
{	
	position: absolute;
	top:0;
	padding-top:70px;
	width: 99.9%;
	height:100%;
	background-color :yellow;
	z-index: 10;
}

#menu
{
	float: left;
	width : 21.9%;
	overflow: auto;
	background-color :red;
}

#splitbar
{
	float: left;
	width: 1%;
	background: blue;
}

#main
{
	float: left;
	width: 77%;
	overflow:auto;
	background-color :green;
}

</style>
<title>PAGE DE TEST</title>

</head>


<html>
<body>
<form>
    <div id="header">    
	  <h1>MY TEST PAGE</h1>
    </div>

	<div id="container">
        <div id="menu">
                Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi leo. Nullam dignissim auctor est. Ut justo eros, facilisis non, consequat at, venenatis egestas, risus. Curabitur eleifend, diam sit amet sollicitudin tincidunt, leo diam adipiscing nisl, vel pretium elit ante sed ligula. Proin sodales faucibus pede. Pellentesque vulputate sem eu nibh. Donec mollis metus fringilla nisi. Morbi at nisi quis nulla fringilla dapibus. Praesent euismod velit in erat. Fusce luctus fringilla neque. Quisque quis justo. Donec in nisi in mi sollicitudin dictum. Praesent vel tortor eu justo fermentum consectetuer. In ipsum erat, consectetuer quis, dapibus nec, varius sed, arcu.

        </div>                 

        <div id="splitbar">&nbsp;</div>         

        <div id="main">
                Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi leo. Nullam dignissim auctor est. Ut justo eros, facilisis non, consequat at, venenatis egestas, risus. Curabitur eleifend, diam sit amet sollicitudin tincidunt, leo diam adipiscing nisl, vel pretium elit ante sed ligula. Proin sodales faucibus pede. Pellentesque vulputate sem eu nibh. Donec mollis metus fringilla nisi. Morbi at nisi quis nulla fringilla dapibus. Praesent euismod velit in erat. Fusce luctus fringilla neque. Quisque quis justo. Donec in nisi in mi sollicitudin dictum. Praesent vel tortor eu justo fermentum consectetuer. In ipsum erat, consectetuer quis, dapibus nec, varius sed, arcu.

Ut placerat mattis mauris. Nullam magna felis, mollis sit amet, molestie eu, ornare a, nunc. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nunc condimentum nisi vitae justo. Praesent in magna. Fusce consequat velit vitae nisl. Sed eu massa. Fusce consectetuer. Integer ac pede. Aliquam ut massa. Donec sagittis pellentesque metus. Ut ligula. Ut ultrices consequat metus. Proin lacus augue, feugiat sit amet, eleifend mollis, rhoncus non, orci.

Suspendisse ut urna eu metus scelerisque dictum. Sed vel lorem pretium leo suscipit tempus. Fusce condimentum, lacus sed volutpat tristique, tellus tellus luctus arcu, vitae vestibulum leo dolor vel risus. Mauris scelerisque mollis turpis. Donec sit amet dui. Curabitur eu magna. Suspendisse lacinia. Nulla fermentum iaculis lectus. Fusce non nisl ac ligula dictum viverra. Nam magna nibh, rutrum ut, laoreet sagittis, ultricies ut, nulla. Mauris non neque.

Suspendisse sapien magna, pellentesque at, dapibus sit amet, consectetuer nec, neque. Fusce placerat sodales quam. Mauris nonummy, eros quis fermentum hendrerit, sapien sapien consectetuer diam, a aliquam enim tortor eget justo. Quisque facilisis condimentum massa. Sed ante eros, ornare non, vestibulum posuere, mollis et, magna. Nulla vitae diam. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Suspendisse potenti. Maecenas vel justo et ipsum lacinia consectetuer. Vestibulum vitae mauris eget nulla aliquet pellentesque. Ut vitae neque in libero mollis congue. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nam ullamcorper justo eu massa. Sed sed est. Ut fermentum volutpat sapien. Pellentesque convallis semper augue. Aliquam mattis odio et magna. Nullam urna ligula, tempor a, dapibus eget, bibendum vitae, diam.

Phasellus imperdiet justo ac ipsum. Vestibulum eleifend dolor at ligula. Aenean facilisis elementum nisl. In accumsan felis ac leo. Suspendisse vel dui non nisl dignissim ultrices. Mauris euismod dolor eu nibh. In ultrices massa vitae erat. Suspendisse sodales. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Vivamus pretium, dui sit amet auctor tincidunt, odio ante posuere est, ac dapibus nisi libero sit amet enim. Vestibulum sed libero. Nulla suscipit. Mauris mollis facilisis turpis. Integer sed nunc at velit ultricies blandit. Ut id sem.   

        </div>  
	</div>
</form>

</body>

</html>
Bruno Duchemin a écrit :
si vous copier-coller ce code dans un fichier html, vous verrez que la page déborde du navigateur de 70px ==> comment éviter ça est la question ?

Un « débordement » horizontal ou vertical.
Je viens de tester sur un écran un peu grand, et ça me donne ça :
- en 1280x1024 : aucun débordement (ni horizontal, ni vertical) ;
- en 1024x768 : un débordement vertical du contenu.

Pour ce dernier, il vient du fait que div#container a une hauteur fixe (100%), et que si le contenu est plus important que cette hauteur, il dépasse. La solution consiste à utiliser min-height et non pas height.
Bruno Duchemin a écrit :

#container
{
position: absolute;
top:0;
padding-top:70px;
width: 99.9%;
height:100%;
background-color :yellow;
z-index: 10;
}


height:100%; + padding-top:70px; ça ne risque pas de le faire.

Il faut mettre un margin-top:70px; au 1er élément compris dans #container.
mpop a écrit :

Un « débordement » horizontal ou vertical.
Je viens de tester sur un écran un peu grand, et ça me donne ça :
- en 1280x1024 : aucun débordement (ni horizontal, ni vertical) ;
- en 1024x768 : un débordement vertical du contenu.

Pour ce dernier, il vient du fait que div#container a une hauteur fixe (100%), et que si le contenu est plus important que cette hauteur, il dépasse. La solution consiste à utiliser min-height et non pas height.



Ce que tu me dis est curieux, chez moi le contenair (en jaune) déborde verticalement dans toutes les résolutions (débordement de la taille du header).
Ensuite évidemment, si tu diminues la taille de la fenêtre, le contenu de "container" finit par déborder.


Voilà un lien pour donner une idée plus précise du gabarit que j'aimerais reproduire en css, c'est celui de yahoo maps (eux utilisent des iframe).
On peut redimensionner la fenetre comme on veut, la carte occupe toujours la même place dans le navigateur.

Merci à ceux qui se penchent sur le problème.
Modifié par Bruno Duchemin (26 Dec 2006 - 20:16)
Bruno Duchemin a écrit :
Ce que tu me dis est curieux, chez moi le contenair (en jaune) déborde verticalement dans toutes les résolutions (débordement de la taille du header).

Euh... s'il déborde sur les côtés, c'est un débordement horizontal, pas vertical, hein !

Bruno Duchemin a écrit :
Voilà un lien pour donner une idée plus précise du gabarit que j'aimerais reproduire en css, c'est celui de yahoo maps (eux utilisent des iframe).
On peut redimensionner la fenetre comme on veut, la carte occupe toujours la même place dans le navigateur.

L'idéal serait de pouvoir utiliser le positionnement absolu (en indiquant les coordonnées pour top ET bottom), pas pas supporté par IE (du moins IE6), etc.

Si l'en-tête et la colonne de gauche ont des dimensions en pourcentages, cependant, ça doit être tout à fait jouable. Il suffit de faire attention aux padding et autres border.

Recommandation pour ne pas se prendre la tête : faire trois blocs dimensionnés en pourcentages, sans padding ni border (pour éviter les problèmes dûs au modèle de boite CSS), et sans margin (pour éviter les problèmes de calcul des dimensions dans IE). Puis, à l'intérieur de ces trois blocs, on pourra rajouter des blocs prenant toute la largeur et ayant des marges, padding, bordures, tout ce qu'on veut.
a écrit :
Si l'en-tête et la colonne de gauche ont des dimensions en pourcentages, cependant, ça doit être tout à fait jouable.


Je l'ai pas fais dans mon exemple mais si mon header contient une image, je préfère autant donner à mon header la height de mon image en pixels.

Toute la difficulté c'est de dire au container de prendre en hauteur la place qui reste en %.
Bonjour et meilleurs voeux,

J'avais bidouillé un truc pour un autre post ...
ghost a écrit :
Bonjour,

Juste pour le fun (je n'ai pas tout testé !!)
En fait c'est un mélange de JS qui permet de calculer non pas la hauteur de l'écran mais la hauteur de la fenêtre du navigateur ( la nuance a son importance ) de transmettre par $_get cette valeur à php qui te permet à son tour de calculer la hauteur necessaire de "leftmenu" (hauteur fenetre - 100 ton header) et enfin de définir dans le code html le weight de ce bloc...

Une bricole ou deux qu'il faudrait préciser, c'est que la balise <html> doit être placée avant le doctype ... (Est ce que cela géne ??) sinon la valeur de la hauteur reste à 0 et que le test JS ne prend pas en compte la hauteur de l'ascenseur horizontal (20px je crois) en cas de fenêtre redimensionnée ...

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

<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-15" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta http-equiv="Content-Language" content="fr" />	
<title>TEST</title>
<style type="text/css">
* {
	margin: 0;
	padding: 0;
}

#container {
	position: relative;
	margin: auto;
	width: 1000px;
	overflow: hidden; 
}
 

#top {
	margin: auto;
	width: 100%;
    height: 100px;
	background: red;
}

#middle{
	position: relative;
	overflow: hidden;
	width: 100%;
	margin: auto;
	background: yellow;

}

#leftmenu {  
	float: left;
	width: 150px;
	background: yellow;

}

#bottom {
	position: absolute;
	height: 50px;
	bottom:0;
	width: 100%;
	background: green;
	text-align:center;
	clear: both;
}

#main {
	margin-left: 155px;
}

</style>

</head>

<body>
<?php
if (isset($_GET['largeur']) AND isset($_GET['hauteur'])) {
  // Affichage des variables
  $largeur_ecran = $_GET['largeur'];
  $hauteur_ecran = $_GET['hauteur'];

  $hauteur_bloc = $hauteur_ecran-100; 
  

} else {
  // passage des variables de dimensions du java script au php par $_GET
; 


  echo "<script type=\"text/javascript\">\n";

echo "if (document.body) {
var larg = (document.body.clientWidth);
var haut = (document.body.clientHeight);
} else {                                                
var larg = (window.innerWidth);
var haut = (window.innerHeight);
}";   

  echo "  location.href=\"${_SERVER['SCRIPT_NAME']}?${_SERVER['QUERY_STRING']}"
            . "&largeur=\" + larg + \"&hauteur=\" + haut;\n";

  echo "</script>\n";
  exit();
}
?>
<div id="container">
	<div id="top">
	TOP
	</div>
	<div id="middle">	
		<div id="leftmenu" style=" height: <?php echo $hauteur_bloc;?>px;">
			leftmenu
		</div>
		<div id="main">

			main

		</div>
		<div id="bottom">
	BOTTOM
		</div>	
	</div>
</div>

</body></html>



Bof juste pour une idée
Bruno Duchemin a écrit :
Je l'ai pas fais dans mon exemple mais si mon header contient une image, je préfère autant donner à mon header la height de mon image en pixels.

Toute la difficulté c'est de dire au container de prendre en hauteur la place qui reste en %.

En gros, tu voudrais que ton conteneur principal ait pour hauteur 100% - Npx. C'est tout à fait possible, en utilisant le positionnement absolu au maximum de ses capacités. Compatible navigateurs modernes, pas IE6, à tester pour IE7.

Vu l'étendue actuelle du support des CSS par IE6, il n'y a pas de solution à ce que tu souhaites uniquement en CSS. Soit tous tes blocs ont une hauteur en pourcentages (20% pour l'en-tête et 80% pour le corps, par exemple), soit ça ne marche pas.

Et Google Maps, Yahoo Maps et les autres, comment ils font ? Avec une bonne dose de Javascript, semble-t-il.
mpop a écrit :

En gros, tu voudrais que ton conteneur principal ait pour hauteur 100% - Npx. C'est tout à fait possible, en utilisant le positionnement absolu au maximum de ses capacités. Compatible navigateurs modernes, pas IE6, à tester pour IE7.



très intéressant ça, tu fais comment 100% - Npx pour un navigateur comme firefox ou autre navigateur compatible ?
Bruno Duchemin a écrit :
très intéressant ça, tu fais comment 100% - Npx pour un navigateur comme firefox ou autre navigateur compatible ?

Tu fais comme ça :
postion: absolute;
top: Npx;
bottom: 0;