28173 sujets

CSS et mise en forme, CSS3

Bonjour,

je ne comprends pas pourquoi ma boite principale "page" n'adapte pas sa taille quand le texte est trop long...

quelle est l'erreur énorme que je fais ?

Merci,

Mathieu, qui devient chèvre une fois de plus...

<html>
<head>
<title>essai CSS</title>
<style type="text/css">
body { 
  text-align:center;
}

#page {
  position:relative;
  width:850px;
  text-align:left;
  margin:auto;
  border: solid 1px red;
}




</style>

<body>
<div id="page">
<img src="1pix.gif" height="850">
<div style="position:absolute;left:0;top:80px;width:300px;">
<p>
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec lorem tortor, luctus ut, hendrerit vel, interdum ac, purus. Sed congue lorem sit amet ligula. Mauris fringilla turpis sed ligula. Suspendisse blandit. Praesent erat. Pellentesque vel metus ac lectus tincidunt pellentesque. Nunc arcu. Mauris consectetuer ante sed elit. Nunc fermentum. Suspendisse sit amet lorem interdum risus tincidunt gravida. In sit amet metus. Duis tincidunt condimentum magna. Donec ut ipsum a erat bibendum venenatis. In hac habitasse platea dictumst. Nulla dolor neque, pretium at, vehicula in, tempus quis, pede. Donec vel ligula. Curabitur convallis congue augue. Ut molestie, nibh id placerat vestibulum, leo arcu nonummy magna, at rutrum odio urna a metus. Morbi luctus mi a tellus. Donec pulvinar nibh quis lorem.
</p>
<p>
Phasellus suscipit. Suspendisse fermentum. Cras sed leo aliquet neque dignissim mollis. Curabitur sollicitudin pede ac eros. Proin pede massa, fermentum sit amet, fermentum non, rhoncus eget, odio. Quisque at nulla vitae erat ultricies euismod. Ut a ipsum. In lorem ligula, fermentum sollicitudin, pellentesque non, tempor quis, quam. Nullam nec elit. Integer aliquam ante id odio. Duis massa mauris, blandit tempus, consequat commodo, accumsan eget, mi. Ut mauris urna, faucibus ut, volutpat ac, consequat et, urna. Duis nisl.
</p>
<p>
Sed sit amet nisi. Quisque nonummy sodales arcu. Nullam ut tellus. Nullam sed magna. In velit purus, mattis eu, aliquam quis, egestas id, magna. Praesent porta mollis massa. Morbi quis sem eu risus sodales tristique. Aenean libero. Phasellus vitae diam pharetra enim commodo bibendum. Aliquam erat volutpat.
</p>
<p>
Etiam non erat. Pellentesque hendrerit arcu sed ante. Fusce vitae sapien. Ut nisi nisl, viverra vitae, ullamcorper sed, semper vitae, mi. Vivamus laoreet augue a odio. Praesent ut leo ac enim rhoncus dictum. Duis laoreet. In malesuada viverra nulla. Nunc urna enim, dignissim ac, vulputate eget, pulvinar vel, nibh. Aliquam risus pede, porta a, rutrum ullamcorper, sodales ac, dolor. Mauris sagittis orci ut est. Praesent eget felis. Phasellus eu ipsum pellentesque lectus aliquet fringilla. Praesent porttitor dui a turpis. Suspendisse potenti. Nam non urna. Ut ligula eros, rutrum eu, dapibus eu, scelerisque et, erat. Maecenas varius. Aliquam erat volutpat. Duis vulputate pharetra nibh.
</p>
<p>
Aenean sed nunc. Phasellus purus. Proin nunc. Quisque porta, ante et bibendum cursus, orci nibh porta arcu, in dictum justo est et sem. Quisque tempus arcu at odio. Quisque imperdiet urna et augue. Curabitur tincidunt, erat non condimentum interdum, purus augue vehicula diam, eu dignissim metus urna et lorem. Praesent mauris. Fusce ullamcorper tincidunt dui. Pellentesque accumsan lectus sed nunc. Sed et pede eu turpis venenatis pharetra. Duis a urna. Praesent pharetra. Donec a ante nec nunc scelerisque tempus. Sed ultricies facilisis leo. Pellentesque pharetra nonummy sapien. Integer egestas tortor.
</p>
</div>

</div>
<div style="position:relative;">footer</div>

</body>
</html>


edit: disons que c'est résolu... fallait lire la doc et pas essayer de mettre de l'absolute (dans mon verre non plus)
Modifié par Mathcoz (12 Sep 2007 - 23:04)
Bonsoir,

Dans les erreurs énormes:
- absence de Doctype (lire le tutoriel sur les DTD sur Alsacréations);
- contenu de div#page positionné en absolu (lire les articles d'Openweb sur le positionnement CSS).

En l'occurrence, c'est la seconde erreur qui joue ici.
Bonsoir Florent,

Il n'y a pas de doctype parce que je m'énerve tellement après la "vraie" page que je viens de créer un fichier html "basique" pour faire mes tests.

J'ai lu effectivement les docs sur le positionnement, j'avais encore le nez dessus pas plus tard que cette après midi. Mais... ça ne vient toujours pas.

Je viens de passer la div contenue dans #page en relative, et effectivement, la hauteur de #page augmente suffisamment et le footer est bien en dessous du tout.

Mais, je suis du coup obligé de préciser un top négatif tenant compte de la hauteur de l'image (par dessus laquelle je voudrais superposer ce texte).

Je sais bien que je pourrais tout simplement mettre en background cette image. C'était juste pour l'exemple.

Dans la réalité, j'ai une page avec un bloc principal centré et faisant une largeur fixe, et une image de fond. Dans ce bloc se trouvent d'autres blocs positionnés en absolu pour coïncider précisément avec certains éléments de l'image de fond.

Donc, tout allait bien dans le meilleur des mondes jusqu'à ce qu'un rédacteur un peu trop bavard vienne mettre son grain de sel !!

D'où mon étonnement et mon incompréhension... Pourquoi un absolute empêche-t-il de calculer la hauteur correcte de la division principale ? Je trouve ça très bizarre...

Du coup, je suis obligé de bien vérifier à quel endroit dans le flux se trouve ce bloc de texte, pour calculer correctement son top et son left.

Mais peut-être existe-t-il une façon correcte de faire ça, tout en positionnant où l'on veut dans le flux le fameux texte et sans être obligé de passer par du javascript ?

Voila, je viens donc de rajouter un doctype et de mettre en relative, mais le contenu continue de déborder maintenant (alors que sans doctype, et donc en quirkmode, ça marche).

Comprends plus rien...

<!DOCTYPE html
     PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>essai CSS</title>
<style type="text/css">
body {
  text-align:center;
}

#page {
  position:relative;
  width:850px;
  text-align:left;
  margin:auto;
  border: solid 1px red;
}




</style>

<body>
<div id="page">
<img src="1pix.gif" height="850" style="position:relative;left:0;top:0px;">
<div style="position:relative;left:0;top:80px;width:300px;">
<p>
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec lorem tortor, luctus ut, hendrerit vel, interdum ac, purus. Sed congue lorem sit amet ligula. Mauris fringilla turpis sed ligula. Suspendisse blandit. Praesent erat. Pellentesque vel metus ac lectus tincidunt pellentesque. Nunc arcu. Mauris consectetuer ante sed elit. Nunc fermentum. Suspendisse sit amet lorem interdum risus tincidunt gravida. In sit amet metus. Duis tincidunt condimentum magna. Donec ut ipsum a erat bibendum venenatis. In hac habitasse platea dictumst. Nulla dolor neque, pretium at, vehicula in, tempus quis, pede. Donec vel ligula. Curabitur convallis congue augue. Ut molestie, nibh id placerat vestibulum, leo arcu nonummy magna, at rutrum odio urna a metus. Morbi luctus mi a tellus. Donec pulvinar nibh quis lorem.
</p>
<p>
Phasellus suscipit. Suspendisse fermentum. Cras sed leo aliquet neque dignissim mollis. Curabitur sollicitudin pede ac eros. Proin pede massa, fermentum sit amet, fermentum non, rhoncus eget, odio. Quisque at nulla vitae erat ultricies euismod. Ut a ipsum. In lorem ligula, fermentum sollicitudin, pellentesque non, tempor quis, quam. Nullam nec elit. Integer aliquam ante id odio. Duis massa mauris, blandit tempus, consequat commodo, accumsan eget, mi. Ut mauris urna, faucibus ut, volutpat ac, consequat et, urna. Duis nisl.
</p>
<p>
Sed sit amet nisi. Quisque nonummy sodales arcu. Nullam ut tellus. Nullam sed magna. In velit purus, mattis eu, aliquam quis, egestas id, magna. Praesent porta mollis massa. Morbi quis sem eu risus sodales tristique. Aenean libero. Phasellus vitae diam pharetra enim commodo bibendum. Aliquam erat volutpat.
</p>
<p>
Etiam non erat. Pellentesque hendrerit arcu sed ante. Fusce vitae sapien. Ut nisi nisl, viverra vitae, ullamcorper sed, semper vitae, mi. Vivamus laoreet augue a odio. Praesent ut leo ac enim rhoncus dictum. Duis laoreet. In malesuada viverra nulla. Nunc urna enim, dignissim ac, vulputate eget, pulvinar vel, nibh. Aliquam risus pede, porta a, rutrum ullamcorper, sodales ac, dolor. Mauris sagittis orci ut est. Praesent eget felis. Phasellus eu ipsum pellentesque lectus aliquet fringilla. Praesent porttitor dui a turpis. Suspendisse potenti. Nam non urna. Ut ligula eros, rutrum eu, dapibus eu, scelerisque et, erat. Maecenas varius. Aliquam erat volutpat. Duis vulputate pharetra nibh.
</p>
<p>
Aenean sed nunc. Phasellus purus. Proin nunc. Quisque porta, ante et bibendum cursus, orci nibh porta arcu, in dictum justo est et sem. Quisque tempus arcu at odio. Quisque imperdiet urna et augue. Curabitur tincidunt, erat non condimentum interdum, purus augue vehicula diam, eu dignissim metus urna et lorem. Praesent mauris. Fusce ullamcorper tincidunt dui. Pellentesque accumsan lectus sed nunc. Sed et pede eu turpis venenatis pharetra. Duis a urna. Praesent pharetra. Donec a ante nec nunc scelerisque tempus. Sed ultricies facilisis leo. Pellentesque pharetra nonummy sapien. Integer egestas tortor.
</p>
</div>

</div>
<div style="position:relative;">footer</div>

</body>
</html>
Tiens, c'est bizarre : si je passe à zéro le top de ma boite de texte, la div #page s'allonge correctement pour contenir tout le texte. Du coup je peux rattraper le coup en mettant un top:80px au premier paragraphe, ou en mettant le tout dans une nouvelle division.

Par contre, IE6 continue de penser qu'il faut mettre tout ça après l'image piège qui est juste avant... J'ai donc un peu peur du résultat sur d'autres navigateurs.

Pourquoi ça marche pas directement avec le top:80px dans la boite de texte ?

<!DOCTYPE html
     PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>essai CSS</title>
<style type="text/css">
body {
  text-align:center;
}

#page {
  position:relative;
  width:850px;
  text-align:left;
  margin:auto;
  border: solid 1px red;
}
</style>
<body>
<div id="page">
<img src="1pix.gif" height="850" style="position:relative;left:0;top:0px;">
<div style="position:relative;left:0;top:0px;width:300px;border:dashed 1px black;">
<div style="margin-top:80px;">
  <p >
  Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec lorem tortor, luctus ut, hendrerit vel, interdum ac, purus. Sed congue lorem sit amet ligula. Mauris fringilla turpis sed ligula. Suspendisse blandit. Praesent erat. Pellentesque vel metus ac lectus tincidunt pellentesque. Nunc arcu. Mauris consectetuer ante sed elit. Nunc fermentum. Suspendisse sit amet lorem interdum risus tincidunt gravida. In sit amet metus. Duis tincidunt condimentum magna. Donec ut ipsum a erat bibendum venenatis. In hac habitasse platea dictumst. Nulla dolor neque, pretium at, vehicula in, tempus quis, pede. Donec vel ligula. Curabitur convallis congue augue. Ut molestie, nibh id placerat vestibulum, leo arcu nonummy magna, at rutrum odio urna a metus. Morbi luctus mi a tellus. Donec pulvinar nibh quis lorem.
  </p>
  <p>
  Phasellus suscipit. Suspendisse fermentum. Cras sed leo aliquet neque dignissim mollis. Curabitur sollicitudin pede ac eros. Proin pede massa, fermentum sit amet, fermentum non, rhoncus eget, odio. Quisque at nulla vitae erat ultricies euismod. Ut a ipsum. In lorem ligula, fermentum sollicitudin, pellentesque non, tempor quis, quam. Nullam nec elit. Integer aliquam ante id odio. Duis massa mauris, blandit tempus, consequat commodo, accumsan eget, mi. Ut mauris urna, faucibus ut, volutpat ac, consequat et, urna. Duis nisl.
  </p>
  <p>
  Sed sit amet nisi. Quisque nonummy sodales arcu. Nullam ut tellus. Nullam sed magna. In velit purus, mattis eu, aliquam quis, egestas id, magna. Praesent porta mollis massa. Morbi quis sem eu risus sodales tristique. Aenean libero. Phasellus vitae diam pharetra enim commodo bibendum. Aliquam erat volutpat.
  </p>
  <p>
  Etiam non erat. Pellentesque hendrerit arcu sed ante. Fusce vitae sapien. Ut nisi nisl, viverra vitae, ullamcorper sed, semper vitae, mi. Vivamus laoreet augue a odio. Praesent ut leo ac enim rhoncus dictum. Duis laoreet. In malesuada viverra nulla. Nunc urna enim, dignissim ac, vulputate eget, pulvinar vel, nibh. Aliquam risus pede, porta a, rutrum ullamcorper, sodales ac, dolor. Mauris sagittis orci ut est. Praesent eget felis. Phasellus eu ipsum pellentesque lectus aliquet fringilla. Praesent porttitor dui a turpis. Suspendisse potenti. Nam non urna. Ut ligula eros, rutrum eu, dapibus eu, scelerisque et, erat. Maecenas varius. Aliquam erat volutpat. Duis vulputate pharetra nibh.
  </p>
  <p>
  Aenean sed nunc. Phasellus purus. Proin nunc. Quisque porta, ante et bibendum cursus, orci nibh porta arcu, in dictum justo est et sem. Quisque tempus arcu at odio. Quisque imperdiet urna et augue. Curabitur tincidunt, erat non condimentum interdum, purus augue vehicula diam, eu dignissim metus urna et lorem. Praesent mauris. Fusce ullamcorper tincidunt dui. Pellentesque accumsan lectus sed nunc. Sed et pede eu turpis venenatis pharetra. Duis a urna. Praesent pharetra. Donec a ante nec nunc scelerisque tempus. Sed ultricies facilisis leo. Pellentesque pharetra nonummy sapien. Integer egestas tortor.
  </p>
</div>
</div>

</div>
<div style="position:relative;">footer</div>

</body>
</html>
Mathcoz a écrit :
Il n'y a pas de doctype parce que je m'énerve tellement après la "vraie" page que je viens de créer un fichier html "basique" pour faire mes tests.

Oui, c'est une erreur de débutant courante.
Mais le problème, c'est que l'absence de Doctype fait passer les navigateurs en mode Quirks. Si tu as un site avec un Doctype complet (rendu en mode Standard), et que tu fais des tests en mode Quirks, ça peut être problématique.

Conseil: fais-toi un fichier «page HTML vierge» avec tout ce qu'il faut pour faire une page valide (mais sans contenu) en bonne et due forme, et réutilise-le à chaque fois que tu veux faire une page de test.

Mathcoz a écrit :
J'ai lu effectivement les docs sur le positionnement, j'avais encore le nez dessus pas plus tard que cette après midi. Mais... ça ne vient toujours pas.

Ben apparemment non, vu que tu poses encore la question suivante:
Mathcoz a écrit :
Pourquoi un absolute empêche-t-il de calculer la hauteur correcte de la division principale ?

La réponse est dans l'article d'Openweb auquel je faisais référence. Je te laisse le chercher tranquillement si tu ne le connais pas (google...), et le relire soigneusement si tu l'as déjà parcouru.

En règle générale, quand je vois une mise en page CSS qui commence avec du position: absolute ou du position: fixed, je sais que j'ai affaire à un débutant qui va droit dans le mur par méconnaissance du positionnement CSS.
Mais je m'avance peut-être un peu trop, et peut-être le positionnement absolu est-il pertinent ici, c'est à voir.
Je veux bien que mes questions de débutant soient ennuyeuses, et dans ce cas je comprends parfaitement qu'on n'y réponde pas, mais si tu lis mes deux autres messages, tu verras pourquoi le positionnement absolu m'est nécessaire, et que le coup du manque de doctype était plutôt une conséquence de mon énervement passager devant l'impasse (je suis redevenu parfaitement conscient du passage en mode quirk puisque j'y fait référence). Tu verras surtout qu'avec un doctype correct et un positionnement qui n'est plus absolu, le comportement reste très bizarre.

Je ne suis pas un jeune débutant, mais plutôt un vieux, puisque mes premières questions relatives aux CSS ici-même datent déjà d'un petit moment. C'est juste une question d'allergie profonde, ou de débilité tout aussi profonde Smiley lol
Autant pour moi, j'ai lu certains passages un peu vite.

Par contre, je ne vois pas trop ce que tu cherches à faire et quel est le problème exact. Tu as une image (dont je ne sais pas à quoi elle ressemble ou quelles sont ses dimensions), pour laquelle tu indiques une hauteur de 850px. Quel est le rôle qu'est censé avoir cette image?

J'ai testé le code que tu fournis dans ton avant-dernier message, et il n'y a pas/plus de dépassement. Si j'attribue un top: 80px au bloc de texte qui est positionné en relatif, il descend de 80px mais mord de 80px également sur le bas du cadre rouge, aussi bien dans IE6 que dans Firefox 2. C'est tout à fait normal, c'est le principe du positionnement relatif. Si ce n'est pas le résultat souhaité, il ne faut à priori pas utiliser le positionnement relatif.

Voilà où j'en suis. J'ai dû louper une information à nouveau, car j'ai du mal à visualiser le problème. Est-ce lié à cette image que je n'ai pas?
hello,

le problème principal est assez classique : la mise en page a été demandée à un graphiste et celui-ci a retourné une image en 850x850 (pourquoi pas 800x600, assez classiquement, ça... yo no se). Donc, dans cette image il y a certaines zones avec du texte, et des images qui servent de boutons pour accéder à diverses rubriques. J'ai donc adapté un css fonctionnant parfaitement pour centrer une div de 850x850 avec son image (épurée des boutons et textes) en background. Ensuite j'ai positionné à l'intérieur en absolute les boutons et zones de textes.

Tout allait très bien jusqu'à ce qu'un des textes dépasse la taille habituelle pour le site, et que du coup le footer se trouve comme qui dirait... mélangé au dit texte.

Et voila, à qui qu'on demande de réparer ça illico ? à bibi MCo... Smiley bawling

En bref, pour lecture rapide, je cherche un design simple qui permette de centrer sur une page une zone de 850x850 dans laquelle on puisse disposer des zones de textes, en colonnes, pouvant éventuellement augmenter la hauteur de la boite d'origine (tant pis pour le background, car heureusement le graphiste n'a rien placé de particulier en bas...). Le footer devant lui rester en bas de page.
Mathcoz a écrit :
En bref, pour lecture rapide, je cherche un design simple qui permette de centrer sur une page une zone de 850x850 dans laquelle on puisse disposer des zones de textes, en colonnes, pouvant éventuellement augmenter la hauteur de la boite d'origine

Eh bien, il me semble qu'il te suffit d'utiliser soit une hauteur minimale, soit un peu de margin/padding.

Tu peux par exemple avoir un conteneur en min-height: 850px, et le laisser s'allonger pour englober son contenu si celui-ci le nécessite.

Si tu connais à l'avance la longueur du contenu (site plaquette avec contenu évoluant peu, par exemple), tu peux utiliser un peu de margin ou padding sur le bloc de texte, afin d'avoir un retrait en haut de Npx, et peut-être le même retrait en bas de Npx. Pour la quantité de texte prévue et pour la taille de texte par défaut, cela aura un aspect centré. Si tu as plus de texte, ou si l'utilisateur agrandit la taille du texte, le contenu sera plus long que la hauteur minimale prévue, et le bloc s'agrandira. Si tu as moins de texte, par contre, le texte ne sera pas centré (tu auras juste ton retrait de Npx en haut).

Pour centrer verticalement un contenu, deux solutions:
- utiliser un tableau de mise en forme à une cellule (ne pas écouter les ayatollahs qui disent que létablocéleumal Smiley cligne ), avec vertical-align: middle;
- utiliser display: table-cell sur le bloc de texte, toujours avec vertical-align: middle (solution non compatible Internet Explorer).

À toi de voir si le centrage vertical du texte court est dispensable (on n'utilise aucune des deux solutions ci-dessus), intéressant mais pas indispensable (on utilise la deuxième solution), ou vraiment important (on utilise la première solution).
Hello,

Merci pour les idées. C'est vrai que j'ai essayé le min-height (avec l'astuce du !important) mais c'est justement en constatant que ça ne marchait toujours pas avec IE que j'ai craqué et suis venu me lamenter ici. En fait le soucis principal c'est que les zones de textes et les zones réactives doivent se positionner très précisément par rapport au background. D'où mon départ sur l'absolute pour les contenus.

Sinon, il me reste la solution qui ressemble à ce qu'on faisait avec des tableaux, à savoir découper le background en plusieurs zones (physiquement, faire plusieurs gif) et les mettre dans des divisions indépendantes. Je pense que ça pourrait le faire, étant donné que le graphiste a été assez gentil pour ne rien mettre en bas de son dessin.

Bon, merci encore pour le soutien.

A titre d'archive, les liens que j'ai consulté au cours de mon aventure :

j'ai commencé par là, pour le positionnement précis :
gihef.bey.free.fr/CCM/affichemasquebloc/over.html
puis je suis passé par là :
forum.alsacreations.com/topic-4-15204-1-Hauteur-variable.html
et bien sur ! css.alsacreations.com/Modeles-de-mise-en-page-en-CSS

Après... orgie via google :

openweb.eu.org/articles/initiation_absolue
openweb.eu.org/articles/initiation_absolue/annexes/annexe4.html
w3qc.org/docs/dix_trucs_css
cssplay.co.uk
meyerweb.com
www.positioniseverything.net
www.fastclemmy.com
webmaster-hub
Modifié par Mathcoz (13 Sep 2007 - 12:09)