28220 sujets

CSS et mise en forme, CSS3

Pages :
Bonjour,

Je cherche à reproduire ceci avec des divs:
upload/2866-div.gif

On m'a donner le code suivant:

<body>
<div id="global">
 
<div id="A">A</div>
<div id="B">B</div>
 

<div id="E">E</div>
<div id="F">F</div>
<div id="G">G</div>
 
<div id="I">I</div>
<div id="K">K</div>
</div>
</body>



#global{
 border:1px solid #000000;
 margin: auto;
 padding: auto;
 width: 600px;
 height: 600px;
}
#A{
  border:0 solid #000000;
 border-width:0 0 0 0;
 float: left;
 width: 33%;
 height: 200px;
 margin: 0;
 padding: 0;
 background-color: #B9B900;
}
#B{
 border:0 solid #000000;
 border-width:0 1px 0 1px;
 float:left;
 width:66%;
 height:200px;
 margin:0;
 padding:0;
 background-color: #BFBFBD;
}
#C{
 border:1px solid #000000;
 float: left;
 width:33%;
 height:200px;
 margin:0;
 padding:0;
}
#E{
    border:0 solid #000000;
 border-width:0 0 0 0;
 float: left;
 width: 33%;
 height: 200px;
 margin:0;
 padding:0;
 background-color:#B9B900;
}
#F{
 border:0 solid #000000;
 border-width:1px 1px 0 1px;
 float: left;
 width:33%;
 height:200px;
 margin:0;
 padding:0;
 background-color: #333333;
}
#G{
 border:0 solid #000000;
 border-width:1px 1px 0 0;
 float:left;
 width:33%;
 height:200px;
 margin:0;
 padding:0;
 background-color: #B9B900; 
}
#I{
 border:0 solid #000000;
 border-width:1px 1px 0 0;
 float: left;
 width:66%;
 height:200px;
 margin:0;
 padding:0;
 background-color: #BFBFBD;
}
#J{
 border:1px solid #000000;
 float: left;
 width:33%;
 height: 200px;
 margin:0;
 padding:0;
}
#K{
 border:0 solid #000000;
 border-width:0 1px 0 0;
 float:left;
 width:33%;
 height:200px;
 margin:0;
 padding:0;
 background-color: #B9B900;
}


En fait, avec ce code, les cadres haut-gauche et bas droit sont chacun constitué de deux cadres (ici de couleur vert). Je voulais donc savoir si il est possible de ne faire qu'un seul div pour chacune de ces parties ? Si je veux mettre du texte ou des images dans le cadre vert, je suis avec cette méthode obigé de les couper en deux et de les mettre dans chacun des deux divs qui constituent le bloc vert.
On peux évidement recourir au positionnement absolu mais je préférerais éviter. Est-ce possible?

Merci
Bonjour.

Une question : pourquoi vouloir éviter le positionnement absolu?

C'est la solution... la moins mauvaise... (à mon sens)
Moi ça me rappèle le concours alsa avec la figure à reproduire...
Comme GeorgesM, je poserais la même question...
puis j'en rajoute une autre : t'es en formation css et tu as un exercice à résoudre ? Smiley rolleyes
En fait, c'est pas que je veuille à tous pris éviter le positionnement absolu, mais comme je ne connais pas encore parfaitement (dans la pratique) comment positionner en CSS, je me demande quelles sont les meilleurs solutions. Personnellement je trouve le positionnement flottant très pratique et je voudrais savoir jusqu'à quel point on peut l'utiliser. Pour le positionnement absolu, je vois quand même quelques inconvénients:
-ça fait sortir du flux
-ça oblige à régler au pixel près
-si je veux changer la position d'un élément de ma page il risque de passer par dessus les éléments positionnés en absolu.
-il est gênant quand on change la taille des polices. Les cadres s'agrandissent et au lieu de se pousser, il se chevauchent (sauf peut être si on positionne avec des unités de taille relative ?)

Alors, existe-t-il une solution à mon problème ?
Smiley rolleyes
Bonsoir,

Deux flottants (les "coins" top-left et bottom-right) et 3 blocs en flux.
Modifié par Laurent Denis (02 Sep 2005 - 19:10)
J'ai justement essayé de procéder comme ça. Et voici ce que j'ai obtennu:

upload/2866-pb.gif

Le cadre bottom-right est trop bas.
En fait, c'est même plus compliqué que ça, ça change selon les navigateurs.
Bonjour,

Ton dernier flottant n'est pas bien placé dans l'ordre HTML. Le code correct est:

<style type="text/css">
<!-- 
#wrapper {
width: 300px;
}
#float1,#float2 {
background-color: yellow;
float: left;
width: 100px;
height: 200px;
}
#float2 {
float: right;
}
#flux1,#flux3 {
background-color: green;
width: 200px;
height: 100px;
}
#flux2 {
background-color: red;
width: 100px;
height: 100px;
}
#flux1,#flux2 {
margin-left: 100px;
}
-->
</style>
<!--[if lte IE 6]>
<style type="text/css">
#wrapper {
width: 306px;
background-color: yellow;
}
#flux1,#flux3 {
width: 203px;
} 
</style>
<![endif]-->
</head>
<body>
<div id="wrapper">
  <div id="float1">float 1</div>
  <div id="flux1">flux1</div>
  <div id="float2">float 2</div>
  <div id="flux2">flux 2</div>
  <div id="flux3">flux 3</div>
</div>
</body>


<edit>Attention : le forum n'affiche pas correctement le code de fin des commentaires conditionnels. Voir la FAQ du forum pour copier la syntaxe correcte qui est déformée ci-dessus.</>

La première CSS s'applique aux navigateurs conformes (Opera, Firefox, Safari, etc).

La seconde CSS, en commentaires conditionnels, s'applique uniquement à IE Windows 5.x et 6.0. Le bug du Three pixels Jog étant incompressible ici, il faut donc des dimensions ajustées pour le masquer. Dans un design "réel", il serait possible d'éviter de dimensionner les 3 éléments en flux et donc de leur conférer le layout (propriété spécifique IE) qui provoque l'apparition d'espaces de 3 pixels incompressibles entre eux et les 2 flottants.

Reste à voir les adaptations éventuelles pour Safari ou IE5 Mac
Modifié par Laurent Denis (04 Sep 2005 - 06:20)
Smiley smile Alors là vraiment merci! C'est exactement ce que je voulais faire. Je n'avais pas pensé au float:right. Tu m'apprends en plus l'existance des commentaires conditionnels. Ca à l'air super pour corriger les bugs d'Internet Explorer! Smiley biggrin Une question: peut-on mettre ces commentaires ailleurs que dans <head> (dans la feuille CSS par exemple)?
Les commentaires conditionnels sont des commentaires SGML (ou HTML, si on préfère) :

- ils peuvent être utilisés n'importe où dans un document HTML, pour masquer n'importe quel contenu aux autres navigateurs qu'IE Windows (élément style comme ici pour masquer du code CSS, élément script pour masquer du javascript, ou tout autre élément HTML...)

- mais ils ne peuvent pas être utilisés dans un fichier CSS interne ou externe, dont les commentaires n'obéissent pas à la syntaxe SGML. Ni à l'intérieur d'un fichier .js, par exemple.
Modifié par Laurent Denis (04 Sep 2005 - 18:24)
Ok, mais je me souviens qu'on m'avais dis que le bug des 3 pixels pouvais être corrigé à coup de « star html hack » cachés dans un « commented backslash hack ».
Ca donnait ça:

#floatbox {
float: left;
width: 100px;
}

p {
margin-left: 110px;
}

/* Hide from IE5-mac. Only IE-win sees this. \*/

* html #floatbox {
margin-right: 10px;
}

* html p {
height: 1%;
margin-left: 0;
}

/* End hide from IE5/mac */


Il ne s'agit pas d'un commentaire conditionnel, mais le but est un peu le même. Existe t-il d'autres bidouilles de ce style pour différents navigateurs?
Le holly Hack de John Gallant et Holly Bergevin était effectivement la réponse universelle pronée par les spécialistes du hack CSS d'IE... jusqu'aux dernières nouvelles du développement d'IE7 : celui-ci est en effet susceptible de remettre en cause la plupart des hacks classiques consistant à s'appuyer sur un bug de parsing CSS pour corriger un autre bug lié au rendu.

Ingo Shao a écrit :
Bien qu'on puisse penser que « fiable à l'avenir » soit une contradiction dans les termes mêmes, nous suggérons fortement que les designers web « jouent la sécurité », revoient dans leurs pages les « hacks » explicites et implicites, et utilisent désormais les commentaires conditionnels pour réserver ces correctifs aux seules versions concernées du navigateur.


( http://www.satzansatz.de/cssd/onhavinglayoutrev04-20050824.html )

On sait d'ores et déjà, par exemple, que les hacks de sélecteur d'enfant (html>body) et du sélecteur universel (* html) seront neutralisés par IE7 ( http://blogs.msdn.com/ie/archive/2005/09/02/460115.aspx ). Mais l'inconnue sera totale jusqu'à la sortie d'IE7 beta 2, puis final, quant aux détails des bugs de rendu que ces hacks servaient à corriger (pour les généralités, Microsoft communique bien, ce qui est déjà un énorme progrès). Et des conflits sont déjà évidents entre code pour IE5.x et code pour IE7.

Les hacks CSS, qui n'ont jamais été bien solides sur le fond, ont du plomb dans l'aile, bien que les développeurs d'IE7 fassent leurs choix avec précautions.

Les commentaires conditionnels, en revanche, n'ont jamais été exposés à la même fragilité : c'est une fonctionnalité à la fiabilité à toute épreuve (c'est une implémentation propriétaire mais officielle, à la différence des hacks CSS. chaque version d'IE depuis IE5.0 l'implémente, y compris IE7 beta 1), précise (on peut viser telle ou telle version ou groupes de versions d'IE Windows), valide (c'est un simple commentaire SGML pour ceux qui révèlent du code à IE. Ceux qui cachent du code à IE, en revanche, sont invalides). Et surtout, dont Microsoft ne pourra pas se passer.

Il n'existe (hélas) aucun équivalent aux commentaires conditionnels pour d'autres navigateurs. Il existe en revanche quelques hacks de syntaxe CSS permettant de masquer du code CSS à Opera, firefox... mais avec une foule d'effets indésirables. Les navigateurs conformes se prêtent peu à être hackés, malheureusement Smiley cligne
Modifié par Laurent Denis (04 Sep 2005 - 18:53)
En fait je veux me servir de ces divs pour faire une mise en page. Je voudrais que les cinq cadres çi -dessus soient collés et aient des bordures.
Pour corriger le bug des trois pixels, je pensais utiliser un hack ou un commentaire conditionnel et dedans définir une marge négative a droite (resp à gauche) pour #float1 (resp #float2) ou alors positionner en relatif les bloc #flux et les décaler de 3 pixels. Laquelle de ces 2 solutions est la meilleure? Y en a t-il une autre qui soit plus efficace?
A ce sujet, je ne suis pas sûr d'avoir bien compris le sens de cette phrase:

a écrit :
Dans un design "réel", il serait possible d'éviter de dimensionner les 3 éléments en flux et donc de leur conférer le layout (propriété spécifique IE) qui provoque l'apparition d'espaces de 3 pixels incompressibles entre eux et les 2 flottants


autre question: Si j'ai bien compris les commentaires conditionnels sont à utiliser de préférence par rapport aux hacks. Mais quels sont les avantages de ces derniers? Il y a bien une raison à leur existance.

Merci. Smiley smile
mathmax a écrit :
En fait je veux me servir de ces divs pour faire une mise en page. Je voudrais que les cinq cadres çi -dessus soient collés et aient des bordures.


Hum... Acrobatique, avec des dégradations multiples à gérer selon les résolutions et les navigateurs, mais pourquoi pas ? (voir l'exemple ci-dessous, avec une façon différente de gérer la chose).

mathmax a écrit :

Pour corriger le bug des trois pixels, je pensais utiliser un hack ou un commentaire conditionnel et dedans définir une marge négative a droite (resp à gauche) pour #float1 (resp #float2) ou alors positionner en relatif les bloc #flux et les décaler de 3 pixels. Laquelle de ces 2 solutions est la meilleure? Y en a t-il une autre qui soit plus efficace?


Aucune des deux ne fonctionnera.

Une combinaison de marges et de positions relatives permettrait de ramener la largeur apparente du conteneur (dans l'exemple ci-dessus) à 300 pixels. Mais sa largeur réel restant surdimensionnée à 303px, cela ne changerait pas grand-chose sur le fond :

<!--[if lte IE 6]>
<style type="text/css">
#wrapper {
width: 303px;
}
#flux1,#flux2,#float2 {
margin-left: -3px;
position: relative;
right: 3px;
}
</style>
<![endif]-->


Le gain est minime par rapport aux 306 pixels affichés par la solution précédente (3 ou 6 pixels de différence entre un navigateur et un autre sont tout aussi admissibles)

Mais surtout, c'est en évitant de dimensionner le conteneur et les éléments en flux, et en se plaçant dans le second cas de figure du three pixels jog que tu le gèreras au mieux. En effet :

mathmax a écrit :

A ce sujet, je ne suis pas sûr d'avoir bien compris le sens de cette phrase:

Dans un design "réel", il serait possible d'éviter de dimensionner les 3 éléments en flux et donc de leur conférer le layout (propriété spécifique IE) qui provoque l'apparition d'espaces de 3 pixels incompressibles entre eux et les 2 flottants



Le three pixels jog est inévitable. Mais il se produit de deux manières différentes :
- si l'élément en flux a le layout (état d'une boîte CSS spécifique à Internet Explorer Windows), les 3 pixels apparaissent à l'extérieur de l'élément, comme dans le code ci-dessus. Les éléments aquierent le layout de différentes manières, et notamment en les dimensionnant.
- si l'élément en flux n'a pas le layout (il n'est pas dimensionné), le three pixels jog se produit tout de même, mais à l'intérieur de l'élément. L'espace de 3 pixels apparaît dans chaque boîte de ligne des textes jouxtant le flottant. Il n'apparaît plus pour les boîtes de lignes situées plus bas que le flottant.

Ici, en ne dimensionnant plus les éléments en flux, on se place dans le second cas, qui est une dégradation plus facile à gérer.

Exemple (en utilisant les bordures, dans un conteneur centré par des marges, le tout en %) :
<style type="text/css">
<!-- 
#wrapper {
border: 1px solid red;
margin: 0 10%;
overflow: auto;
}
#float1,#float2 {
float: left;
width: 25%;
padding-top: 10px;
padding-bottom: 10px;
}
#float1 {
border-right: 1px solid red;
}
#float2 {
float: right;
border-left: 1px solid red;
}
#flux1,#flux2,#flux3 {
padding-top: 10px;
padding-bottom: 10px;
}
#flux1 {
border-bottom: 1px solid red;
margin-left: 25%;
}
#flux2 {
margin: 0 25%;
}
#flux3 {
border-top: 1px solid red;
border-right: 1px solid red;
margin-right: 25%;
clear:left;
}
p {
margin: 0 10px;
}
-->
</style>
<!--[if lte IE 6]>
<style type="text/css">
#wrapper {
height: 1%;
overflow: visible;
}
</style>
<![endif]-->
</head>
<body>
<div id="wrapper">
  <div id="float1">
		<p>#float1</p>
		<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.</p>
	</div>
  <div id="flux1">
		<p>#flux1</p>
		<p>A doter d'une bordure gauche si nécessaire selon la largeur des contenus.</p>
	</div>
  <div id="float2">
		<p>#float2</p>
		<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.</p>
	</div>
  <div id="flux2">
		<p>#flux2</p>
		<p>A doter de bordures latérales si nécessaires selon la longueur des contenus.</p>
	</div>
  <div id="flux3">
		<p>#flux3</p>
		<p>Doté d'une bordure droite lorsque le contenu de #float2 n'est pas suffisant pour amener la bordure de celui-ci assez bas.</p>
	</div>
</div>


Notes :
- l'overflow:auto permet au conteneur de s'étendre à toute la hauteur de #float2 dans les navigateurs conformes.
- La CSS conditionnelle règle ici un autre problème lié au layout dans IE Windows, sur le calcul des largeurs et annule les effets indésirables de l'overflow:auto dans ce navigateur.
- le jeu de padding des div et des marges des p évite l'interférence de paddings en pixels dans le calcul de largeur des div
- il peut être nécessaire d'ajouter des bordures latérales supplémentaires sur l'un ou l'autre des 3 div en flux, selon la longueur du contenu. C'est le cas dans cet exemple pour la bordure droite de #flux3. Mais la dégradation n'est pas très heureuse dans IE5.0 et IE5.5, ou selon les résolutions (voir éventuellement des correctifs en commentaires conditionnels...)

mathmax a écrit :

autre question: Si j'ai bien compris les commentaires conditionnels sont à utiliser de préférence par rapport aux hacks. Mais quels sont les avantages de ces derniers? Il y a bien une raison à leur existance.


En fait, les hacks procèdent de 3 raisons :

- il n'existe pas d'équivalent aux Commentaires conditionnels pour les autres navigateurs : certains préfèrent tout passer en hacks, tant qu'à faire (raison de moins en moins solide avec la conformité croissantes de Firefox, Opera et Safari).

- pour IE (le gros des hacks), certains considèrent plus "conforme" (?) de régler un problème CSS via CSS uniquement, sans avoir à ajouter quelque-chose dans le HTML. Ce qui n'est guère convainquant, les commentaires conditionnels étant parfaitement conformes ou tout ce qu'on voudra, et nettement plus fiables.

- il a fallu un certain temps pour que les commentaires conditionnels soient exhumés de la doc MSDN. On avait pris l'habitude des hacks CSS entre-temps. Disons que si Tantek Celik avait prôné les commentaires conditionnels au lieu de son hack historique, d'autres habitudes auraient sûrement été prises...
Modifié par Laurent Denis (07 Sep 2005 - 08:39)
Un ajout à la dernière CSS en commentaires conditionnels ci-dessus :

#float1,#float2 {
word-wrap:break-word;
}


... évite certaines dégradations dans IE5.x lorsque la largeur d'affichage est réduite / la taille des caractères augmentée.
a écrit :
Une combinaison de marges et de positions relatives permettrait de ramener la largeur apparente du conteneur (dans l'exemple ci-dessus) à 300 pixels. Mais sa largeur réel restant surdimensionnée à 303px, cela ne changerait pas grand-chose sur le fond


Mais pourquoi ne pas aussi mettre une marge négative à droite pour #flux1, #flux2 et #float2? Cela permet de ramener le wrapper à une alrgeur de 300px:

<!--[if lte IE 6]>
<style type="text/css">
#wrapper {
width: 300px;
}
#flux1,#flux2,#float2 {
margin-left: -3px;
margin-right:-3px;
position: relative;
right: 3px;
}
</style>
<![endif]-->


a écrit :
Les éléments aquierent le layout de différentes manières, et notamment en les dimensionnant.

Définir les largeurs et les hauteurs en % ce n'est pas dimensionner? (ou du moins ça ne génère pas de layout).

C'est vrai que définir les largeurs en pourcentage est bien pratique. Peut on définir des % avec virgule (50,5% par exemple). Le seul inconvénient que je vois, si on ne peux pas faire cela, est les difficiles liaisons avec les éléments dimensionnés en pixel (les images qui pourrait remplacer un bloc par exemple).


a écrit :
La CSS conditionnelle règle ici un autre problème lié au layout dans IE Windows, sur le calcul des largeurs

Lequel?

a écrit :
le jeu de padding des div et des marges des p évite l'interférence de paddings en pixels dans le calcul de largeur des div

Je sais qu'il y a des problème de compréhension des largeur avec IE5 quand on donne des valeurs au padding. Si on les définit en pourcentage, ces problèmes sont-ils réglé? Si cela permet d'éviter ces problèmes, peut-on définir des padding en % alors que les boites concerné sont dimensionnées en px?

a écrit :
lHum... Acrobatique, avec des dégradations multiples à gérer selon les résolutions et les navigateurs, mais pourquoi pas ?

Est-ce que j'aurais intéret à plaçer tous ces cadres en absolus? J'aurais moins de problèmes? Comment les webmasters procéderaient pour une telle mise en page?

Merci pour toutes les informations concernant les hacks et les commentaires conditionnels.
mathmax a écrit :

Mais pourquoi ne pas aussi mettre une marge négative à droite pour #flux1, #flux2 et #float2? Cela permet de ramener le wrapper à une alrgeur de 300px:


Oui, bien vu (Mieux que moi trop pressé ce matin)

mathmax a écrit :

Les éléments aquierent le layout de différentes manières, et notamment en les dimensionnant.

Définir les largeurs et les hauteurs en % ce n'est pas dimensionner? (ou du moins ça ne génère pas de layout).


Si. Quelque-soit l'unité derrière un width ou un height, l'élément est dimensionné et acquiert le layout.

Si on veut "dimensionner" sans dimensionner, et sans donner de layout, on utilise les marges, ou le "fit to width" qui fait qu'un élément, dans certaines circonstances, aura une hauteur dépendant de son contenu et une largeur dépendant de son conteneur et de son contenu. C'est le cas pour les 3 éléments en flux dans l'exemple ci-dessus avec les bordures : leurs dimensions sont laissées au calcul fait par le navigateur.

mathmax a écrit :

C'est vrai que définir les largeurs en pourcentage est bien pratique. Peut on définir des % avec virgule (50,5% par exemple). Le seul inconvénient que je vois, si on ne peux pas faire cela, est les difficiles liaisons avec les éléments dimensionnés en pixel (les images qui pourrait remplacer un bloc par exemple).


Oui, on peut utiliser des décimales, avec quelques différences obscures entre navigateurs sur la gestion des arrondis.

Et il faut effectivement dissocier systématiquement les espaces pixelisés et les espaces fluides. C'est le rôle des padding et margin pour les conteneurs dans l'exemple ci-dessus. En d'autres termes, on voit souvent sur les forums des questions du genre: comment puis-je dimensionner un div en 50% + 100px : la réponse est qu'on ne peut pas.

mathmax a écrit :

La CSS conditionnelle règle ici un autre problème lié au layout dans IE Windows, sur le calcul des largeurs

Lequel?


Voir http://www.positioniseverything.net/explorer/percentages.html

Pour IE, la largeur d'un conteneur est indéterminée tant qu'il n'a pas calculé la largeur nécessaire au contenu (c'est pour la même raison qu'un conteneur s'étend spontanément dans IE à la hauteur de ses enfants flottants).

Mais : si des % en référence au parent interviennent dans le contenu (ici, les marges des éléments en flux), IE se retrouve donc à calculer un % d'une largeur indéterminée...

D'où une légère schizophrénie que les développeurs d'IE ont résolu abruptement : le calcul des % liés au contenu ne se réfère plus à la largeur de l'élément parent, mais à celle du grand parent. Même si celle-ci est, selon le principe IE, éventuellement indéterminée. Elle devient tout à coup magiquement déterminée...

Bilan de cet intéressante plongée dans l'univers du non-sens à la Lewis Caroll : sans l'astuce en Commentaires condtionnels, dans le design en % ci-dessus, IE calculerait les % de marges des éléments en flux par rapport à la largeur d'affichage totale (le bloc conteneur initial généré par l'élément body). D'où des espaces disgracieux dans IE6 à l'intérieur du design, et des chevauchements divers dans IE5.x.

Le fait de doter le conteneur de layout via le height: 1% oblige IE à le considérer comme référence de calcul des marges du contenu, au lieu du bloc conteneur initial : un bloc doté de layout crée un plan rectangulaire impératif dans lequel s'étendront les blocs descendants.

mathmax a écrit :

le jeu de padding des div et des marges des p évite l'interférence de paddings en pixels dans le calcul de largeur des div

Je sais qu'il y a des problème de compréhension des largeur avec IE5 quand on donne des valeurs au padding. Si on les définit en pourcentage, ces problèmes sont-ils réglé? Si cela permet d'éviter ces problèmes, peut-on définir des padding en % alors que les boites concerné sont dimensionnées en px?


Non. ça va empirer les choses, et pas que dans IE (voir ci-dessus). On reste sur la solution classique consistant à éviter de doter un conteneur de padding, et à remplacer par les marges du contenu.

mathmax a écrit :

lHum... Acrobatique, avec des dégradations multiples à gérer selon les résolutions et les navigateurs, mais pourquoi pas ?

Est-ce que j'aurais intéret à plaçer tous ces cadres en absolus? J'aurais moins de problèmes? Comment les webmasters procéderaient pour une telle mise en page?

Hum... je dirais spontanéement, sans avoir essayé, que la dégradation sera plus importante selon les résolutions, et que le résultat sera plus figés. Le code ci-dessus en %, bien que rapidement improvisé, me semble assez solide.

mathmax a écrit :

Merci pour toutes les informations concernant les hacks et les commentaires conditionnels.


Ton idée de mise en page est très intéressante, parce qu'elle réunit un certain nombre de difficultés propres à la gestion d'IE, dans un projet bien concret qui n'a rien de bien tordu à la base Smiley cligne

<edit>Désolé pour les typos dans ce message, mais entre une connexion défaillante et un navigateur vocal qui déraille, ça patine un peu, là</>
Modifié par Laurent Denis (07 Sep 2005 - 18:48)
En fait, si j'ai bien compris l'important pour éviter la version gênante du bug des trois pixels est de ne pas dimensionner les blocs en flux. Les autres (blocs #float) peuvent indifféremment être dimensionnés en pixels ou en pourcentages. Le fait de dimensionner en % permet seulement d'avoir une plus grande élasticité. Mais en fait, qu'entend on par une plus grande élasticité? C'est pour que le design soit extensible? Moi je veux faire un body de 800px de large. Quels intérêts j'aurais à définir mes largeurs en % (ou en pixel)

D'où une légère schizophrénie que les développeurs d'IE ont résolu abruptement : le calcul des % liés au contenu ne se réfère plus à la largeur de l'élément parent, mais à celle du grand parent. Même si celle-ci est, selon le principe IE, éventuellement indéterminée. Elle devient tout à coup magiquement déterminée...

Désolé mais je crois que je ne comprends pas bien cela. Smiley confused
Ce que j'ai compris: Pour déterminer la largeur d'une boite, IE se réfère à la largeur de son contenu. Or si les largeurs des contenus sont définies en %, il faut qu'elles soient en référence avec un conteneur plus grand qui soit dimensionné. Mais ce bloc conteneur plus grand, si justement il n'est pas dimensionné, que se passe t-il? (je ne comprends pas le "tout à coup magiquement déterminée...")
Prends il comme référence le premier élément dimensionné? Et dans les autres navigateurs, comment ça se passe?

Merci beaucoup pour l&#8217;aide.
Désolé de répondre tardivement : problèmes de temps et de connection calamiteuse.

mathmax a écrit :
En fait, si j'ai bien compris l'important pour éviter la version gênante du bug des trois pixels est de ne pas dimensionner les blocs en flux.


exactement.

mathmax a écrit :

Les autres (blocs #float) peuvent indifféremment être dimensionnés en pixels ou en pourcentages.


oui également.

mathmax a écrit :

Le fait de dimensionner en % permet seulement d'avoir une plus grande élasticité. Mais en fait, qu'entend on par une plus grande élasticité? C'est pour que le design soit extensible? Moi je veux faire un body de 800px de large. Quels intérêts j'aurais à définir mes largeurs en % (ou en pixel)


Un design extensible aura un meilleur rendu dans les affichages de "petite" résolution, sans scroll horizontal. Mais l'exemple en % ci-dessus s'adapte facilement avec une largeur de #wrapper et de #float1 - #float2 en pixels, ainsi que les marges correspondantes des #flux...

D'ailleurs, il devient plus facile de corriger les effets disgracieux de bordures qui apparaissent dans IE5.x (à cause cette fois du modèle de boîte Microsoft), en indiquant dans une 2e CSS conditionnelle des marges de flux réduites d'un pixel par rapport à la CSS conforme. Cette CSS spéciale IE5.x permet également, si on le souhaite, d'y centrer le #wrapper:

(Noter la différence de syntaxe lte - lt entre les deux commentaires conditionnels)

<style type="text/css">
<!-- 
#wrapper {
border: 1px solid red;
width: 600px;
margin: 0 auto;
overflow: auto;
}
#float1,#float2 {
float: left;
width: 200px;
padding-top: 10px;
padding-bottom: 10px;
}
#float1 {
border-right: 1px solid red;
}
#float2 {
float: right;
border-left: 1px solid red;
}
#flux1,#flux2,#flux3 {
padding-top: 10px;
padding-bottom: 10px;
}
#flux1 {
border-bottom: 1px solid red;
margin-left: 200px;
}
#flux2 {
margin: 0 200px;
border-left: 1px solid red;
}
#flux3 {
border-top: 1px solid red;
border-right: 1px solid red;
margin-right: 200px;
clear:left;
}
p {
margin: 0 10px;
}
-->
</style>

<!--[if lte IE 6]>
<style type="text/css">
/* Pour IE5.x et IE 6.0 : lte */
#wrapper {
overflow: visible;
}
#float1,#float2 {
word-wrap:break-word;
}
</style>
<![endif]-->

<!--[if lt IE 6]>
<style type="text/css">
/* Pour IE5.x uniquement : lt */
body {
text-align: center;
}
#wrapper {
text-align: left;
}
#flux1, #flux2 {
margin-left: 199px;
}
#flux2,#flux3 {
margin-right: 199px;
}
</style>
<![endif]-->


mathmax a écrit :

Ce que j'ai compris: Pour déterminer la largeur d'une boite, IE se réfère à la largeur de son contenu. Or si les largeurs des contenus sont définies en %, il faut qu'elles soient en référence avec un conteneur plus grand qui soit dimensionné. Mais ce bloc conteneur plus grand, si justement il n'est pas dimensionné, que se passe t-il? (je ne comprends pas le "tout à coup magiquement déterminée...")


La largeur de l'élément grand-parent est prise comme base de calcul. Et cette largeur ne dépend plus, tout à coup, des contraintes imposées par le contenu. En quelques-sortes, IE retombe alors sur le modèle de dimension CSS pour l'élément grand-parent.
Modifié par Laurent Denis (09 Sep 2005 - 05:08)
Merci pour ces précisions. Je vais rajouter le deuxième commentaire conditionnel pour IE5. (c'est vrai qu'il ne comprends pas les largeurs de boite comme tous le monde... Smiley cligne )

Maintenant, je voudrais que ma mise en page s'étende en fonction de son contenu sans se déformer. Par exemple si je met beaucoup de texte dans le cadre #float1, j'aimerais qu'il s'étende en hauteur, mais que #flux1 s'agrandisse de la même taille pour ne pas créer des espaces vides disgracieux. (idem pour #flux3 et #float2: je voudrais que l'augmentation de la taille de l'uns entraine l'augmentation de la taille de l'autre) Je crois que ça rejoint un peu la question qui a été posé là: http://forum.alsacreations.com/topic.php?fid=4&tid=6991.
Vous pouvez répondre à cette question sur le sujet de dubnet, c'était juste pour faire le lien. Smiley cligne
Avec le modèle des flottants, c'est impossible dans ce cas : un flottant peut agir sur la hauteur de ses parents, mais pas sur celle d'éléments de même niveau.

Le jeu des arrière-plan et des bordures peut simuler ce type de comportement dans des cas précis (les colonnes factices). C'est ce qu'il contribue ici à faire pour certains blocs (#flux2), mais pas pour tous.

Ce serait possible en reprenant cette mise en page avec le modèle de tableau CSS (display:table), non implémenté par IE (dégradable en flottants dans IE).
Modifié par Laurent Denis (09 Sep 2005 - 16:06)
Pages :