28172 sujets

CSS et mise en forme, CSS3

Bonjour à tous,

Après moults essais et recherches de tutos/astuces, je viens poser mon problème sur ce forum, en espérant que vous saurez me conseiller. Le problème auquel je fais face est un mélange entre un div de hauteur à 100% et des bordures en images.

Voici la structure que je souhaite obtenir :

upload/14546-structure.JPG

Le rectangle bleu est un header de hauteur fixe, prenant toute la largeur de l'écran (j'ai réussi à le faire).
Les rectangles rouges seront des marges de taille fixe (disons 20px) pour "aérer" un peu la page.
Les rectangles verts seront des bordures verticales du contenu, deux images png qui se répèteront verticalement sur toute la hauteur.
Le rectangle blanc sera le contenu, je voudrais qu'il prennent tout l'espace restant, aussi bien verticalement (= 100% - hauteur du header) qu'horizontalement (100% - les "aérations" - les bordures).

Le problème vient lorsque je veux définir la taille du contenu pour qu'elle soit maximale, et également pour placer la bordure de droite.

Voici le code actuel :

<html>
	<head>
		<title>Test</title>
		<style>
			html, body {
				margin: 0;
				padding: 0;
				height: 100%;
				background-color: black;
			}
			
			#global {
        background: url(image.png) top left repeat-y;
        margin: 0 20px;
				background-color: white;
				height: 100%;
				position: relative;
			}
			#content {
				background-color: cyan;
				padding: 10px;
				font-size: 2em;
			}
			
			h1 {
        width: 100%;
				margin: 0;
				background-color: blue;	
				height: 60px;
				padding: 0 10px;
			}
			
			#footer {
				padding: 10px 0 10px 0px;
				background-color: magenta;
				position: absolute;
				bottom: 0;
				width: 100%;
			}
		</style>
	</head>
	
	<body>
    <h1>Le titre de ma page</h1>
		<div id="global">
			<div id="content">
        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
        tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
        quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
        Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu
        fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
        culpa qui officia deserunt mollit anim id est laborum.</p>
			</div>
			<div id="footer">Copyright &copy; someyear somebody</div>
		</div>
	</body>
</html>


Si je mets le h1 dans le titre global, j'ai bien une vue à 100% de l'écran (sinon elle dépasse en bas), mais le h1 ne fait plus la largeur maximale.
Et le second problème est pour placer la bordure droite sur le contenu...

Merci d'avance pour vos réponses (et votre aide Smiley biggrin )
Salut Nebelmann,

a écrit :
Si je mets le h1 dans le titre global, j'ai bien une vue à 100% de l'écran (sinon elle dépasse en bas), mais le h1 ne fait plus la largeur maximale.
Voici une solution sans toucher à ton code HTML :
* { /* voir  http://www.alsacreations.com/astuce/lire/36-reset-css.html*/
 
margin:0;
padding:0;
}
html, body {
height: 100%;
}

/* d'abord, on place #global sur tout l'écran (top:0; height:100%) */
#global {
position:absolute;
top:0;
z-index:0;
height: 100%;
margin: 0 20px;
}

/* puis on met le h1 par dessus (position:absolute; z-index:1) */
h1 {
position:absolute;
top:0;
z-index:1;
width: 100%;
height: 60px;
}

/* on descend #content de 60px pour qu'il ne soit pas sous le h1 */
#content {
margin-top:60px
}

/* enfin le footer va en bas de #global */
#footer {
position:absolute;
bottom:0;
width:100%;
}


/* couleurs pour débogage*/
html, body {background-color: black;}
#global {background-color: white;}
#content {background-color: cyan;}
h1 {background-color: blue;}
#footer {background-color: magenta;}

a écrit :
Et le second problème est pour placer la bordure droite sur le contenu...
Ça se résoud probablement en plaçant la bordure gauche sur #global et la droite sur #content (ou inversement).
Merci beaucoup marcv, c'est effectivement ce que je recherche.
Pour le placement des bordures, je ne vois pas comment leur donner toute la hauteur de l'écran si j'en mets une sur #global et une sur #content. En effet, #content aura seulement la hauteur du texte qu'il contient...

J'ai essayé en mettant une bordure sur body et une sur #global, ce qui semble aller mieux :

<html>
	<head>
		<title>Test</title>
		<style>
			* { /* voir   http://www.alsacreations.com/astuce/lire/36-reset-css.html*/
 
				margin:0;
				padding:0;
			}
				html, body {
				height: 100%;
			}

			body {
				background: url('border.png') top left repeat-y;
				background-position: 20px;
			}
			/* d'abord, on place #global sur tout l'écran (top:0; height:100%) */
			#global {
				background: url('border.png') top right repeat-y;
				position:absolute;
				top:0;
				z-index:0;
				height: 100%;
				margin: 0 20px 0 30px;
			}

			/* puis on met le h1 par dessus (position:absolute; z-index:1) */
			h1 {
				position:absolute;
				top:0;
				z-index:1;
				width: 100%;
				height: 60px;
			}

			/* on descend #content de 60px pour qu'il ne soit pas sous le h1 */
			#content {
				margin: 60px 10px 0 0px;
			}

			/* enfin le footer va en bas de #global */
			#footer {
				position:absolute;
				bottom:0;
				width:100%;
				margin-right: 10px;
			}


			/* couleurs pour débogage*/
			html, body {background-color: black;}
			#global {background-color: white;}
			#content {background-color: cyan;}
			h1 {background-color: blue;}
			#footer {background-color: magenta;}
		</style>
	</head>
	
	<body>
    <h1>Le titre de ma page</h1>
		<div id="global">
			<div id="content">
        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
        tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
        quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
        Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu
        fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
        culpa qui officia deserunt mollit anim id est laborum.</p>
			</div>
			<div id="footer">Copyright &copy; someyear somebody</div>
		</div>
	</body>
</html>


La bordure gauche est OK, mais la droite passe en dessous le #footer, et un margin-right sur celui-ci semble sans effet. Qu'est-ce que j'ai loupé ?

EDIT : il n'est pas impensable non plus de changer le code HTML, si ça peut simplifier les choses...
Modifié par Nebelmann (20 May 2009 - 14:25)
a écrit :
Pour le placement des bordures, je ne vois pas comment leur donner toute la hauteur de l'écran si j'en mets une sur #global et une sur #content. En effet, #content aura seulement la hauteur du texte qu'il contient...
Hmm, en fait, je pensais à mettre {height:100%} sur #content pour lui faire occuper la même place que #global, mais j'avais oublié la marge haute de 60px. Donc effectivement, c'est une mauvaise solution. Ton idée de passer par le body semble bonne, par contre.
a écrit :
La bordure gauche est OK, mais la droite passe en dessous le #footer
Ça c'est normal, le footer est positionné au-dessus de #global. Pour ne pas voir la bordure sous le footer, il te suffit de rendre ce dernier opaque (avec un background-color, par exemple).

Si tu pouvais mettre ta page en ligne et nous filer une url, ça faciliterait pas mal le boulot Smiley smile
a écrit :
Pour ne pas voir la bordure sous le footer, il te suffit de rendre ce dernier opaque (avec un background-color, par exemple).


Tu veux dire transparent ? S'il est opaque, il va bien cacher la bordure, non ? Et actuellement, il a déjà une couleur de fond, le rose de débogage... Je voudrais voir la bordure par dessus le footer, il faudrait la décaler de 10px vers la droite, mais ça ne fonctionnera pas, puisqu'on tombera « en dehors » du div.

Voici la version en ligne, donc :
http://foobaz.free.fr/test.html
Modifié par Nebelmann (20 May 2009 - 16:16)
a écrit :
Je voudrais voir la bordure par dessus le footer
- si ton footer est transparent : pas de problème, la bordure est visible à travers
- si ton footer est opaque : mets lui la bordure en background à droite (même déclaration exactement que pour #global)

PS : si je te demandais une page en ligne, c'était entre autres pour voir les images que tu utilises pour tes bordures, car ça peut remettre en question pas mal de trucs.
J'avais pas pensé à mettre également la bordure sur le footer... pourtant ça parait simple et logique Smiley smile

Pour la version en ligne, effectivement j'ai mal compris mais je suis en plein développement de l'application, donc il est possible que les images changent un peu. Comme je ne pense pas utiliser des PNG transparents, ça ne devrait pas poser de problème. Je vais faire de la « pseudo transparence » en mettant la couleur de fond de la page en couleur de fond de l'image, puisque certains navigateurs gèrent mal la transparence (grr, toujours le même en plus !).

En tout cas, un grand merci pour ton aide marcv ! Smiley ravi

Je teste ça ce soir sur le vrai design et je posterai un aperçu pour info.
J'ai réussi à appliquer ça à ma page réelle, mais il y reste un bug : lorsque le contenu fait moins d'une ligne, la largeur de #content se limite à celle de la phrase, comme on peut le voir sur cette page : http://foobaz.free.fr/tropcourt.html

Des suggestions pour résoudre ceci ?
Si je mets width:100% à #global, le cadre dépasse du viewport...