<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>l'indicible blog &#187; CSS</title>
	<atom:link href="http://www.lindicible.com/blog/category/dev/css/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.lindicible.com/blog</link>
	<description>&#60;!--:en--&#62;the details of the inexpressible&#60;!--:--&#62;&#60;!--:fr--&#62;les détails de l'ineffable&#60;!--:--&#62;</description>
	<lastBuildDate>Thu, 01 Jul 2010 14:20:33 +0000</lastBuildDate>
	<language>fr</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Bouton customisé à taille variable en CSS</title>
		<link>http://www.lindicible.com/blog/2010/02/16/bouton-customise-a-taille-variable-en-css/</link>
		<comments>http://www.lindicible.com/blog/2010/02/16/bouton-customise-a-taille-variable-en-css/#comments</comments>
		<pubDate>Tue, 16 Feb 2010 15:41:39 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Développement]]></category>
		<category><![CDATA[Tutoriaux]]></category>

		<guid isPermaLink="false">http://www.lindicible.com/blog/?p=495</guid>
		<description><![CDATA[Introduction Récemment, je me suis penché sur ce que l&#8217;on appelle les css layout &#171;&#160;élastiques&#160;&#187;. Basiquement, il s&#8217;agit d&#8217;utiliser l&#8217;unité &#171;&#160;em&#160;&#187; au lieu du pixel. Cette unité est une unité relative, comme le &#171;&#160;%&#160;&#187;, mais elle est relative à la taille de la police de caractères courante et non pas à la taille du contenant. [...]]]></description>
			<content:encoded><![CDATA[<h3>Introduction</h3>
<p>Récemment, je me suis penché sur ce que l&#8217;on appelle les css layout &laquo;&nbsp;élastiques&nbsp;&raquo;.<br />
Basiquement, il s&#8217;agit d&#8217;utiliser l&#8217;unité &laquo;&nbsp;em&nbsp;&raquo; au lieu du pixel. Cette unité est une unité relative, comme le &laquo;&nbsp;%&nbsp;&raquo;, mais elle est relative à la taille de la police de caractères courante et non pas à la taille du contenant.<br />
Pour comprendre son utilité, il faut savoir que certaines personnes ayant des problèmes de vue utilisent généralement une option de leur navigateur leur permettant d&#8217;augmenter la taille par défaut de la police.<br />
Les textes sont alors plus gros et plus lisibles. Malheureusement, il est rare que le site visité ai anticipé ce changement, et généralement toute la mise en page se retrouve complètement cassée.</p>
<p>Imaginez par exemple que vous ayez décidé de mettre une jolie image sous un lien pour avoir un bouton sympathique. Si la taille de la police de caractère est augmentée, il est très probable que le texte dépasse de cette image. Tout à coup, le bouton devient beaucoup moins joli.</p>
<p>A la recherche d&#8217;une solution à ce problème, je suis tombé sur un article de l&#8217;excellent site positioniseverything.net qui propose une solution permettant d&#8217;appliquer des ombres portées semi-transparentes à n&#8217;importe quelle image. L&#8217;article en question est visible ici : <a href="http://www.positioniseverything.net/articles/dropshadows2.html" rel="external">http://www.positioniseverything.net/articles/dropshadows2.html</a></p>
<p>L&#8217;approche m&#8217;a semblé intéressante, mais pas assez souple à mon goût. En effet, elle se base sur une énorme image en espérant que le conteneur ne dépasse jamais cette taille. Sans tenir compte de l&#8217;évolution rapide de la taille des écrans, cette méthode a un coût en terme de bande passante. Par ailleurs, elle présuppose que l&#8217;on cherche à avoir un contour d&#8217;image régulier, ce qui n&#8217;est pas forcément le cas.</p>
<p>Sous flash, il existe une façon de gérer les bords arrondis appelée Scale9Grid : On découpe un bloc en 9 parties distinctes comme illustré dans le schéma ci-dessous, et celles situées dans les coins ne sont jamais redimensionnées.<br />
<img src="http://www.lindicible.com/blog/wp-content/_custom/scale9css/grid.gif" alt="scale9grid" /></p>
<p>En se basant sur cette méthode et la technique de positioniseverything, j&#8217;ai mis au point un moyen d&#8217;avoir un bouton customisé qui s&#8217;adapte à son contenu. N&#8217;hésitez pas à visiter la page de <a href="http://www.lindicible.com/blog/wp-content/_custom/scale9css/" rel="external">démonstration interactive du bouton custom redimensionnable</a>. Mais je vous entends déjà vous impatienter, aussi voici la technique en question :</p>
<h3>Découpe de l&#8217;image</h3>
<p>Nous allons découper notre bouton suivant le schema ci-dessus, à une nuance prêt.<br />
Contrairement à Flash, le CSS2 ne permet pas d&#8217;étirer les images. Nous allons donc pour les parties qui doivent s&#8217;étendre en largeur ne garder qu&#8217;un morceau de 1 pixel de large qui se répétera autant que nécessaire.<br />
De même pour les parties verticales en ne gardant qu&#8217;un pixel de haut.<br />
Cette étape n&#8217;est pas réellement nécessaire, mais elle permet de ne pas surcharger la bande passante avec des données inutiles.</p>
<h3>Le HTML</h3>
<pre>
&lt;div class="tl"&gt;
    &lt;div class="tr"&gt;
        &lt;div class="bl"&gt;
            &lt;div class="br"&gt;
                &lt;div class="t"&gt;
                    &lt;div class="b"&gt;
                        &lt;div class="l"&gt;
                            &lt;div class="r"&gt;
                                &lt;div class="content"&gt;
                                    Place your content here
                                &lt;/div&gt;
                            &lt;/div&gt;
                        &lt;/div&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;
</pre>
<p>Comme vous le voyez, il faut une certaine quantité de balises qui ont pour seule utilité d&#8217;aider à la construction du bouton. Cela va à l&#8217;encontre du principe selon lequel le html doit toujours garder sa sémantique propre (ce qui est bon pour les moteurs de recherche), mais on ne fait pas d&#8217;omelette sans casser des oeufs !</p>
<p>Les classes représentent la partie de l&#8217;image qui sera utilisée. &laquo;&nbsp;l&nbsp;&raquo; pour &laquo;&nbsp;left&nbsp;&raquo;, &laquo;&nbsp;b&nbsp;&raquo; pour &laquo;&nbsp;bottom&nbsp;&raquo;, &laquo;&nbsp;br&nbsp;&raquo; pour &laquo;&nbsp;bottom-right&nbsp;&raquo;, etc.</p>
<h3>Le CSS</h3>
<p>Les commentaires sont placés directement dans le corps du CSS.</p>
<pre>
.tl{
    background:url('tl.gif') no-repeat top left;
    display:inline-block;
}

.ie7root .tl, .ie7root .tl div{ /* ie7 fix : n'importe quelle règle déclenchant haslayout peut remplacer cela */
    float:left;
}

.tr{
    background:url('tr.gif') no-repeat top right;
}
.bl{
    background:url('bl.gif') no-repeat bottom left;
}
.br{
    background:url('br.gif') no-repeat bottom right;
    padding-right:23px; /* dépend de la largeur de vos images de droite */
}
.t{
    background:url('t.gif') repeat-x top left;
    margin-left:23px; /* dépend de la largeur de vos images de gauche */
    padding-top:18px; /* dépend de la hauteur de vos images du haut */
}
.b{
    background:url('b.gif') repeat-x bottom left;
    padding-bottom:18px; /* dépend de la hauteur de vos images du bas */
}
.l{
    background:url('l.gif') repeat-y top left;
    margin-left:-23px; /* dépend de la largeur de vos images de gauche */
}
.r{
    background:url('r.gif') repeat-y top right;
    margin-left:23px; /* dépend de la largeur de vos images de gauche */
    margin-right:-23px; /* dépend de la largeur de vos images de droite */
    padding-right:23px; /* dépend de la largeur de vos images de droite */
}
.content{
    overflow:hidden; /* empêche les contenus insécables de dépasser */
    vertical-align:bottom; /* corrige un bug bizarre générant un gap de 3 pixel dans le bas */
    background-color:#28bcd9;
}
</pre>
<h3>Conclusion</h3>
<p>Cette méthode fonctionne avec tous les navigateurs testés, y compris le redoutable IE6 (qui va semble-t-il enfin bientôt prendre sa retraite!).<br />
Vous pouvez utiliser des images avec transparence en gif ou  en png (pour les navigateurs qui le supportent), et ainsi créer des ombres portées ou tout autre type de contour pour vos liens ou vos contenus.<br />
Si le contenu change ou si l&#8217;utilisateur change la taille de la police de caractère, le bouton s&#8217;adaptera !</p>
<p>Il y aura probablement plus de possibilités pour faire ce genre de choses avec l&#8217;arrivée de CSS3 et de HTML5. D&#8217;ici là, vous pouvez désormais avoir des contenant stylisés à votre goût, y compris pour les utilisateurs mal voyants. Profitez-en !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lindicible.com/blog/2010/02/16/bouton-customise-a-taille-variable-en-css/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
