28173 sujets

CSS et mise en forme, CSS3

Administrateur
easyzik a écrit :
Personnellement je sèche...

C'est normal.

Le Web n'étant pas un média paginé contrairement au média d'impression, il ne sera pas possible de "restreindre" un affichage à 100% tout en rajoutant du contenu (hormis utilisation de la propriété "overflow"). C'est au concepteur d'adapter ses besoins au média et non l'inverse.

Si tu veux vraiment obtenir ce genre d'affichage, il faudra passer par du JavaScript ou utiliser min-height.
Modifié par Raphael (10 May 2007 - 14:04)
Raphael a écrit :
il ne sera pas possible de "restreindre" un affichage à 100% tout en rajoutant du contenu (hormis utilisation de la propriété "overflow").
J'ai peut-être oublié de préciser que le contenu était très restreint. Il peut donc y avoir un "oveflow:hidden" sans souci si ça peut aider...

D'ailleurs, dans le cas cité plus haut, c'est encore plus simple : on considère qu'il n'y a pas de contenu (ou un simple espace) Smiley cligne
Modifié par easyzik (10 May 2007 - 14:12)
Administrateur
Tu peux te rapprocher d'une solution à partir de ceci :
html, body {
  margin: 0;
  padding: 0;
  height: 100%;
}
html {
  padding: 20px;
}
div {
  height: 100%;
  border: 5px solid red;
}


Mais cela posera toujours des soucis de "longueur".
ta solution ne fonctionne pas car la hauteur n'est pas de 100% par rapport à la fenêtre...
Il faudrait donc passer idéalement par une position absolute mais ensuite ça coince quand même...
Administrateur
easyzik a écrit :
ta solution ne fonctionne pas car la hauteur n'est pas de 100% par rapport à la fenêtre...
Oui, c'est bien ce que j'ai écrit Smiley smile

easyzik a écrit :
Il faudrait donc passer idéalement par une position absolute mais ensuite ça coince quand même...
Je ne vois pas comment une position absolue arrangerait les choses Smiley ohwell

En fait il n'est pas possible de cumuler des tailles d'unités fixes et fluides à la fois (ici 20px + 5px + 100% : cela va forcément dépasser, vu le modèle de boite).
Raphael a écrit :
Je ne vois pas comment une position absolue arrangerait les choses
Parceque la directive "height:100%" s'applique alors bien à la fenêtre et non plus à l'élément <body> (qui est plus petit puisque vide ou presque).
On arrive donc à avoir un bloc de la taille de la fenêtre ce qui n'est pas possible autrement.
Raphael a écrit :
Je ne vois pas comment une position absolue arrangerait les choses Smiley ohwell

En fait il n'est pas possible de cumuler des tailles d'unités fixes et fluides à la fois (ici 20px + 5px + 100% : cela va forcément dépasser, vu le modèle de boite).

Justement, pour le coup le positionnement absolu aurait été parfait :
div#global {
position: absolute;
top: 25px;
right: 25px;
bottom: 25px;
left: 25px;
border: solid 5px red;
}

Et voilà, le tour est joué. Sauf qu'il y a deux problèmes :
1 - ça ne passe pas dans IE (même dans IE7) ;
2 - si le contenu dépasse la hauteur de la zone laissée pour l'affichage, ça débordera, ou bien il faudra utiliser une barre de défilement interne -- ce qui n'est pas une bonne idée.

Pour ma part, je vois bien une solution détournée à base de positionnement fixe.
[b]HTML :[/b]
<body>
<span id="bordure-haut"></span>

<div id="global">
<div id="global-bis"
... bla bla mon contenu ...
</div>
</div>

<span id="bordure-bas"></span>
</body>

[b]CSS :[/b]
html, body {
height: 100%;
margin: 0; padding: 0;
}
div#global {
min-height: 100%;
margin: 0 20px;
border: solid red;
border-width: 0 5px;
}
div#global-bis {
padding: 30px 0;
/* On évite des problèmes de fusion des marges,
ainsi que des problèmes de recouvrement de contenus */
}
span#bordure-haut {
position: fixed;
width: 100%;
top: 0; left: 0;
height: 20px;
border-bottom: solid 5px red;
background: white;
}
span#bordure-bas {
position: fixed;
width: 100%;
bottom: 0; left: 0;
height: 20px;
border-top: solid 5px red;
background: white;
}


À partir de cette base, il nous faut encore plusieurs aménagements :

1 - obtenir un équivalent de min-height dans IE 6 et inférieur (voir la FAQ du forum, sur min-height dans IE6 et sur les commentaires conditionnels) ;
2 - IE7 comprend position: fixed, mais pas IE6 et IE5... il faudra donc basculer en position: absolute, par exemple, ce qui demande certains aménagements. On peut aussi décider de ne pas afficher les deux bordures dans IE6 et inférieurs : via un commentaire conditionnel :
span#bordure-haut, span#bordure-bas {display: none;}
Bonjour,

Tiens une belle "usine à gaz", juste un petit commentaire conditionnel pour ie6 (le min-height et un petit décalage perfide)...
<style type="text/css">
*{margin: 0; padding: 0;}

body, html{
position: relative;
height: 100%;
font-size: 1em;
font-family: tahoma;
}

#centre{
min-height: 100%;
border-right: 5px solid red;
border-left: 5px solid red;
position: relative;
margin-right: 20px;
margin-left: 20px;
position: relative;
z-index: 10;
}

#haut_g{
height: 20px;
background: #fff;
width: 60%;
position: absolute;
left: -5px;
top:0px;
border-bottom: 5px solid red;
z-index: 20;
}

#haut_d{
height: 20px;
background: #fff;
width: 60%;
position: absolute;
right: -5px;
top:0px;
border-bottom: 5px solid red;
z-index: 20;
}

#bas_g{
height: 20px;
background: #fff;
width: 60%;
position: absolute;
left: -5px;
bottom:0px;
border-top: 5px solid red;
z-index: 20;
}

#bas_d{
height: 20px;
background: #fff;
width: 60%;
position: absolute;
right: -5px;
bottom:0px;
border-top: 5px solid red;
z-index: 20;
}

p{
padding: 25px;
color: blue;
}
</style>
<!--[if lt IE 7]>
<style type="text/css">
#centre{
height: 100%;
}
#haut_d{
right: -6px;
}
#bas_d{
right: -6px;
}
</style>
<![endif]-->
	
</head><body>

<div id="centre">
	<div id="haut_g">
	</div>
	<div id="haut_d">
	</div>
	<p> Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec sem velit, suscipit a, viverra a, tincidunt id, elit. Quisque nonummy dapibus odio. Maecenas odio lacus, euismod vel, porttitor eu, ultricies in, diam. Donec quam elit, placerat sed, dictum et, tristique at, nibh. Pellentesque posuere ultrices turpis. Aenean a dui et erat malesuada bibendum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Pellentesque luctus purus at risus. Aenean rhoncus, elit rutrum luctus eleifend, dui risus convallis pede, quis consectetuer est mauris sed lacus. Sed eu diam sed quam euismod sodales. Praesent sagittis quam posuere ante. Quisque lectus. Curabitur fermentum. Aliquam justo. Aenean vitae tellus. Mauris vitae lorem. Nunc interdum.
Etiam ornare interdum erat. Phasellus ultricies sem pretium sapien. Maecenas convallis semper tortor. Praesent dapibus nisl. Vestibulum accumsan mi. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Fusce diam augue, interdum et, posuere ut, bibendum et, metus. Nulla turpis felis, rutrum quis, molestie sodales, interdum quis, dolor. In sapien. Ut luctus placerat nisl. Ut pharetra gravida est.
	</p>
	<div id="bas_g">
	</div>
	<div id="bas_d">
	</div>
</div>
</body>


<edit> le contenant suit le contenu et ça passe sous opera, ie5.5 j'en sais rien Smiley biggol </edit>
Modifié par ghost (11 May 2007 - 01:36)
ghost a écrit :
Tiens une belle "usine à gaz", juste un petit commentaire conditionnel pour ie6 (le min-height et un petit décalage perfide)...
Alors là je dis : respect monsieur ghost... et pareil à Florent V pour avoir mis sur la voie !
C'est vrai que je ne pensais pas du tout à séparer la bordure en 4... C'était l'astuce à trouver...

Domage que le code :
div#global {
position: absolute;
top: 25px;
right: 25px;
bottom: 25px;
left: 25px;
border: solid 5px red;
}
ne fonctionne pas avec IE parceque c'était de loin le plus propre !
easyzik a écrit :
Domage que le code (...) ne fonctionne pas avec IE parceque c'était de loin le plus propre !

Le code lui-même serait effectivement propre, mais ça obligerait à gérer une barre de défilement interne si le contenu est trop long... pas vraiment un bon plan.
easyzik>Pour IE, tu peux essayer de rajouter un height:expression(document.documentElement.clientHeight+'px'); dans le div#global conteneur. Défaut, ça suit pas le resize de la fenètre. Pour ça, il faut poser un évènement onresize sur la fenètre pour redéfinir la hauteur du div#global :
window.attachEvent('onresize', function(){document.getElementById('global').style.height=document.documentElement.clientHeight+'px'})

Modifié par MacIntoc (11 May 2007 - 16:35)