28173 sujets

CSS et mise en forme, CSS3

Bonjour,

je continue le développement d'une interface full-CSS pour un site dont je m'occupe... Je me posais une question, suite à la lecture d'un tuto...

Le tuto en question : Simuler une frame scrollable quand le reste de la page reste fixe

Lorsque je place un {overflow: auto}, la partie en question ne scrolle pas, pour la simple et bonne raison qu'elle a une hauteur de 100%, car si je réduis sa hauteur, le scroller apparait...

Ma question est : Comment faire apparaitre le scroller lorsque la hauteur de la div est de 100% ?


Merci d'avance Smiley smile


<edit>Pour l'instant, la seule solution qui me semble un tant soi peu plausible est l'insertion d'une div au sein de la div dont je parle plus haut (qui deviendra donc une div conteneuse)
Désolé si je m'exprime mal, quand c'est clair dans ma tête j'ai du mal à ne pas zapper un level Smiley confused
</edit>
Modifié par SolykZ (07 Oct 2006 - 16:46)
Bonsoir,

Bah ça marche un peu mieux, certes ! Mais sous Firefox le 100% fait en sorte que le scroll continue sur une centaine de px, et sous IE mon footer disparait !
Re,

Pour être efficace, il convient d'avoir un height défini, mais ça dépend aussi du contexte et du résultat que tu veux obtenir, sans code complet ou page test ça va être dur ...
SolykZ a écrit :
le scroller

La barre de défilement ?

SolykZ a écrit :
le scroll

Le défilement ?

SolykZ a écrit :
mon footer disparait !

Mon pied de page ?


...

Smiley vieux
Bon, je recommence. (M'en voulez pas, comme précisé plus haut, c'est clair dans ma tête donc il m'arrive de zapper l'une ou l'autre explication, involontairement bien entendu)

Je me suis donc basé d'un exemple en ligne, fourni par mpop via son site Web (exemple en ligne qui m'a servi il y a quelques semaines, et qui me servira encore), pour créer une nouvelle interface pour l'un des sites Web dont je m'occupe (qui tourne actuellement sous du code à la Frontpage)

La base dont je me sers est déjà pas mal bizarre, et je m'attendais à ce que l'ajout de ce tutoriel pose de sérieux problèmes...


J'ai placé en ligne un exemple, qui est disponible ici


En fait, la barre de défilement apparait bien au bon endroit, mais le défilement continue sur une centaine de pixels, et le bord rouge est sectionné à partir de cet endroit... J'vois vraiment pas d'où ça peut venir, à part du fait que le tout dispose d'une hauteur de 100%...
Bonjour,

Ben, pour avoir un scroll vertical, il faut que tu donnes un height fixe à ton bloc sinon (à part IE ...) tu auras les barres de scroll mais pas le scroll surtout si tu places ton bloc en overflow: scroll;
Visualises ta page sous FF (IE ce n'est pas une réference), tu verras

Essayes

div#contenu
	{
	height: 450px;
	overflow: auto;
	}

Pour te donner une idée.

Juste une question pourquoi tu "doubles" tes divs ?
Exemple:
<div id="conteneurpieddepage">
			<div id="pieddepage">
				<u><b>Design/Interface :</b></u> SolykZ  <b>|</b>  The Cheyenne Country Line Dancers ©
			</div><!-- Fin de div#pieddepage -->
		</div><!-- Fin de div#conteneurpieddepage -->
Pour le doublement des div, demandes à mpop, la base vient d'un de ses templates, qu'il a développé suite à un bon gros problème que j'avais posté sur le forum... J'ai mon idée, il corrigera si je me trompe :

Le pied de page est collé au bas de l'écran quoiqu'il arrive, même si le contenu du menu ou de la div de gauche n'est pas assez long. Pour se faire, il faut donner une hauteur de 100% au conteneur (id="page") mais lorsque c'est fait, il faut appliquer un {clear:both} à un élément situé entre le pied de page et le couple menu/contenu, sans quoi le couple déborde sur le pied de page à cause de la hauteur de 100%. Le conteneur du pied de page sert d'élément intermédiaire entre les deux pour arranger tout ça...

Si c'est ça, ce sera preuve que j'ai bien compris mpop, même si y'a encore du boulot Smiley smile

Pour en revenir au défilement vertical, il faut bien un height fixe. Le problème est que je ne peux pas donner une hauteur fixe au bloc, car je ne peux pas deviner la résolution du visiteur (j'ai fait exprès d'utiliser un design fluide, pour palier à ce "problème")

Donc, en gros, j'ai besoin d'une solution me permettant de :

- Etendre ma page jusqu'au bas de l'écran (ça c'est fait)
- Le menu, l'entête et le pied de page soient fixes (là, si je touche à rien, c'est le cas)
- Le div#contenu soit fixe mais disposant d'une barre de défilement verticale en cas de contenu trop grand (c'était le but de l'emploi du tuto me posant problème sur ce topic)

La question est donc : que faire pour pouvoir bénéficier d'une barre de défilement verticale uniquement sur div#contenu, quand aucune hauteur fixe ne lui est attribuée !

C'est le topic pour ceux qui aiment les défis, non ? Smiley langue

En tout cas, je remercie déjà ceux qui tentent de m'aider, parce que (ça se remarque) je débute encore en CSS, je ne maitrise pas complètement ce que j'utilise à l'heure actuelle (la template de mpop par exemple) mais plus j'en apprends plus je comprends, donc tout finira bien par se rejoindre Smiley cligne

Un tout grand merci à vous Smiley smile
Modérateur
bonsoir

il y a quelques mois , sur un autre forum , ce probleme avait eté evoqué et j'avais a l'occasion proposé ce gabarit.

http://gcyrillus.free.fr/gabarits/faux-frame-ff-ie-quirkv1.html

Ce probleme de faux-frame est realisé en passant IE en mode quirk, et en proposant une css alternative en commentaire conditionnel .

Dans le blabla de la page , j'indique un bug connu d'opera , en partculier sur les pages se calant a 100% de la hauteur.(cas de ce gabarit) ... pour faire rentré opera dans le droit chemin au redimensionnant la page , il suffit d'ajouter au css : body:hover:after {content:'';} , par exemple (ou tout autre valeur sur le hover qui modifie ou ajoute une regle css sans modifier l'aspect visuel ... la souris se doit quand même de passer au dessus de la page pour remettre les choses en place . (entre je redimensionne rarement ma page au cours de la visite d'un site et je garde la souris loin de la fenêtre , un site construit sur ce modele s'en passe bien souvent)
Ce truc a pour effet d'obliger opera a redimensionné l'ensemble de la page sans devoir la rafraichir.
Pour mettre le bug en evidence , ouvrez la page en lien dans opera puis redimensionez la fenetre du navigateur en hauteur.

Peut-etre que le css , peut paraitre compliqué , il est vrai qu'il est tres peu commenté et que les techniques mises en oeuvre ne sont pas expliqués.

A l'occasion si ceci ressemble a ce que tu cherche a faire je te laisse la prendre en main .
Je serai heureux d'avoir des retour pour l'ensemble des utilisateur du forum , sur le comportement de ce "gabarit" dans IE7 , Safari , et autre navigateurs (que OPERA, Firefox et IE6) que je ne suis pas en mesure de tester . (ma version IE7 stand alone est mal installée coté filtrage "CC" , et je suis sous windows Smiley smile ).

bonsoir
@gcyrillus

Pas mal du tout !!! Merci, ce soir je dormirais moins bête qu'en me levant ce matin (j'ai de la marge). De plus le code n'est pas particulièrement lourd !! Bravo
SolykZ a écrit :
Donc, en gros, j'ai besoin d'une solution me permettant de :

- Etendre ma page jusqu'au bas de l'écran (ça c'est fait)
- Le menu, l'entête et le pied de page soient fixes (là, si je touche à rien, c'est le cas)
- Le div#contenu soit fixe mais disposant d'une barre de défilement verticale en cas de contenu trop grand (c'était le but de l'emploi du tuto me posant problème sur ce topic)

La question est donc : que faire pour pouvoir bénéficier d'une barre de défilement verticale uniquement sur div#contenu, quand aucune hauteur fixe ne lui est attribuée !


Bon, si on avait voulu uniquement une page avec une bordure rouge, mais extensible en hauteur, on aurait pu faire ça :
html {
	min-height: 100%;
	margin: 0; padding: 0;
	font-size: 100%;
}
body {
	min-height: 100%;
	border: solid red;
	border-width: 0 20px;
	font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
	font-size: 1em;
}


Sauf que toi, comme tu veux jouer au malin plutôt que de comprendre que le média web n'est pas figé en hauteur (c'est malin, ça ! Smiley lol ), tu décides d'essayer de faire un truc impossible sauf avec bidouilles inommables et pas robustes pour deux sous.

Rah la la... Smiley biggol

Allons-y pour voir.
Déjà, il me semble que tu peux te passer de la div#page, surtout si tu utilises toute la largeur de l'écran pour ta mise en page. Bon, là je vais la garder mais sache qu'on peut la virer (et positionner le pied de page par rapport à body, du coup... sans avoir besoin de positionner body, il me semble).

Bref, déjà il faut que tous les éléments soient bloqués au maximum à 100%. Donc, cette fois, pas de min-height: 100% qui tienne, on passe tout en height: 100%;.

Donc, height: 100% pour html, body, div#page, div#conteneurcontenu, div#contenu (dans cet enchaînement, je vois déjà deux blocs inutiles : div#page et div#conteneurcontenu...). The big problème, c'est que div#conteneurcontenu ne part pas du tout début de la page. Il prendra donc 100% de la hauteur, mais commencera à 40px du haut de la page.

La hauteur totale de la page :
- 20px de bordure en haut ;
- la hauter de div#entete, soit encore 20px ;
- div#conteneurcontenu, soit 100% de la hauteur de la fenêtre ;
- la hauteur de div#conteneurpieddepage (1.2em).
Soit au total : 100% + 40px + 1.2em.
Et quelles que soient les tailles de la fenêtre et de la police par défaut, 100% + 40px + 1.2em ça fera toujours plus que 100%. Donc ça ne marche pas.

Une solution possible : utiliser un div#conteneurcontenu en height: 85%;... mais là on arrive à des choses aléatoires selon les résolutions, et pas vraiment satisfaisantes.


Arrivé à ce constat (que non, ça yen a pas possible), on peut dire deux choses :

Chose numéro 1 : arrêtez de penser le média web comme étant un machin contrôlable en hauteur, berdel de morde ! C'est pas contrôlable, c'est fait pour s'étirer, et même quand on y dit de pas s'étirer il s'étire tout seul. Faut être un peu maso pour perdre son temps à lutter contre la fatalité, alors qu'on pourrait accepter cet état de fait ET convertir le temps économisé en prise de tête sur des choses plus importantes.

Pour rappel, les designs fixes en hauteur, qui impliquent souvent l'utilisation d'un bloc avec barre de défilement interne : 1) sont peu fiables et requièrent souvent des bricolages et 2) posent des problèmes d'ergonomie et d'accessibilité, les barres de défilement internes étant moins fiables et ergonomiquement moins efficace que la barre de défilement globale de la fenêtre du navigateur.

Chose numéro 2 : si on veut vraiment faire ce genre de design, on évitera ces bidouillages peu fiables (bonjour la compatibilité avec les navigateurs... arrachages de cheveux en perspective), pour utiliser la solution qui marche bien et qui, bien utilisée, ne pose pas de problème : un tableau de mise en page.

Car oui, les tableaux de mise en page ça n'est pas le diable, et ça n'est pas nécessairement synonyme de non-accessibilité. Donc, on fera un tableau à trois cellules (une par ligne), voire à quatre cellules (deux pour la ligne du milieu).
Je ne maitrise pas les tableaux (je les ai très peu pratiqués), mais je sais que c'est possible, et leur capacité à s'adapter en hauteur vaut le détour.

Donc un petit tableau de mise en page, sans mochetés comme des tableaux imbriqués ou cellules vides. Et avec ma bénédiction.


Ite, missa est.
gcyrillus a écrit :
il y a quelques mois , sur un autre forum , ce probleme avait eté evoqué et j'avais a l'occasion proposé ce gabarit.

http://gcyrillus.free.fr/gabarits/faux-frame-ff-ie-quirkv1.html

C'est intéressant. Pour le coup, je n'avais même pas pensé au positionnement absolu.

Effectivement, le positionnement absolu permet de dimmensionner un bloc en précisant son emplacement à partir des bords de son plus proche parent/ancêtre positionné.
position: absolute;
top: 60px;
bottom: 30px;

On crée un bloc dont le bord supérieur se placera à 60px du haut de la fenêtre (si le plus proche parent/ancêtre positionné est body ou un conteneur général en height: 100%;, bien sûr), et à 30px du bas de la fenêtre. Ce qui laisse la place de caser un en-tête et un pied de page (tous deux en positionnement absolu également).

Bien entendu, la raison pour laquelle j'avais à moitié oublié cette possibilité, c'est qu'elle n'est pas supportée par Internet Explorer 6.0 (et encore moins par les précédents, bien sûr). Il faudra que je vérifie ce qu'il en est de IE7, mais je n'ai rien appris comme avancée significative sur ce point. À vérifier tout de même.

Du coup, la solution proposée demande un traitement spécifique pour IE 6 (pour IE Mac, on oublie carrément).

Personnellement, je ne tenterais pas de bidouiller en mode Quirks pour obtenir la même chose dans IE 6. Si IE 7 s'en sort avec cette utilisation du positionnement absolu, je ferais une feuille de style pour IE 6 et inférieurs (via les commentaires conditionnels ad hoc) qui corrige la mise en page dans IE 6 sur une base plus classique, avec extension de la page en hauteur et barre de défilement général. Une solution de repli, en quelque sorte. Il me semble que ça serait la solution la plus raisonnable : je doute quelque peu de l'intérêt de bricoler en mode Quirks (hors de l'intérêt du bricolage lui-même, si on aime les casse-tête), et de la robustesse de tels bricolages.

Tant que j'y suis, je te signale que le dimmensionnement du pied de page via la hauteur de ligne est dangereux : en augmentant la taille du texte, cela augmente la hauteur du pied de page, et laisse apparaître un espace blanc (et une barre de défilement globale). Il faudra donc figer en hauteur via un height: 30px, voire en ajoutant un overflow: hidden si besoin.


Au final, c'est intéressant mais je n'utiliserais pas cette solution en production, s'il n'est pas possible de faire de la dégradation gracieuse pour IE6 et inférieurs. La solution alternative serait d'utiliser le mode Quirks pour IE, mais je me refuse à le faire : trop d'emm*** en perspective pour gérer le reste de la mise en page.

Si un rendu équivalent est exigé pour tous les principaux navigateurs, je pencherai alors plutôt pour un tableau.
Bonjour à tous Smiley smile


Déjà, merci pour toutes ces réponses ! Smiley smile Le gabarit proposé par gcyrillus est à franchement tester, et je ne vais pas me gêner Smiley smile

Et si vraiment quelque chose cloche, j'utiliserai un tableau pour la mise en place des divs, comme mpop me l'a conseillé ! Smiley cligne
Bah oui, un tableau pour la mise en page ! Mais bon, il ne reste pas d'autres choix "potables" Smiley smile


Je ferai quelques essais cet après-midi, je viendrai vous dire quoi Smiley langue


Un tout grand merci Smiley smile
Modérateur
bonjour,

comme le fait remarqué mpop , il s'agit bien d'un montage "fragile" , le bug d'opera en est un exemple mineur (MAJ sur l'exemple en ligne). traine aussi ce line-height , inutile dans une cellule de tableau , ou le centrage verticale est la valeur par defaut , on peut aussi remarqué ce div sans "id" inbriqué dans #contenu , pour le rendu visuel uniquement (pour IE).

On remarque aussi le passage obligé en mode quirk pour IE , ce qui met en place 2 fichiers de base css usant de tecniques differentes , source de confusions importantes.

(a l'opposé de ce que dit mpop , je crois me souvenir qu'a l'occasion, le navigateur principal ciblé etait IE , peut-etre que le principe de precaution 'degradation gracieuse' etait plutot vu a l'encontre des navigateurs respectueux des standard , même si cela parait illogique , IE 6 etait le "butineur" majoritaire. (le gabarit s'appuyait aussi sur des images raccords en fond ).

ceci dit attention peut-etre aux glissement :
frames -> tableaux --> divs -> bidouillages Smiley smile

Comme rappelés a plusieurs reprises , faire usage du bon "doctype" et pas suivre une mode.

http://blog.alsacreations.com/2004/06/05/18-xhtml-css-confusions-et-amalgames

et

http://blog.alsacreations.com/2005/08/01/183-choix-dune-dtd-le-doctype-switching-nest-pas-pour-nous

2 liens parmis d'autres , peut-etre y'en a t-il d'autres plus evocateurs Smiley smile

++
Je viens de tester ta template, sous FF elle passe d'enfer ! Mais sous IE, c'est autre chose... Le div#contenu continue sa route sur une centaine de pixels sous le pied de page, dû à sa hauteur de 100% (je commence à bien m'y habituer tiens, à cette phrase !)

Bon, j'me fais un tableau et tant pis pour les puristes... Ceux qui critiqueront n'auront qu'à proposer des solutions potables...


Ceci dit, merci à toi d'avoir proposé ta template, qui est mafoi très bien foutue et super simple à prendre en main !

Et merci à mpop pour sa bénédiction Smiley lol
Modérateur
re bonjour,

et paf ! d'ou le quirk mode pour IE pour que ça passe et le div supplementaire Smiley smile
.... vous avez dit fragile ?

Resolue ?

bonne continuation
GC
Ui j'vais passer le topic en résolu...

Fragile, non ! A ne pas mettre dans les mains d'un noob, oui !

T'as quand même un très bon début de solution, il est à développer Smiley smile
SolykZ a écrit :
Fragile, non ! A ne pas mettre dans les mains d'un noob, oui !

Moui, je garderais le terme "fragile", au moins en l'état actuel du support du positionnement absolu par les navigateurs.

Je tenais juste à signaler à gcyrillus que son gabarit semble être correctement rendu par IE7 (rc1). D'ici deux ans, je pense que l'on pourra utiliser cette technique en production, en faisant de la dégradation gracieuse pourf IE6 (alors moins dominant) et en gardant la solution standard pour IE7/FF/Opera/etc.

Par contre, je n'ai pas bien compris ta remarque sur la "dégradation gracieuse". Tu veux dire que l'on ne peut pas employer ce terme quand le rendu dégradé est celui du navigateur (ultra-)majoritaire ? Pour ma part, je n'y vois pas de contradiction.
Modérateur
re, bonjour ..

a écrit :
Tu veux dire que l'on ne peut pas employer ce terme quand le rendu dégradé est celui du navigateur (ultra-)majoritaire ?


Non , je parlais dans ce cas , ou le rendu html/css en faux frame semblerait necessaire dans IE .
C'est plutot l'approche de "degradation gracieuse" pour IE qui semble etre inutile , car a priori une solution tres proche est possible.
La question que je me posais alors : IE/FF/Opera okay , mais les autres ?
Si ça ne passe pas ailleurs , alors revient l'idée d'une alternative acceptable , ou autre technique plus "solide", la on repasse/laisse la main au concepteur du site, qui fera ses choix en meilleurs connaissances de causes et d'effets .

( Merci pour le retour Smiley smile )


++