28173 sujets

CSS et mise en forme, CSS3

Bonjour,

Après avoir attentivement recherché une série d'informations qui m'a d'ailleurs été très utile pour mon site, je me suis retrouvé un peu perdu à ne plus savoir quoi utiliser comme balise.

Mes problèmes sont les suivants: J'ai essayé de faire un site avec un height de 100% en imbriquant plusieurs conteneurs l'un dans l'autre. Le dernier contenant mon texte utilise un overflow-y qui fonctionne que sur Internet Explorer, mais pas sur Firefox. J'ai essayé le overflow:hidden, mais ça ne donne rien. Ca fonctionne uniquement si je détermine une hauteur fixe (ce que je ne souhaite pas faire)

D'autre part, un utilisant un padding sur cette même <div>, la scrollbar vertical se retrouve à l'extérieur sur IE (alors que sur Mozilla, quand ça fonctionne, il me l'affiche correctement)

Un apreçu du problème est disponible à l'adresse suivante: http://www.lahode.ch/demo/demo.html

Voici mon code CSS:

/* Paramètres généraux */

html {
  margin: 0;
  padding: 0;
  text-align: center; /* pour corriger le bug de centrage IE */
  height: 100%;
  overflow: hidden;
}

body {
  margin: 0;
  padding: 0;
  text-align: center; /* pour corriger le bug de centrage IE */
  height: 100%
}

/* Conteneur principal */
#container {
  position:relative;
  margin-left: auto;
  margin-right: auto;
  text-align: left; /* on rétablit l'alignement normal du texte */
  width: 760px;
  height: auto !important;
  height: 100%;
  min-height: 100%;
}

/* Conteneur de ma balise au top */
#mainmenu {
  position:relative;
  display: block;
  margin-right: 10px;  /* placement du logo dans son conteneur, head1 */
  margin-top: 3px;
  width: 760px;
  height: 95px;
  border: 0px;
  line-height: 60px;
  text-indent: 40px;
  top:0px;
  left:0px;
  filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='mainmenu.png', sizingMethod='scale');
}

#mainmenu[ id] {
  background: url('mainmenu.png');
}

/* Conteneur secondaire */
#mainbody {
  position:relative;
  display: block;
  float: left;
  width: 758px;
  top:0px;
  height: auto !important;
  height: 85%;
  min-height: 85%;
  margin-bottom: auto;
  border:1px;
  border-color:#555555;
  border-style:solid;
}

/* Image en arrière-plan du conteneur secondaire (étirable) */
#backgroundImage {
  position: absolute;
  width : 100%;
  height: 100%;
}

/* Titre de ma page (Destinations) */
#maintitlebar {
  position:relative;
  height: 30px;
  width: 758px;
  line-height:30px;
  text-indent:50px;
  background-color:#000000;
  color:#FFFFFF;
}

/* Conteneur de texte */
#maintext {
  position:relative;
  overflow-y: auto;
  height: auto !important;
  height: 90%;
  min-height: 90%;
  padding:15px;
}

Merci d'avance pour vos conseils, ça fait à présent deux mois que je rame dessus sans trouver la réponse Smiley sweatdrop
Modifié par astrobob (19 Nov 2006 - 18:58)
Bonjour astrobob, et bienvenue sur ce forum. Smiley smile

J'aurais plusieurs remarques. Pour commencer, pourrais-tu éditer ce premier message (en utilisant le bouton d'édition en haut à gauche) pour corriger sa mise en forme, et en particulier la mise en forme du code qui doit être encadré par les balises [ code] et [ /code] (sans les espaces après le premier crochet) ? Merci d'avance. Smiley smile

Ensuite, je ne suis pas sûr d'avoir compris quel était le résultat attendu. On obtient une barre de défilement interne au bloc principal de contenu sur Internet Explorer 6 (résultat assez laid et laissant beaucoup à désirer pour son ergonomie), et un bloc avec du texte qui sort de la zone visible de l'écran sans possibilité de faire défiler la page avec Firefox. Quel est le résultat attendu, au juste ?

Pour continuer, une remarque générale : les barres de défilement internes, c'est le mal. Smiley lol
Plus sérieusement, c'est prendre le risque de déstabiliser le visiteur qui a plutôt l'habitude d'une navigation avec une barre de défilement globale, pour l'ensemble de la page... comme sur 95% des sites web (ou plus ?), donc. De plus, cela pose des problèmes d'accessibilité pour la navigation au clavier avec certains navigateurs, et plus généralement des problèmes d'ergonomie (molette de la souris non active tant que l'on n'est pas au dessus du cadre qui défile, ou tant qu'on n'a pas cliqué dedans...). Bref, non seulement c'est prise de tête à mettre en place (comme tu as pu le constater), mais en plus ça n'est pas forcément un bien -- et même très probablement un mal -- pour un site !

Pour finir, une petite interrogation de circonstance : c'est fait exprès si le texte est illisible ? [Edit : je parle bien sûr du texte sur le site, en noir sur fond d'image plutôt sombre... la lecture en est très pénible, voire impossible.]
Modifié par mpop (18 Nov 2006 - 23:46)
Bonjour Gourou dickien,

Avant tout merci de m'avoir répondu si vite, je m'y attendais pas.

Ensuite, merci 1000 fois pour les idées. En effet l'intégration d'une seconde scrollbar est inutile et j'avais tout simplement pas songé à faire autrement. Je me suis donc inspirer fortement du site http://www.456bereastreet.com/lab/cssframes/ qui correspondait assez au résultat désiré. Smiley biggrin

Seulement voilà, tout semblait parfaitement fonctionner jusqu'au moment où j'ai intégrer l'image en background. Firefox ne tient pas compte de "position:absolute" pour la mettre en background alors qu'IE 6 le fait, mais fait passer le texte en dessous. En plus, sous IE6, la partie du haut de la scollbar a disparu. Smiley bawling

Enfin, dernière constation, je remarque que même sur l'exemple originel (de 456bereastreet.com), il y a un décalage du header et du footer Smiley eek

En espérant que mon problème puisse être utile pour d'autres, merci d'avance pour ta prochaine réponse Smiley ravi

Démo: www.lahode.ch/demo2/demo.html

Voici mon code corrigé

* {
  padding:0;
  margin:0;
}

body,
html{
  margin:0;
  padding:0;
}

body {
  min-width:760px; /* Pour Gecko */
}

/* position:absolute (pour tous les navigateurs) */
div#headercontainer {
  position:absolute;
  width:100%;
  top:0;
  left:0;
  height:95px;
  background-color: #FFFFFF;
}

/* position fixed (pour les nouveaux navigateurs) */
body>div#headercontainer {
  position:fixed;
}

div#header {
  height:95px;
  width:760px;
  margin:0 auto;
  line-height: 60px;
  text-indent: 40px;
  filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='mainmenu.png', sizingMethod='scale');
}

#header[ id] {
  background: url('mainmenu.png');
}

div#textcontainer {
  /* left margin et bottom padding (pour IE5/Win) */
  padding:125px 0 0 0;
  margin-left:0;
  /* left margin et bottom padding (pour les autres navigateurs) */
  voice-family: "\"}\"";
  voice-family:inherit;
  margin-left:16px;
  padding-bottom:50px;
}

/* left margin (pour les nouveaux navigateurs) */
body>div#textcontainer {
  margin-left:0;
}

div#maintext {
  width:760px;
  z-index:1;
  margin:0 auto;
  color:#FF0000;
}

div#maintitlebar {
  width:760px;
  margin:0 auto;
  height: 30px;
  line-height:30px;
  text-indent:50px;
  background-color:#000000;
  color:#FFFFFF;
}

#backgroundImage {
  position: absolute;
  width:760px;
  height: 100%;
  margin:0 auto;
}

Modifié par astrobob (19 Nov 2006 - 20:40)
Mouais...

Mon conseil était, en matière d'ergonomie, d'aller au plus simple (qui a l'avantage d'être le plus simple à la fois pour le développeur et pour l'utilisateur !). Remplacer une div avec scrollbar interne par un contenu non positionné et des en-têtes et pied de pages en positionnement fixe, c'est déjà un progrès... mais à l'heure actuelle ça demande un certain nombre de bidouillages si on veut obtenir le même résultat avec IE6 (pour ne pas le nommer). Du coup, on se retrouve à bidouiller à nouveau, et à offrir aux utilisateurs d'IE6 (pourtant nombreux, il me semble) une mise en page potentiellement casse-gueule et une ergonomie laissant à désirer...

Je sais pas si on y gagne au change...

On pourrait faire la même remarque sur cette histoire d'image dilatée. Franchement pas une bonne idée pour faire une image de fond : non seulement c'est techniquement risqué (il va falloir jouer sur les z-index et prier pour que les navigateurs s'en sortent avec ce bricolage, et ne fassent pas passer l'image par dessus le texte ou ne rendent pas le texte impossible à sélectionner, par exemple), mais en plus ça a un rendu assez médiocre, très peu professionnel.

On peut rappeler deux petites évidences :
- les navigateurs sont peu doués pour redimmensionner les images propremment... tout simplement, ils n'effectuent pas de véritable rééchantillonage comme pourrait le faire un logiciel de graphisme, et le résultat final est donc généralement assez laid ;
- le texte est toujours plus lisible sur fond uni que sur un fond avec des variations de contraste (typiquement, une photographie ou un motif)... les rares fois où on se permettra l'utilisation d'un motif, on utilisera quelque chose de très sombre (avec du texte clair, et si besoin en gras), ou de très clair/pastel (avec du texte sombre).


Au final, mon conseil est donc :
- laisser tomber le bricolage de l'image étirée (si on veut vraiment un motif, alors on utilisera la propriété CSS background-image avec une répétition de l'image -- à noter qu'on peut généralement créer un motif répétable à partir d'une simple image, à voir avec The Gimp ou Photoshop...) ;
- laisser tomber le bricolage pour IE6 et inférieurs, et mettre à profit le principe de « dégradation gracieuse » en utilisant une feuille de style appelée via un commentaire conditionnel (destiné aux versions inférieures à la version 7) pour basculer le positionnement fixe en simple positionnement statique (normal, quoi).

Mais si tu veux vraiment continuer à bricoler, il te faudra alors jeter un oeil aux z-index. Pour rappel : un z-index ne sera pris en compte que pour un élément positionné (en absolu ou en relatif).
Merci pour la réponse,

En effet, l'étirement d'image peut donner des résultats pas très esthétique, mais pour ma part, c'était voulu (faut pas chercher Smiley ravi ).

Par contre, je crois que je me fais à l'idée d'abandonner ce concept, car j'ai remarqué que la technique consistant à mettre un overflow:hidden sur la balise html et la rétablir en auto sur le body (pour ie6 uniquement), fais que ce navigateur un peu simplet, fige systématiquement tous les éléments sur lesquels ont défini position:relative ou position:absolute. Il est vrai également que le code css devient assez laid avec toutes ces exceptions pour "Microsoft" Smiley confus .

Si vous avez une autre idée, je suis volontiers preneur. Sinon, je remodifie tout (j'en ai l'habitude depuis le temps)
Bonjour

Je suis dans le meme cas que notre amis astrobob, je veux une page web avec avec une en-tete et un pied de page constament apparent dans la fenetre quelque soit la resolution de l'ecran. Je vous redonne l'exemple qu'astrobob a deja fournit : http://www.456bereastreet.com/lab/cssframes/

Voici où j'en suis : http://ftp.pele.family.neuf.fr/site/steam.html
et le css qui va avec :

body
{
background : url(design/background.jpg) repeat-x #464646;
font-family : Verdana,Arial,"Time New Romans",Times,serif;
font-weight : bolder;
font-size : 12px;
color : #d8ded3 ;
height : 100%;
padding : 0px;
margin : 0px;
}


div
{
margin-left : 10px;
margin-right : 10px;
}

#global
{
margin : 0px;
}


#en-tete
{
background-color : #5a6a50 ;
Height : 25px ;
padding-top : 10px;
padding-left : 10px;
margin-top : 10px;
}

#menu
{
height : 20px;
}

#menu p
{
float : left;
margin-top : 10px;
width : 70px;
/*height : 20px;*/
text-align : center;
}

#sous-menu
{
height : 25px;
}

#sous-menu p
{
float : left;
margin-top : 10px;
text-align : center;
padding : 5px;
padding-right : 10px;
padding-left : 10px;
background : #52594e;
margin-right : 10px;
}

#corps
{
background : #686a65;
}





#raccourci
{
position : absolute; 
left:-10px; 
bottom:0px;
height : 40px;
width: 100%;
background : black;
}


Je voudrais que mon div raccourci reste en bas de la page (avec toujours la meme dimension), et que mon div corps (gris) ne depasse pas sous le div raccourci quand je change de resolution et qu'il y est une scroll bar general qui fassent monter et descendre mon div corps sans bouger les autres. Tout comme l'exemple quoi.

Merci de votre coup de main.
Modifié par Keyser (29 Dec 2006 - 00:51)
Je sent que ma requette n'est pas simple a réaliser.

Voici ce que je veux :
- Une en-tete vert de 50px de hauteur qui soit toujours colé au bord de la fenetre de IE6 quelque soit la resolution de mon ecran ou la taille de ma fenetre IE6.
- Un pied de page rouge de 50px de hauteur qui soit toujours colé au bord de la fenetre de IE6 quelque soit la resolution de mon ecran ou la taille de ma fenetre IE6.

Ca j'arrive a le faire avec le code suivant :

html :
<!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="fr" >
    <head>
       <title>explication sans contenu</title>
       <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
	   <link rel="stylesheet" media="screen" type="text/css" title="design" href="explication.css"/>
    </head>
    <body>
		<div id="header">
			header
		</div>
		
		<div id="content">
			content
		</div>
		
		<div id="footer">
			footer
		</div>
		
    </body>
</html>


et le css :
html,body {margin:0px;padding:0px}

#header
{
	background-color : green;
	height : 50px;
	width : 100%;
	text-align : center;
}

#footer
{
	background-color : red;
	position : absolute;
	bottom : 0px;
	height : 50px;
	width : 100%;
	text-align : center;	
}



Alors maintenant je veux ajouter un contenu de couleur jaune qui remplisse le reste de la page quelque soit la resolution de mon ecran ou la taille de ma fenetre IE6, meme si il n'y a rien dedans et qu'apparaisse une scroll bar a droite si le contenu est plus gand que le reste de la fenetre.

J'ai essayé d'ajouter ce code dans mon css mais j'ai l'impression que le position : absolute; ne peux gerer le top et le bottom a la fois.

#content
{
	background-color : yellow;
	width : 100%;
	position : absolute;
	top : 50px;
	bottom : 50px;
}


A vrais dire j'ai essayé plein de solutions mais impossible, cette derniere solution me semblait la plus cartesienne pour moi, mais pas pour le css a mon avis.

Pouriez-vous m'aider un peu.