28173 sujets

CSS et mise en forme, CSS3

Bonjour,

Je veux mettre en fond une image qui prenne la taille de 100% de la largeur et de la hauteur du document (et non pas de la fenêtre affichant le document). Je préfèrererais travailler uniquement avec les CSS mais je ne suis pas sûr que cela soit faisable. J'ai également essayé avec javascript mais sans succès !

En CSS, 100% de la largeur fonctionne et 100% de la hauteur de la fenêtre MAIS PAS 100% de la hauteur du document...

Quelqu'un a-t-il une idée ?
Administrateur
Hello et bienvenue,

Puisqu'il s'agit apparemment d'une image de fond et non de contenu, pourquoi ne pas utiliser simplement la propriété background-image qui est tout à fait pertinente pour cet usage ?

La question de la hauteur d'un document HTML est un vaste sujet à débat.
Le média Web, contrairement au média Print, n'est pas paginé. La notion de page n'y existe simplement pas. Si l'on veut vraiment se plier aux exigences du média Web, la question de hauteur de page ne devrait pas se poser : une page web est conçue pour scroller tant qu'il y a du contenu.
Salut J.-Luc,
Heu??? Là c'est la graphiste qui parle!
TU comptes avoir tout ces beaux pixels à l'écran ou c'est juste une image d'exemple? Smiley smile ou Smiley scared
Modifié par Wuam (20 Sep 2006 - 19:48)
Administrateur
Dans ton exemple, ton image s'affiche sur toute la hauteur de l'écran, comme on lui demande.
Ensuite, si tu rajoutes du texte, il est normal qu'il s'affiche selon le flux, donc à la suite de l'image et allonge le document.
C'est un comportement logique dans un média non paginé.

Tu peux procéder, avec des bidouilles, à ce que ton texte s'affiche par-dessus l'image, mais cela restera des bidouilles :
http://blog.alsacreations.com/2004/05/21/8-faire-un-arriere-plan-etirable
Salut,

Une petite remarque, quand on te donne la solution ce serait bien que tu te penches un peu sur la question.

Sinon en faisant un peu le ménage dans ton code (avec quelques remarques mises en commentaires), ça donne quelque chose comme ceci :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"><!-- Il manque les attributs  xml:lang et lang -->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /><!-- En xhtml cette balise est auto fermante. Donc antislash à la fin -->

<title>Document sans nom</title>

<style type="text/css">
<!--
body, html {
	border:0;
	margin:0;
	padding:0;
}

#contenu {
position:relative;
z-index:2;
}
#fondImg {
position:absolute;
left:0;
top:0;
width:100%;
}
-->
</style>
<script type="text/javascript"><!-- Il manque l'attribut type -->
		window.onload=window.onresize=function() {
		var hauteur_body=document.body.offsetHeight;
		document.getElementById('fondImg').style.height=hauteur_body+'px';
		}
</script>
  </head>
  <body>

<div id="contenu">
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
</div>
<div id="fond"><img id="fondImg" src="cent_fichiers/illustration.jpg"></div>
</body>
</html>
Modérateur
bonjour/bonsoir ,
Je me permet de proposer une soluce alternative sans javascript et qui risque peut-etre de moins pixelisé l'image toutefois ce "faux-fond etirable" devient fixe en faux background-attachement:fixe;.

copier/coller pour test dans vos navigateurs respectifs Smiley smile :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html 

xmlns="http://www.w3.org/1999/xhtml"><head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>fond etiré fixe</title>
<style type="text/css">
<!--
body , html {
	height:100%;
	margin:0;
	padding:0;
	color:yellow;
       font-size:120%;
	overflow:hidden;/* on cache les scroll */
	background:transparent;/* pour l'exemple  */ 
}
html {
	position:relative; /* on prend html en reference  qui nous donne la hauteur d'ecran */
        z-index:-2; /*on en profite pour le placé derriere l'image */
        background:#666; /* pour conserver une possibiliter de lecture des textes en absence d'image .... adapter les couleurs */
}
#contenu {
	height:100%;
	width:100%;
	overflow:auto;/* on met le scroll ici */
	position:absolute;/* on decroche du flux html > body  
pour devenir la source visuel de l'ensemble du contenu , on ne fait 
que remplacé html en fait pour l'affichage */
	z-index:0; /* index 0 = conditions habituelles on demarre 
la page comme si le support visuel  etait html en flux static a z-index:0; par defaut  */
}
#fondImg {
	position:absolute;/* on la sort du flux */
	bottom:0;
	width:100%;
	height:100%;
	z-index:-1;
/* on passe en arriere plan , surtout ne pas donner de couleur ou fond a  body, 
qui même "decroché" est resté a z-index:0; , valeur par defaut */
	
}
p {
	text-indent:1em;
	margin:0.2em;
}
-->
</style>
</head>
<body>
<div>
<!-- pour info :ce div sert a valider en strict , besoin d'un "block" pour depose une image dans le flux du source -->
<img  id="fondImg" src="http://www.almageste.net/ClementAssoun/Tests/Ressources/illustration.jpg" />
</div>
<div id="contenu">

	<p>Hello world&nbsp;!</p>	<p>Hello world&nbsp;!</p>
	<p>Hello world&nbsp;!</p>	<p>Hello world&nbsp;!</p>
	<p>Hello world&nbsp;!</p>	<p>Hello world&nbsp;!</p>
	<p>Hello world&nbsp;!</p>	<p>Hello world&nbsp;!</p>
	<p>Hello world&nbsp;!</p>	<p>Hello world&nbsp;!</p>
	<p>Hello world&nbsp;!</p>	<p>Hello world&nbsp;!</p>
	<p>Hello world&nbsp;!</p>	<p>Hello world&nbsp;!</p>
	<p>Hello world&nbsp;!</p>	<p>Hello world&nbsp;!</p>
	<p>Hello world&nbsp;!</p>	<p>Hello world&nbsp;!</p>
	<p>Hello world&nbsp;!</p>	<p>Hello world&nbsp;!</p>
	<p>Hello world&nbsp;!</p>	<p>Hello world&nbsp;!</p>
	<p>Hello world&nbsp;!</p>	<p>Hello world&nbsp;!</p>
	<p>Hello world&nbsp;!</p>	<p>Hello world&nbsp;!</p>
	<p>Hello world&nbsp;!</p>	<p>Hello world&nbsp;!</p>
	<p>Hello world&nbsp;!</p>	<p>Hello world&nbsp;!</p>
	<p>Hello world&nbsp;!</p>	<p>Hello world&nbsp;!</p>
	<p>Hello world&nbsp;!</p>	<p>Hello world&nbsp;!</p>
	<p>Hello world&nbsp;!</p>	<p>Hello world&nbsp;!</p>
	<p>Hello world&nbsp;!</p>	<p>Hello world&nbsp;!</p>
	<p>Hello world&nbsp;!</p>	<p>Hello world&nbsp;!</p>
	<p>Hello world&nbsp;!</p>	<p>Hello world&nbsp;!</p>
	<p>Hello world&nbsp;!</p>	<p>Hello world&nbsp;!</p>
	<p>Hello world&nbsp;!</p>	<p>Hello world&nbsp;!</p>
	<p>Hello world&nbsp;!</p>	<p>Hello world&nbsp;!</p>
	<p>Hello world&nbsp;!</p>	<p>Hello world&nbsp;!</p>
	<p>Hello world&nbsp;!</p>	<p>Hello world&nbsp;!</p>
	<p>Hello world&nbsp;!</p>	<p>Hello world&nbsp;!</p>
	<p>Hello world&nbsp;!</p>	<p>Hello world&nbsp;!</p>
</div>

</body></html>


Une ou 2 breve explication dans le css.
ça passe dans IE6 , Opera 8.54 et Firefox/1.5.0.6.

ça peut aussi servir a une base "faux-frame".

++


<edit>
apres tout pourquoi pas faire usage des deux si js actif ou non :
en prenant la base html de clb56 ou celle que j'ai mis au dessus et en ne modifiant que la partie ou sont declaré les style et javascript , en les remplaçant avec ceci
</title>
<link rel="stylesheet" type="text/css" href="gcyrillus.css" media="screen" title="gcyrillus" />
<link rel="alternate stylesheet" type="text/css" href="clb56.css" media="screen" title="clb56" />

<script type="text/javascript">
		window.onload=window.onresize=function() {
			setActiveStyleSheet('clb56');
		var hauteur_body=document.body.offsetHeight;
		document.getElementById('fondImg').style.height=hauteur_body+'px';

		}
// source :  http://alistapart.com/articles/alternate/  
function setActiveStyleSheet(title) {
   var i, a, main;
   for(i=0; (a = document.getElementsByTagName("link")[ i]); i++) {
     if(a.getAttribute("rel").indexOf("style") != -1
        && a.getAttribute("title")) {
       a.disabled = true;
       if(a.getAttribute("title") == title) a.disabled = false;
     }
   }
}
</script>
  </head>


il faut ressortir les "css" dans leur 2 fichiers respectifs (nommés dans les balises link) et ton gabarit de base beneficie alors des 2 options .
</edit>

<re-edit> a prendre comme un exercice "interessant" , tu risque de lasser et de te lasser rapidement du resultat obtenu </re-edit>
p.s
mieux vaut placé l'image (detourné en fond) apres le contenu dans le html.
Modifié par gcyrillus (23 Sep 2006 - 12:56)
Bonjour à tous !

Tout d'abord je tiens à m'excuser pour mon absence indépendante de ma volonté... Et j''en profite pour vous remercier vivement pour votre aide !

La solution de cbl56 me semble se rapprocher au plus de ce que je souhaite mais j'ai encore deux problèmes :
1. Si le texte du "contenu" est plus court que la hauteur de la fenêtre (pas de scrolling donc), l'image ne rempli pas la fenêtre.
2. Sous Firefox, et dans le cas d'un texte plus long que la hauteur de la fenêtre, l'image de fond qui doit remplir toute la hauteur laisse une hauteur vide d'environ une ligne.

J.-Luc


P.-S. L'image finale sera un dégradé circulaire et vous pouvez voir un début de ce qu'il devrait être à l'adresse http://www.almageste.net/ClementAssoun/
Modérateur
bonjour,


a écrit :
1. Si le texte du "contenu" est plus court que la hauteur de la fenêtre (pas de scrolling donc), l'image ne rempli pas la fenêtre.


En indiquant 100% de hauteur a body et html , le probleme devrait se resoudre de lui-même.

a écrit :
2. Sous Firefox, et dans le cas d'un texte plus long que la hauteur de la fenêtre, l'image de fond qui doit remplir toute la hauteur laisse une hauteur vide d'environ une ligne.


C'est generalement un "probleme" de fusion de marge avec la premiere et la derniere balise de type block presentes dans ta page, qui se resout en les redefinissant a 0 . sur les exemples données les marge interne et externe a html et body sont deja mises a zero.

++

++
Pour le problème de marge sous Firefox, ok : j'ai fait un offset de 100px et cela compense le décalage.
Par contre, dans le cas où le texte est court, je souhaiterais que l'image soit étirée de 100% de la hauteur de la fenêtre. Hors, si je met 100% dans html, body et imgFond, le javascript ne fonctionne plus sous Firefox : il se cale à 100% de la hauteur de la fenêtre et même si le texte est plus long !
Cf. http://www.almageste.net/ClementAssoun/Tests/100-6.htm
Bonjour,

Merci pour l'info. : ça marche enfin !
Voici le code que j'utilise
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
		<title>Document sans nom</title>
		<style type="text/css"><!--
			body, html {
				border:0;
				margin:0;
				padding:0;
				min-height:100%;
				height:100%;
			}
			#contenu {
				border:0;
				margin:0;
				padding:0;
				position:relative;
				z-index:2;
			}
			#fondImg {
				border:0;
				margin:0;
				padding:0;
				position:absolute;
				left:0;
				top:0;
				width:100%;
				height:100%;
			}
		--></style>
		
		<script type="text/javascript">
			window.onload = window.onresize = function() {
				var hauteurBody = document.body.offsetHeight;
				document.getElementById('fondImg').style.height = hauteurBody + 'px';
			}
		</script>
  </head>
  <body><div id="contenu">
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
	<p>Hello world !</p>
</div><div id="fond"><img id="fondImg" src="Ressources/illustration.jpg"></div></body>
</html>


Encore merci à tous pour votre aide !

J.-Luc