28172 sujets

CSS et mise en forme, CSS3

Bonjour,

j'ai centré une div, horizontalement et verticalement, en position absolute. Dans la page il y d'autres éléments comme un bannière, une div qui n'est pas en absolute.

Quand je réduis ma fenêtre (test pour différentes résolutions d'écran), la div que j'ai centré, en absolute, passe au dessus de ma bannière.

Est-il possible que celle-ci ne chevauche pas la bannière, que cette div centré soit, lorsque je réduis ma fenêtre, bloqué par la bannière.

Merci pour votre aide Smiley cligne
Bonjour Smiley smile

Un bout de code (css + html) ou une page en ligne seraient les bienvenus, parce que là je vois difficilement comment quelqu'un pourrait t'aider
Bonjour,

ton DIV est positionné par rapport à ton body je pense. Si tu veux qu'il reste centré au redimensionnement, il faut que tu le positionnes par rapport à un conteneur.

Par exemple :


<body>
<div id="container" style="position:relative;margin:0 auto;width:960px;">
  <div style="left:50%;margin-left:-100px;width:200px;">
    Mon div centré en absolute
  </div>
</div>
</body>

Bonjour,


<div id="logo"></div>
<div id="centre">
<p class="p1">...du texte...</p>
</div>


en fait, je ne précise aucune position pour ma première div. Elle est tout en haut...

Ma deuxième div est centré horizontalement et verticalement an absolute, comme ceci :


#centre { position:absolute; left: 50%; top: 50%; margin-top: -75px; margin-left: -450px; width:900px; height:150px; 
}


tout marche très bien, sauf que quand je test sur une résolution 800 x 600, vu que ma deuxième div est toujours centré (et ici c'est le verticalement qui est important) et en absolute, elle chevauche ma div du haut (elle passe au dessus quoi...).

J'aurais donc aimé savoir, s'il était possible, en plus de la centrer cette deuxième div, de la contraindre à ne pas passer au dessus de ma première div, qu'elle soit bloquée par la première.

Merci Smiley cligne
Tes éléments "logo,centre et pl" se trouvent bien à l'intérieur d'un DIV conteneur ? Si ce n'est pas le cas il en faut un. Sur celui-ci mettre un "position:relative" afin que ton DIV#centre se positionne en absolute par rapport à lui et non au body.
Hello Mordikkuss et bienvenue, Smiley smile

le chevauchement est l'un des inconvénients possibles lorsqu'on utilise le positionnement absolu. Il est donc préférable dans ton cas de te servir du display:table-cell; et éventuellement du display:table;. Si tu veux que cela fonctionne également pour IE < 8 tu peux également utiliser un élément table.

Voir Mise en page CSS avancée grâce à la propriété display et pour IE < 8 Un bloc centré horizontalement et verticalement dans la page.
Re,

si j'insère le tout dans une div container en position relative, comment centrer verticalement ma div#centre ?

en testant comme tu dis, j'ai tout qui se chevauche du coup... Smiley cligne

merci pour ton implication Smiley cligne
Mordikkuss a écrit :
en testant comme tu dis, j'ai tout qui se chevauche du coup...
Pas de raison... à moins que tu aies laissé le position:absolute;

Tu pourrais nous montrer le code html et css permettant de reproduire le problème (ou mieux encore un lien vers une page en ligne) ?
Hem... si j'ai bien compris ce que tu veux faire c'est avoir le DIV #centre toujours centré verticalement quelle que soit la hauteur de la page... sauf si ça passe au dessus du DIV #logo Smiley rolleyes .

Ben je ne vois pas trop comment faire puisque du coup il faut sortir #logo du flux (typiquement en le positionnant en absolu) et qu'alors il ne pourra plus repousser #centre... ce qui oblige à mettre un margin-top à #centre de 250px (la hauteur que tu as fixée à #logo) mais alors il ne sera plus centré verticalement... ce qui oblige à mettre également un margin-bottom à #centre de 250px... ce qui va faire un décalage en bas de page dès que le contenu de #centre sera un peu plus conséquent : en gros quelque chose comme ça :
<!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=utf-8" />
<title>Test</title>
<style type="text/css">
html {
	height: 100%;
}
body {
	height: 100%;
	margin: 0;
	padding: 0;
}
#page-table {
	height: 100%;
	width: 100%;
	border-collapse: collapse;
	text-align: center;
}
#page-td {
	height: 100%;
	padding: 0;
	vertical-align: middle;
}
div#global {
	width: 900px;
	margin: 0 auto;
	text-align: left;
}
#logo {
	position: absolute;
	top: 0;
	height:250px;
	width: 900px;
	background:#aaa;
}
#centre {
	background: #ccc;
	margin: 250px 0;
}
	</style>
</head>

<body>
<table id="page-table"><tr><td id="page-td">
	<div id="global">
		<div id="logo"></div>
		<div id="centre">
			<p class="p1">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>
			<p class="p1">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><!--#centre-->
	</div><!--#global-->
</td></tr></table><!--#page-table-->
</body>
</html>
Donc je te déconseille fortement cette mise en page (à moins d'avoir également un DIV #footer de 250px de haut) puisque même avec la fonction calc de CSS3 je ne suis pas sûr qu'on s'en sorte.

D'ailleurs je trouve ça bien compliqué pour un résultat "tangible" seulement pour des contenus très petits de #centre et sur des hautes résolutions... Alors qu'il suffirait de tout laisser dans le flux et de faire tout simplement :
<!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=utf-8" />
<title>Test</title>
<style type="text/css">
body {
	margin: 0;
	padding: 0;
}
div#global {
	width: 900px;
	margin: 0 auto;
}
#logo {
	height:250px;
	background:#aaa;
}
#centre {
	background: #ccc;
	padding: 1px 0;
}
	</style>
</head>

<body>
<div id="global">
	<div id="logo"></div>
	<div id="centre">
		<p class="p1">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>
		<p class="p1">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><!--#centre-->
</div><!--#global-->
</body>
</html>


Edit: à noter tout de même qu'avec la version simplifiée du code il suffirait d'un peu de JavaScript pour vérifier la hauteur du viewport et de #centre et de décider ensuite si on peut ou non (en fonction d'un éventuel chevauchement de #logo) modifier le margin-top de #centre.
Modifié par Heyoan (02 Sep 2010 - 13:22)