28173 sujets

CSS et mise en forme, CSS3

Bonjour,

En voulant transformer mes pages HTML 4.01 en XHTML 1.0, je me suis trouvé confronté à un problème concernant le design général des pages. J'utilise les propriétés "overflow:auto" et "overflow:hidden" pour disposer mes blocks sur les pages. Or j'ai découvert que Firefox 1.5 (et peut-être d'autres navigateurs) gère différemment cette propriété en fonction du Doctype, plus précisemment en fonction du mode quirks/standards.

J'ai réalisé la page de test ci-dessous pour exposer le problème, en épurant le code de tout ce qui n'était pas nécessaire.
Alors, voilà ce que je désire faire :


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="fr">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  <title>Test overflow</title>
  <style type="text/css">
  * {
    margin: 0;
    padding: 0;
    border: 0;
  }
  body {
	font-family: Arial,Helvetica,serif;
	font-size: 80%;
	padding-top: 180px;
	overflow: hidden;
  }
  #scrollcont {
	height: 100%;
	overflow: auto;
	margin-left: 70px;
	margin-right: 20px;
        border: 1px solid black;
  }
  p {
	margin-bottom: 1.5em;
  }
  </style>
</head>
<body>
<div id="scrollcont">
    <h2>Contenu bidon :</h2>
    <p>bla bla bla....</p>
    <p>plein de contenu....</p>
    <p>etc...</p>
</div>
</body>
</html>


Cette page fonctionne parfaitement bien, à la fois sous FF et sous IE.
Mais, comme vous l'aurez remarqué, le Doctype n'est pas complet, on est donc en mode quirks...
Or, dès que je rajoute l'url (par exemple http://www.w3.org/TR/html4/loose.dtd pour l'HTML 4.01 Transitional), la page ne fonctionne plus, la scrollbar n'apparaît plus !! (au moins sous Firefox, parce que bien évidemment, IE5.5 n'y voit que du feu et continue à bien fonctionner...).
Le même problème se pose avec n'importe lequel des Doctypes (en particulier avec celui de XHTML 1.0, Transitionnal ou pas).
Ma question est donc la suivante :
- existe-t-il une ligne "magique" à rajouter dans le css pour faire marcher ma page en mode "Standards" ?
- ou bien faut-il que je me restreigne à n'utiliser que le mode "Quirks" pour mes pages ? Smiley decu

Remarque : ma mise en page ressemble en gros à un "mix" entre les modèles 13 et 14 disponibles sur Alsa. J'ai un menu fixe à gauche et un header fixe en haut, la grosse différence étant que mon header doit faire 180 px (pas un pourcentage, donc je ne peux pas connaître la hauteur de mon div contenu, qui doit aller jusqu'en bas de la page).

Merci.
Modifié par Mpok (12 Feb 2006 - 18:32)
Modérateur
bonjour,
En regardant le css, on voit que
overflow:hidden;
est appliqué a body, et ça sert justement a caché ce qui depasse/deborde et les scrollbar. J'en deduis un comportement tout a fait normal en mode standard.
Ensuite indiqué 100% de hauteur a #scrollcont sans donner de taille explicite dans le css a body et html (les conteneurs principaux) tu risque aussi d'avoir une taille/dimension aleatoire d'un navigateur a l'autre.

Il est en fait preferable de partir sur un doctype valide et eviter aux navigateurs de passer en mode quirks, le resultat visuel n'en sera que moins aleatoire.(c'est mon avis de faux-debutant).
bonne soirée
a écrit :

En regardant le css, on voit que

overflow:hidden;

est appliqué a body, et ça sert justement a caché ce qui depasse/deborde et les scrollbar.

Ben, oui... Je la cache pour toute la page (donc dans body)... et je la ré-active uniquement pour #scrollcont (par overflow: auto). Donc seul #scrollcont doit scroller. C'est pas comme ça que c'est censé fonctionner ?

Et pour :
a écrit :

Il est en fait preferable de partir sur un doctype valide et eviter aux navigateurs de passer en mode quirks, le resultat visuel n'en sera que moins aleatoire.

Je suis parfaitement d'accord. C'est bien pour cela que j'essaie de passer à un doctype xhtml 1.0 strict... et c'est là que j'ai le problème !
Parce que, rappellons-le, en mode Quirks, l'ensemble de la page (qui est évidemment bien plus compliquée que l'exemple restreint présenté ici, avec menu, header, etc...) est parfaitement affichée à la fois sous FF et sous IE (et même, AU PIXEL PRES... Smiley cligne ).

Merci de t'être penché sur le pbm...

Note : depuis mon premier message, j'ai (re)-parcouru plusieurs topics du forum sur ces problèmes d'overflow, et j'ai bien l'impression qu'il n'y a pas moyen d'utiliser le "overflow:auto" sur un contenu "fluide", c'est à dire sans préciser une hauteur... (le "100%" semble servir à rien) c'est bien dommage Smiley decu !
Mais je ne m'estime pas encore vaincu....
Modérateur
rebonjour,
en fait, je n'ai peut-etre pas etait clair , mais ton height:100%; ne correspond, a rien Smiley confused (c'est pour ça qui semble servir a rien) , 100% de quoi se demande les navigateurs, la hauteur que body ou html ont deja atteinte, 0, ou la hauteur de la fenetre du navigateur ?...
as tu essayer alors de fixer html et body a 100%; puis redonner une taille en pourcentage taille a ton element "scrolleur", pour voir comment il reagisser au moment d'un supposé debordement de contenu ?
Chez moi, donnant une referance de taille aux conteneurs principaux (de 100%) le conteneur scrolleur, voit sa taille grandir et etre equivalente a la hauteur de la fenetre, et affiche la barre de scroll dans le cas d'un long contenu....
fallait tout lire Smiley langue
a plus
Bon, j'ai refait les tests que j'avais déjà fait avant de poster... (au cas où j'aurais laissé passer qque chose).

Si je rajoute :

html, body {
  width: 100%;
  height: 100%;
}

Alors, effectivement, il ne faut pas mettre le height:100% dans #scrollcont, parce que si le contenu est petit, le div va quand même jusqu'au bas de la page, ce qui n'est pas souhaité.
Mais cela ne résout pas le problème pour autant (pas de scrollbar quand le contenu est grand).

En revanche, dans le mode quirks, sans les 100% sur le body, il faut
mettre height:100% sur #scrollcont pour avoir la scrollbar...
Je suis donc d'accord avec toi : normalement, ça ne sert à rien, mais c'est pourtant ce qui fait que ma page fonctionne bien en mode quirks...

Je commence vraiment à croire que ce n'est pas possible de le faire en mode standards (ça fait quand même 2 jours que je fais des tests dans tous les sens...)
Modérateur
bonsoir,
bon je commence a croire que je ne saisi pas bien le resultat que tu souhaite obtenir.
Chercherait tu a confiné ton "scrolleur" dans la partie inferieur de ta page quelque soit la resolution/ ou hauteur de la fenêtre ?
Sa position par rapport au haut de la page doit-elle etre en pourcentage aussi ou a tant de pixel du haut, .... etc ...
J'avoue ne pas comprendre quel rendu tu veux au final.
a plus
Re-(re-re)bonsoir,
a écrit :
je commence a croire que je ne saisi pas bien le resultat que tu souhaite obtenir.

Ben si ! Smiley biggrin Parce que les réponses sont contenues dans tes questions !!

- oui, je veux que le scrolleur soit fixé en bas à droite de la page (quelque soit la résolution ou le navigateur). Pour être plus précis, c'est plutôt le header et le menu de gauche que je veux "fixer", mais ça revient au même...
- oui, sa position est fixé à 180px du haut (et pas en pourcentage, comme je l'ai dit dans mon premier post, parce que le header est composé d'une image qui doit "coller" au haut du scrolleur). Cette taille en unités fixes est une des causes du problème, c'est pour cela que je ne peux pas fixer la "height" de ce scrolleur puisqu'elle doit faire [hauteur de l'écran - 180px].

J'ajoute que si le contenu du scrolleur est suffisamment petit pour tenir dans l'écran, il doit se fermer avant la fin de l'écran (c'est pour cela que j'ai mis "border 1px solid" dans le test, pour voir où se termine #scrollcont).

Le plus simple, pour voir le fonctionnement voulu, c'est de copier intégralement le code donné dans le premier post, de rajouter éventuellement du contenu bidon, et d'afficher le résultat sous FF ou IE.
Car "en mode quirks, TOUT fonctionne bien" !
(je sais, je me répète trop... Smiley cligne )

[EDIT]:
euh, en fait j'ai parlé un (petit) peu vite...
Pour que le cadre "diminue" avec le contenu, il faut encadrer le contenu lui-même et pas directement #scrollcont. Donc rajouter un div en dessous de #scrollcont et mettre le border sur ce contenu interne.
[/EDIT]

Enfin, tu auras sans doute deviné que si je fais tout ce pataquès avec les "overflow:hidden" et "overflow:auto", c'est principalement pour que les pages s'affichent à l'identique sous FF et IE, parce que je pense que si je n'avais qu'à traiter FF, j'aurais "tout bêtement" utilisé des "position:fixed" sur le menu et le header, sans avoir à mettre "overflow:hidden" sur le body...

Ouf ! En espérant que ça t'éclaire...
A plus.
Modifié par Mpok (14 Dec 2005 - 01:10)
Modérateur
sit u avais une banniere en pourcentage, y'aurais pas de patacaisse Smiley cligne
essai ça pour voir :
<!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="en" lang="fr">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />


  <title>Test overflow</title>

  <style type="text/css">
html, body{
	height: 100%;
	overflow:hidden;
}
  * {
    margin: 0;
    padding: 0;
  }
body {
	font-family: Arial,Helvetica,serif;
	font-size: 80%;
	height: 99%;
	padding-bottom:1%;/* pour faire ta marge en bas ? */
	background-color:#666;
  }

#scrollcont {
	margin-left: 170px;
	margin-right: 20px;
	background-color:#444;
  }
  p {
	margin-bottom: 1.5em;
  }
#ban  {
	background-color:#666;
	height:180px;
	position:absolute;
	width:100%;
	left:-16px;/* pour degager la barre de scroll */
}
#ban * {
	margin-left:16px; /* pour reprendre au moins les 16 px de marge negative */
	}
#marge-ban {
	background-color:#000;
	height:180px;
}
#conteneur {
	background-color:#888;
	height:99%;/* on ne vas deborder sur le body quand meme [smile] */
	overflow:auto;
}
  </style>

</head>

<body>
<div id="ban"><h1>on dirait des faux frames en css !</h1></div>
<div id="conteneur">
<div id="marge-ban"></div>
<div id="scrollcont">
    <h2>Contenu bidon :</h2>
    <p>bla bla bla....</p>
    <p>plein de contenu....</p>
    <p>etc...</p>
    <h2>Contenu bidon :</h2>
    <p>bla bla bla....</p>
    <p>plein de contenu....</p>
   <p>etc...</p>
    <h2>Contenu bidon :</h2>
    <p>bla bla bla....</p>
    <p>plein de contenu....</p>
    <p>etc...</p>
    <h2>Contenu bidon :</h2>
    <p>bla bla bla....</p>
    <p>plein de contenu....</p>
   <p>etc...</p>
    <h2>Contenu bidon :</h2>
    <p>bla bla bla.... bah voila! si pas de hauteur , pas de scroll, et si differentes resolution en 

melangeant pixel et pourcentage alors pas de jolies soluces </p>
    <p>Ah si la banniere etait "taillable en pourcentage, y'aurais pas de patacaisse. [smile], mais c'est ton 

choix</p>
    <p>etc...</p>
    <h2>Contenu bidon :</h2>
    <p>bla bla bla....</p>
    <p>plein de contenu....</p>
   <p>etc...</p>
    <h2>Contenu bidon :</h2>
    <p>bla bla bla....</p>
    <p>plein de contenu....</p>
    <p>etc...</p>
    <h2>Contenu bidon :</h2>
    <p>bla bla bla....</p>
    <p>plein de contenu....</p>
   <p>etc...</p>
    <h2>Contenu bidon :</h2>
    <p>bla bla bla....</p>
    <p>plein de contenu....</p>
    <p>etc...</p>
    <h2>Contenu bidon :</h2>
    <p>bla bla bla....</p>
    <p>plein de contenu....</p>
   <p>etc...</p>
    <h2>Contenu bidon :</h2>
    <p>bla bla bla....</p>
    <p>plein de contenu....</p>
    <p>etc...</p>
    <h2>Contenu bidon :</h2>
    <p>bla bla bla....</p>
    <p>plein de contenu....</p>
   <p>etc...</p>


</div>
</div>
</body>
</html>

a pluche
Merci....
- déjà de t'être intéressé au sujet.
- ensuite d'avoir pondu le test ci-dessus.

Mes réactions (pour le moment) :
1) à la lecture du post : oulà là, ça m'a l'air bien compliqué...
2) à l'intégration dans mon éditeur (en essayant en même temps de comprendre le code) : ça va jamais marcher...
3) au moment du test sous FF : oh, ben zut ! Ca marche !!! mais ça va planter sous IE... Smiley cligne
4) au moment du test sous IE (5.5 pour l'instant, il faut que je change de PC pour tester sous IE6) : INCROYABLE ! Ca marche aussi....

Bref, pour le moment, je suis sur le c.., et je m'incline bien bas... Smiley ravi

Je me suis bien marré aussi en voyant ton titre "on dirait des faux frames en css" ! Parce que précisemment, la toute première version de mon site était en frames, ensuite j'ai été "converti" et j'ai essayé (vainement, au moins en mode standards) de faire la même chose en CSS. Bien vu, donc ! Smiley biggrin

Bon, pour ce soir, je vais aller me coucher (content). Et demain soir, j'essaierai de combiner mon "vrai" contenu (header+menu+reste) avec ton gabarit pour voir ce que ça donne (j'arrive toujours pas à croire que ça va marcher nickel... Smiley smile )
Et ensuite seulement, je reviendrai mettre un petit (gros) Résolu...

Note de dernière minute : j'ai bien compris ton idée de margin à -16px mais cela semble créer un "effet de bord" indésirable lorsque le contenu est petit et que la scrollbar disparaît. A creuser demain lorsque je ferai les tests... (mais de toute façon, c'est pas bien grave car le contenu est censé être grand à 95% du temps).

A plus donc, et merci encore.

PS: au sujet de la bannière en pourcentage, je t'en reparlerai demain, le post est déjà bien assez long...
Modérateur
Salut, amusant ton dernier post, en fait j'ai bricoler quelques gabarit et l'un d'eux est intitulé faux-frame, (il y a eu un post du même genre il y a quelque semaine sur ce forum) et j'avais pondu ça : http://gcyrillus.free.fr/gabarits/faux-frame.html
ça vaut ce que ça vaut, et le truc au dessus c'est une variante.
C'est ameliorable ...bien entendu.
bon dev
Je reviens finalement après une longue absence, juste pour mettre un [résolu] sur le topic.

La méthode proposée marche effectivement, on peut même se passer du div superflu en jouant sur le padding, mais j'ai finalement abandonné l'idée de fixer le header des pages car il y avait 2 effets plutôt indésirables :
1) le "trou" qui apparait à droite lorsque le contenu ne nécessite pas de barre de scrolling.
2) le fait que sous Firefox, si on place un formulaire dans la partie "fixée" (le header dans ce cas), les boites input n'ont plus de curseur (on ne voit pas où on est, c'est vraiment gênant).