<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://www.the-asw.com/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
  <title>The ASW - css</title>
  <link>http://www.the-asw.com/</link>
  <description></description>
  <language>fr</language>
  <pubDate>Mon, 25 Aug 2008 09:25:35 +0200</pubDate>
  <copyright></copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>La transparence en CSS avec Internet Explorer</title>
    <link>http://www.the-asw.com/post/2006/11/11/67-la-transparence-en-css-avec-internet-explorer</link>
    <guid isPermaLink="false">urn:md5:ab10fe64aba5668b6afc6cfc86705961</guid>
    <pubDate>Sat, 11 Nov 2006 15:26:00 +0000</pubDate>
    <dc:creator>cgo2</dc:creator>
        <category>Développement web</category>
        <category>css</category>    
    <description>Ce qui est bien avec Internet Explorer, c'est qu'on ne s'ennuit pas. En fait on
pense trop souvent que les développeurs du navigateur du Microsoft sont des
incompétents notoires, incapables de lire les spécifications du W3C sans produire
3 bugs par ligne dans leur moteur de rendu. Et bien si ça se trouve, c'est
simplement une bande de joyeux drilles très farceurs, qui ont décidé de distraire
tous les développeurs web de la planète en rendant leur logiciel totalement
imprévisible. Tenez par exemple, la transparence en CSS...    &lt;p&gt;... c'est quelque chose de très basique. La propriété &lt;code&gt;opacity&lt;/code&gt;
appliquée à n'importe quel élément permet de le rendre transparent. Bon, chez
Microsoft, vu qu'on en fait jamais rien comme tout le monde, il faut utiliser
une propriété spécifique &lt;code&gt;filter&lt;/code&gt;. Mais à la limite, une fois qu'on
est prévenu, c'est pas génant. Pour rendre un div transparent, le code CSS
devrait donc être :&lt;/p&gt;
&lt;pre&gt;
body {
	background : #369;
}
.monbloc {
	background : #fff;
	opacity : .2;
	filter : alpha(opacity=20);
}
&lt;/pre&gt;
&lt;p&gt;Sauf que ça, ça ne fonctionne pas sous IE ! Vous pouvez vérifier vous même avec
&lt;a href=&quot;http://www.the-asw.com/files/web/opacity/ex1.html&quot;&gt;cet exemple&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Etonnant non ? Pourtant comme tout le monde j'ai déjà utilisé et vu fonctionner
la transparence sous IE ! Alors comment expliquer ce phénomène ? Problème de &lt;em&gt;doctype&lt;/em&gt; ?
D'encodage du document ?&lt;/p&gt;
&lt;p&gt;Et bien en fait, Internet Explore gère la transparence dans 2 cas seulements :
l'élément a une position absolue (&lt;code&gt;position:absolute&lt;/code&gt;) ou l'élément
a une hauteur fixe. J'imagine bien les réunion de &lt;em&gt;brainstorming&lt;/em&gt; des
équipes de développeurs de Microsoft : &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;
- Bon les gars, faut qu'on implémente la transparence, quelqu'un a une idée ?&lt;br /&gt;
- C'est de la touchette la transparence !&lt;br /&gt;
- Tiens au lieu de parler fait tourner l'Absolut Vodka ! (bon d'accord elle était facile celle là)&lt;br /&gt;
- Au fait René t'as fini de débugger la propriété &lt;code&gt;height : auto&lt;/code&gt; ?&lt;br /&gt;
- Nan c'est pas trivial !&lt;br /&gt;
- T'façon le code est bon !&lt;br /&gt;
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Alors donc comme la position absolue n'est pas très pratique quand il faut
rendre transparent un élément dans le corps de la page, il faut ruser.&lt;/p&gt;
&lt;p&gt;Pour IE 6, la propriété &lt;code&gt;height&lt;/code&gt; se comporte comme &lt;code&gt;min-height&lt;/code&gt;.
On peut utiliser le hack suivant :&lt;/p&gt;
&lt;pre&gt;
.monbloc {
	height : 1px;
}
/* pour les autres navigateurs */
* &gt; .monbloc {
	height: auto;
}
&lt;/pre&gt;

&lt;p&gt;Mais IE 7 va interpréter le hack, et donc appliquer un &lt;code&gt;height : auto&lt;/code&gt;.
Ce qui vaut mieux puisqu'ils ont corrigé le bug de &lt;code&gt;height&lt;/code&gt;, et donc
si on essaye d'appliquer une hauteur de 1px ça va tout casser. La solution est
donc d'utiliser un hack spécial pour IE 7 et d'appliquer un &lt;code&gt;min-height&lt;/code&gt;
tout nouveau dans cette version du navigateur.&lt;/p&gt;
&lt;pre&gt;
/* pour IE 7 */
*+html .monbloc {
	min-height : 1px;
}
&lt;/pre&gt;
&lt;p&gt; Le code complet devient donc :&lt;/p&gt;
&lt;pre&gt;
body {
	background : #369;
}
.monbloc {
	background : #fff;
	opacity : .2;
	filter : alpha(opacity=20);

/* pour IE 6 */
	height : 1px;
}
/* pour les autres navigateurs */
* &gt; .monbloc {
	height: auto;
}
/* pour IE 7 */
*+html .monbloc {
	min-height : 1px;
}
&lt;/pre&gt;
&lt;p&gt;Vous pouvez regarder &lt;a href=&quot;http://www.the-asw.com/files/web/opacity/ex2.html&quot;&gt;ce deuxième exemple&lt;/a&gt;.&lt;/p&gt;</description>
    
    
    
          <comments>http://www.the-asw.com/post/2006/11/11/67-la-transparence-en-css-avec-internet-explorer#comment-form</comments>
      <wfw:comment>http://www.the-asw.com/post/2006/11/11/67-la-transparence-en-css-avec-internet-explorer#comment-form</wfw:comment>
      <wfw:commentRss>http://www.the-asw.com/feed/rss2/comments/67</wfw:commentRss>
      </item>
    
  <item>
    <title>Centrer un float en CSS</title>
    <link>http://www.the-asw.com/post/2005/08/23/46-centrer-un-float-en-css</link>
    <guid isPermaLink="false">urn:md5:3e81973e788f8353c4a67dc22d334486</guid>
    <pubDate>Tue, 23 Aug 2005 21:32:00 +0000</pubDate>
    <dc:creator>cgo2</dc:creator>
        <category>Développement web</category>
        <category>css</category><category>javascript</category>    
    <description>Une zone - la galerie - doit être constituée de un ou plusieurs éléments - les boites - centrés à l'interieur et sur une seule ligne. En HTML &amp;laquo;&amp;nbsp;à la papy&amp;nbsp;&amp;raquo; c'est très facile à faire : la galerie est une cellule d'un tableau avec la propriété &lt;code&gt;align=&quot;center&quot;&lt;/code&gt;, et le contenu est un tableau d'une seule ligne dont le nombre de cellules varie de 1 à 5 (le nombre maximum de boites pour tenir sur une seule ligne). Mais comment faire ça en CSS ?    &lt;h3&gt;Problématique&lt;/h3&gt;

&lt;p&gt;L'effet recherché ressemble à ça :&lt;/p&gt;

&lt;p class=&quot;center&quot;&gt;&lt;img src=&quot;http://www.the-asw.com/images/web/centragecss_shema_1.png&quot; alt=&quot;L'effet recherché&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Ma première idée, pour placer les boîtes est d'utiliser le positionnement float avec un &lt;code&gt;hr&lt;/code&gt; et la propriété &lt;code&gt;clear : both;&lt;/code&gt; comme expliqué dans &lt;a href=&quot;http://openweb.eu.org/articles/initiation_float/&quot; hreflang=&quot;fr&quot;&gt;ce très bon article sur OpenWeb&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Au niveau code ça donne : &lt;/p&gt;

&lt;pre&gt;
&amp;lt;div class=&quot;galerie&quot;&amp;gt;
	&amp;lt;div class=&quot;boîte&quot;&amp;gt;boîte 1&amp;lt;/div&amp;gt;
	&amp;lt;div class=&quot;boîte&quot;&amp;gt;boîte 2&amp;lt;/div&amp;gt;
	&amp;lt;div class=&quot;boîte&quot;&amp;gt;boîte 3&amp;lt;/div&amp;gt;
	&amp;lt;div class=&quot;boîte&quot;&amp;gt;boîte 4&amp;lt;/div&amp;gt;
	&amp;lt;div class=&quot;boîte&quot;&amp;gt;boîte 5&amp;lt;/div&amp;gt;
	
	&amp;lt;hr class=&quot;clear&quot; /&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/pre&gt;

&lt;p&gt;Appliquons le style suivant :&lt;/p&gt;

&lt;pre&gt;
.galerie {
	background : #ccc;
	width : 360px; /* (50 + (5 * 2) + 10) * 5 + 10 */
}
.boîte {
	background : #69c;
	
	float : left;
	margin : 10px 0 10px 10px;
	padding : 5px;
	width : 50px;
	
	text-align : center;
}
.clear {
	clear : both;
	visibility : hidden;
}
&lt;/pre&gt;

&lt;p&gt;&amp;Ccedil;a donne :&lt;/p&gt;

&lt;p class=&quot;center&quot;&gt;&lt;img src=&quot;http://www.the-asw.com/images/web/centragecss_exemple_1.png&quot; alt=&quot;Exemple 1.1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Avec 3 boîtes uniquement :&lt;/p&gt;
&lt;p class=&quot;center&quot;&gt;&lt;img src=&quot;http://www.the-asw.com/images/web/centragecss_exemple_2.png&quot; alt=&quot;Exemple 1.2&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Vous pouvez tester &lt;a href=&quot;http://www.the-asw.com/files/web/centragecss/index.html#ex1&quot;&gt;ce premier exemple&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Le positionnement est celui recherché lorsque toutes les boîtes sont présentes, mais, malheureusement, dès qu'il manque des boîtes, celles restantes sont calées à gauche. C'est tout à fait logique puisqu'elles sont flottantes à gauche, mais ce n'est pas ce que nous voulons !&lt;/p&gt;


&lt;h3&gt;Un deuxième conteneur pour le centrage&lt;/h3&gt;

&lt;p&gt;Au départ, j'ai simplement essayé &lt;a href=&quot;http://css.alsacreations.com/Faire-une-mise-en-page-sans-tableaux/Centrer-les-elements-ou-un-site-web-en-CSS&quot; hreflang=&quot;fr&quot;&gt;quelques techniques de centrage css&lt;/a&gt; appliquées sur les fiches ou sur le conteneur. Mais rien de tout ça ne fonctionne.&lt;/p&gt;

&lt;p&gt;Le problème est qu'on ne peut pas centrer un flottant, à cause de sa conception même. Comme écrit très justement dans &lt;a href=&quot;http://openweb.eu.org/articles/initiation_float/&quot; hreflang=&quot;fr&quot;&gt;l'article d'Openweb&lt;/a&gt; : &lt;q&gt;Une boîte flottante est retirée du flux normal, et placée le plus à droite (float: right) ou le plus à gauche (float: left) possible dans son conteneur.&lt;/q&gt; Il est donc logique que les techniques de centrage ne puisse pas s'appliquer (centrer par rapport à quoi, puisque la boîte est retirée du flux ?).&lt;/p&gt;

&lt;p&gt;Par contre, un élément non-flottant peut, lui, être centré (par exemple avec la technique des marges &lt;code&gt;auto&lt;/code&gt;). Imaginons que l'on crée un autre conteneur, qui soit centré par rapport au premier (la galerie), et qui contienne les fiches...&lt;/p&gt;

&lt;p class=&quot;center&quot;&gt;&lt;img src=&quot;http://www.the-asw.com/images/web/centragecss_shema_2.png&quot; alt=&quot;L'effet recherché&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Au niveau code ça donne :&lt;/p&gt;

&lt;pre&gt;
&amp;lt;div class=&quot;galerie&quot;&amp;gt;
	&amp;lt;div class=&quot;conteneur&quot;&amp;gt;
		&amp;lt;div class=&quot;boîte&quot;&amp;gt;boîte 1&amp;lt;/div&amp;gt;
		&amp;lt;div class=&quot;boîte&quot;&amp;gt;boîte 2&amp;lt;/div&amp;gt;
		&amp;lt;div class=&quot;boîte&quot;&amp;gt;boîte 3&amp;lt;/div&amp;gt;
		&amp;lt;div class=&quot;boîte&quot;&amp;gt;boîte 4&amp;lt;/div&amp;gt;
		&amp;lt;div class=&quot;boîte&quot;&amp;gt;boîte 5&amp;lt;/div&amp;gt;
		
		&amp;lt;hr class=&quot;clear&quot; /&amp;gt;
	&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/pre&gt;

&lt;p&gt;On applique le même style que précédemment. Mais il faut rajouter de quoi centrer le conteneur :&lt;/p&gt;

&lt;pre&gt;
.galerie {
	text-align : center; /* uniquement pour IE */
}
.conteneur {
	margin : 0 auto;
}
&lt;/pre&gt;

&lt;p&gt;Là se pose un problème - &lt;em&gt;LE&lt;/em&gt; problème devrais-je dire - : pour que ça fonctionne il faut que le conteneur enveloppe parfaitement les boîtes, et donc soit exactement à la bonne taille. La formule donnant la taille est facile à trouver :&lt;/p&gt;
&lt;pre&gt;
taille = nombre de boîtes * ( width + padding + margin-left ) + margin-right
&lt;/pre&gt;
&lt;p&gt;Mais je n'ai strictement aucune idée de comment faire ça en CSS. C'est théoriquement possible de le fixer dans un style inline (dans la page) appliqué au moment où le script qui génére la page affiche les boîtes. Une autre solution est d'utiliser &lt;acronym title=&quot;Document Objet Model&quot;&gt;DOM&lt;/acronym&gt; pour manipuler en Javascript les styles de la page.&lt;/p&gt;

&lt;h3&gt;Implémentation en Javascript/DOM&lt;/h3&gt;

&lt;p&gt;Le script doit se charger de calculer la taille en fonction du nombre d'éléments contenus. Pour ça il faut :
&lt;ol&gt;
&lt;li&gt;Trouver le conteneur à agrandir ; on utilisera la méthode &lt;code&gt;getElementsById&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Compter le nombre de boîtes contenues :
	&lt;ul&gt;
		&lt;li&gt;Trouver les éléments &lt;code&gt;div&lt;/code&gt; avec la méthode &lt;code&gt;getElementsByTagName&lt;/code&gt;&lt;/li&gt;
		&lt;li&gt;Eliminer ceux qui ne sont pas directement fils du conteneur (si les boîtes contiennent d'autres divs par exemple&lt;/li&gt;
	&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Calculer la taille et agrandir le conteneur&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Mon implémentation (qui n'est sûrement pas optimale) :&lt;/p&gt;
&lt;pre&gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
 // &amp;lt;![CDATA[
function setContainerSize(truc) {
	var navroot = document.getElementById(truc);
	if ( navroot ) {
		var lis = navroot.getElementsByTagName(&quot;div&quot;);
		/* XXX : y a-t-il un moyen plus simple de ne détecter que les divs de rang 1 ?
		 *       ou, détecter selon une classe ? */
		var ok = 0; var nok = 0;
		for ( i = 0; i &amp;lt; lis.length; i++ ) {
			if ( lis[i].parentNode != navroot )
				nok++;
			else 
				ok++;
		}
		navroot.style.width = ok * 70 + 10 + 'px';
	}
}
 // ]]&amp;gt;
&amp;lt;/script&amp;gt;
&lt;/pre&gt;

&lt;p&gt;Maintenant, pour utiliser cette fonction, on effectue les modifications suivantes :&lt;/p&gt;
&lt;pre&gt;
&amp;lt;body &lt;strong&gt;onload=&quot;setContainerSize('c1');&quot;&lt;/strong&gt;&amp;gt;
...
&amp;lt;div class=&quot;conteneur&quot; &lt;strong&gt;id=&quot;c1&quot;&lt;/strong&gt;&amp;gt;
&lt;/pre&gt;

&lt;p&gt;&amp;Ccedil;a donne :&lt;/p&gt;

&lt;p class=&quot;center&quot;&gt;&lt;img src=&quot;http://www.the-asw.com/images/web/centragecss_exemple_3.png&quot; alt=&quot;Exemple 2&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Vous pouvez consulter &lt;a href=&quot;http://www.the-asw.com/files/web/centragecss/index.html#ex2&quot;&gt;cet exemple&lt;/a&gt;.&lt;/li&gt;

&lt;h3&gt;Limites et pistes de reflexions&lt;/h3&gt;

&lt;p&gt;Cette méthode a été testée avec succès sur IE 6, Firefox 1.x, Safari 1.3 et Camino 0.9.&lt;/p&gt;

&lt;p&gt;Une limitation principale de cette méthode est l'impossibilité de centrer sur plusieurs lignes. Par exemple, si la première ligne contient 5 boîtes et la deuxième 2, les 2 seront calées à gauche. Je n'ai pas vraiment cherché comment résoudre ce problème, car ça n'était pas mon besoin.&lt;/p&gt;
&lt;p&gt;L'autre amélioration possible concerne l'implémentation du script, et notamment la façon de compter les éléments &lt;code&gt;div&lt;/code&gt; qui n'est sûrement pas optimale. Il serait également intéressant de pouvoir ne pas coder en dur les tailles des div dans le script, de manière à avoir du code réutilisable. Mais là ça dépasse mes connaissance en DOM :)&lt;/p&gt;
&lt;p&gt;Enfin, étant donné que le centrage se fait par un script, les boîtes ne sont pas centrées tant que la page n'est pas complètement chargée. Dans certains cas ça provoque un petit décalage à l'écran le temps que le chargement se termine...&lt;/p&gt;

&lt;h3&gt;Quelques liens supplémentaires&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://css.alsacreations.com/Faire-une-mise-en-page-sans-tableaux/Centrer-les-elements-ou-un-site-web-en-CSS&quot; hreflang=&quot;fr&quot;&gt;Centrer les éléments ou un site web en CSS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.mozilla.org/docs/dom/domref/&quot; hreflang=&quot;en&quot;&gt;Gecko DOM Reference&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Merci à Scara, MrGecko et tout le &lt;a href=&quot;http://www.the-asw.com/articles/irc/&quot;&gt;chan #asw&lt;/a&gt; pour la relecture ;)&lt;/p&gt;</description>
    
    
    
          <comments>http://www.the-asw.com/post/2005/08/23/46-centrer-un-float-en-css#comment-form</comments>
      <wfw:comment>http://www.the-asw.com/post/2005/08/23/46-centrer-un-float-en-css#comment-form</wfw:comment>
      <wfw:commentRss>http://www.the-asw.com/feed/rss2/comments/46</wfw:commentRss>
      </item>
    
</channel>
</rss>