28173 sujets

CSS et mise en forme, CSS3

Bonjour à tous!

Ne m'en voulez pas mais je viens remettre sur le tapis ce vieux problème du height à 100%. Smiley lol
Mon but étant de faire une interface pour une zone d'administration, j'essaie donc de la faire ressembler le plus possible à une application client. En gros, je ne veux pas avoir de scrolling sur la page, mais uniquement dans les blocs, le tout étant fluide à l'agrandissement ou à la réduction de la fenêtre du navigateur.

Comme une image vaut mille mots, voiçi un exemple de layout fonctionnel que j'ai créé.

layout

J'ai testé ce truc sur FF, Safari, IE6, IE7 et Opera ( tout sur pc, pas encore sur mac) et cela fonctionne partout sauf sur Opera.
Seulement, impossible de construire quelque chose du genre qui puisse être validé : dès que je place le doctype, tout part en vrille. Smiley biggol

J'ai aussi essayé de redimensionner les bloc en javascript ; certes ça fonctionne, mais les réactions diffèrent entre les navigateurs et un de mes buts importants reste de ne pas utiliser de js pour cette interface-là.
Pour finir, comme je ne sais pas vraiment quelle seraient les implications si l'on ne met pas de doctype, j'aimerais néanmoins essayer d'arriver à ce résultat de manière valide.

Donc, la question : est-il possible de mettre des blocs avec un height a 100% MAIS avec des marges qui ne repoussent pas le bloc vers le bas de la page? Smiley confus

Merci à tous.

Le code, au cas où :


body{ 
	overflow: hidden;
	padding: 0 0 185px 0; 
	_padding: 0 0 135px 0; /* IE */
	margin: 0px;
	font-family: tahoma, sans-serif;
	font-size: 0.7em;
	background-color: #ddd;
}
#container{
	border: solid 1px;
	margin: 10px;
	padding: 5px;
	background-color: #fff;
}
#header{
	position: relative;
	height: 100px;
	background-color: #ddd;
	margin: 0 0 5px 0;
}
#header h1{
	position: absolute;
	margin: 0;
	padding: 0;
	bottom: 0;
	left: 5px;
	font-size: 180%;
	font-family: arial, sans-serif;
	color: #999;
}
#left{
	float: left;
	width: 200px;
	border: solid 1px;
	height: 100%;
	overflow: auto;
	padding: 10px 0 35px 10px;
	margin-right: 5px;
	_margin-right: 2px;  /* IE */
	position: relative;
}
#mid{
	position: relative;
	overflow: hidden;
	height: 100%;
	border: solid 1px;
	padding: 10px 10px 35px 10px;
	_padding: 10px 10px 35px 10px;  /* IE */
}
#top{
	margin: 0;
	padding: 0 0 0 5px;
	height: 20px;
	background-color: #ddd;
	color: #999;
	font-size: 140%;
	font-family: arial, sans-serif;
}
#dispLeft{
	float: right;
	height: 100%;
	margin: 5px 0 0 5px;
	padding: 0 0 0 10px;
	border: solid 1px;
	overflow: auto;
	overflow-x: hidden;
	position: relative;
}
#largeur{ /* POUR IE */
	width: 200px;
	_font-size: 0px;  /* IE */
}
#dispRight{
	margin: 5px 0 0 0; 
	overflow: hidden;
	padding: 0 0 0 10px;
	height: 100%;
	position: relative;
	border: solid 1px;
	overflow: auto;
}



<body>
	<div id="container">
		<div id="header">
			<h1>TEST INTERFACE QUIRKSMODE</h1>
		</div>
		<div id="left">
			<?php echo str_repeat("un menu<br />",30); ?>
		</div>
		<div id="mid">
			<h2 id="top">top</h2>
			<div id="dispLeft">
				<div id="largeur"></div> <!-- BLOC POUR COMPENSER UN CURIEUX PROBLEME DE RAFRAICHISSEMENT SUR IE-->
				<?php echo str_repeat("des infos<br />",30); ?>
			</div>
			<div id="dispRight">
				<?php echo str_repeat("du contenu<br />",25); ?>
			</div>
		</div>
	</div>
</body>

Modifié par ami (02 Mar 2008 - 18:22)
Salut,

Il faut que tu te penches du coté de la propriété overflow qui te permettra d'ajouter une barre de défilement si le contenu est plus grand que ton bloc, au lieu d'agrandir le bloc en hauteur.
Cela est possible ainsi :


élément {
overflow: scroll;
}


Par contre ce n'est pas très ergonomique d'avoir autant de barres de défilement dans une page, mais ça je pense que tu le sais déja. Smiley cligne
Mikachu a écrit :

Par contre ce n'est pas très ergonomique d'avoir autant de barres de défilement dans une page, mais ça je pense que tu le sais déja. Smiley cligne


Oui, c'est certain, mais c'est pour l'exemple. Smiley smile

Mikachu a écrit :


élément {
overflow: scroll;
}



Je vais voir dans cette direction, mais je ne sais pas si cela va permettre le redimensionnement vertical des blocs à la taille de la fenêtre. Smiley ohwell
Par exemple, si je met le fameux " html,body{height: 100%} " et qu'ensuite je veux y insérer un bloc de 100% de hauteur avec un margin, par exemple " #blocTruc{ height: 100%; margin: 10px; } " , à l'affichage le bloc aura certes 100% de hauteur, mais il débordera sur le bas de la page de, justement, 10px.

Je n'ai trouvé aucun moyen de faire comprendre au bloc que quand il est a 100%, ce n'est pas le 100% de la fenêtre, mais le 100% du bloc parent.
C'est assez incompréhensible car ce type d'extension verticale serait parfaitement logique ( et même indispensable dans certains cas ) et elle se réalise aisément, voire automatiquement, sur le plan horizontal.
Smiley confus

En fait, maintenant je comprends mieux le problème, que je pourrais énoncer ainsi :

"Comment créer un bloc qui occupe le 100% de la hauteur de son parent?"

Apparemment, ce n'est simplement pas possible... Smiley fache
Bonjour,

ami a écrit :
Mon but étant de faire une interface pour une zone d'administration, j'essaie donc de la faire ressembler le plus possible à une application client. En gros, je ne veux pas avoir de scrolling sur la page, mais uniquement dans les blocs, le tout étant fluide à l'agrandissement ou à la réduction de la fenêtre du navigateur.

C'est typiquement le genre d'interface que l'on réalisera avec des frames. On utilisera un doctype HTML 4.01 Frameset ou XHTML 1.0 Frameset qui va bien.

Ou bien sans frames, avec du positionnement absolu de certains blocs dans le genre:
div#main {
	position: absolute;
	top: 200px;
	bottom: 50px;
	overflow: auto;
}

Et du Javascript en surcouche pour obtenir un rendu correct dans IE6 (qui ne comprend pas cette utilisation du positionnement absolu, contrairement à IE7).
Modifié par Florent V. (02 Mar 2008 - 14:30)
ami a écrit :
Je n'ai trouvé aucun moyen de faire comprendre au bloc que quand il est a 100%, ce n'est pas le 100% de la fenêtre, mais le 100% du bloc parent.

Ben si c'est possible, mais il faut que le parent ait une hauteur. Parce que 100% du bloc parent quand la hauteur du bloc parent dépend du contenu de son enfant... euh, ben là c'est tout de même logique que ça coince, non?
Oui, en effet.

Le height 100% pour un bloc enfant est compris correctement ( ou du moins comme je l'entends ) lorsque que son parent à une hauteur fixe, tel que dans cet exemple.

Par contre, si l'on met le parent ( et son parent ) à 100%, cela ne fonctionne plus correctement.
Dans ce cas, le bloc a bordures rouges reprend le 100% de html{} et non de son parent direct.
En fait, tous les elements à 100% héritent du 100% de html{}.

Mais c'est somme toute logique, en effet.
Modifié par ami (02 Mar 2008 - 15:23)
Florent V. a écrit :

Ou bien sans frames, avec du positionnement absolu de certains blocs dans le genre:
div#main {
	position: absolute;
	top: 200px;
	bottom: 50px;
	overflow: auto;
}

Et du Javascript en surcouche pour obtenir un rendu correct dans IE6 (qui ne comprend pas cette utilisation du positionnement absolu, contrairement à IE7).


Excellentissime, ça fonctionne avec le positionnement en absolute des éléments. Pour IE6, je vais utiliser le mode squirks.

Merci infiniment. Smiley biggrin

http://www.portchrono.com/nawara/components/com_phpshop/shop_image/product/bouquet.jpg