<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description>Un simple développeur web qui souhaite communiquer sa passion, ses trouvailles et son humble savoir.</description><title>Cahnory</title><generator>Tumblr (3.0; @cahnory)</generator><link>http://cahnory.tumblr.com/</link><item><title>À lire : "Le ministère de l'intégration: Please Respect the Global CSS Namespace"</title><description>&lt;a href="http://blog.kaelig.fr/post/44554267597/please-respect-the-global-css-namespace"&gt;À lire : "Le ministère de l'intégration: Please Respect the Global CSS Namespace"&lt;/a&gt;: &lt;p&gt;&lt;a class="tumblr_blog" href="http://blog.kaelig.fr/post/44554267597/please-respect-the-global-css-namespace"&gt;kaelig&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;h2 id="tldr"&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;CSS doesn’t allow us (yet) to scope our styles to a particular component in an HTML document (unless we use &lt;code&gt;iframe&lt;/code&gt;s…). We can try to circumvent this limitation by respecting the global CSS namespace.&lt;/p&gt;
&lt;p&gt;We usually can safely set typography styles globally, but when it comes to form…&lt;/p&gt;
&lt;/blockquote&gt;</description><link>http://cahnory.tumblr.com/post/45335444709</link><guid>http://cahnory.tumblr.com/post/45335444709</guid><pubDate>Thu, 14 Mar 2013 10:26:37 +0100</pubDate></item><item><title>Test : target, checked et sélecteurs adjacents</title><description>&lt;p&gt;&lt;span&gt;La combinaison des pseudos-classes &lt;/span&gt;&lt;em&gt;:target&lt;/em&gt;&lt;span&gt; et &lt;/span&gt;&lt;em&gt;:checked&lt;/em&gt;&lt;span&gt; et des&lt;/span&gt;&lt;span&gt; sélecteurs adjacents (&lt;/span&gt;&lt;em&gt;+&lt;/em&gt;&lt;span&gt; et &lt;/span&gt;&lt;em&gt;~&lt;/em&gt;&lt;span&gt;) se révèlent très puissante. Elles nous permettent, de styler des éléments en fonction d&amp;#8217;un état binaire et ont permis notamment&lt;/span&gt;&lt;span&gt; l&amp;#8217;apparition de menu déroulant ne nécessitant pas javascript pour fonctionner.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Après que l&amp;#8217;on m&amp;#8217;ait remonté quelques bugs sur certaines des combinaisons possibles, j&amp;#8217;ai voulu faire un point sur celles-ci.&lt;br/&gt;J&amp;#8217;ai donc préparé une page visant à les tester et vous invite à vous y rendre avec différents navigateurs, différents os, différents appareils,… en multipliant donc au maximum les contextes (mais il va sans dire qu&amp;#8217;un unique retour sera autant apprécié).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Edit&amp;#160;:&lt;br/&gt;&lt;/strong&gt;&lt;strike&gt;La page de test&amp;#160;: &lt;a href="http://cahnory.fr/css/tests/checked-target.html%C2%A0"&gt;http://cahnory.fr/css/tests/checked-target.html &lt;/a&gt;&lt;/strike&gt;&lt;/p&gt;
&lt;p&gt;&lt;strike&gt;Vous pouvez poster vos retours (succès comme échecs) dans les commentaires de cet article en n&amp;#8217;oubliant pas de préciser le contexte pour chaque résultat.&lt;/strike&gt;&lt;br/&gt;&lt;strike&gt;Je compilerai ces résultats au fur et à mesure.&lt;/strike&gt;&lt;/p&gt;
&lt;p&gt;Une nouvelle page de test avec un formulaire pour soumettre vos résultats est disponible : &lt;a href="http://cahnory.fr/css/tests/checked-target2.html"&gt;&lt;a href="http://cahnory.fr/css/tests/checked-target2.html"&gt;http://cahnory.fr/css/tests/checked-target2.html&lt;/a&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&amp;#8212;&lt;/p&gt;
&lt;p&gt;Merci à vous&amp;#160;!&lt;/p&gt;</description><link>http://cahnory.tumblr.com/post/41779384041</link><guid>http://cahnory.tumblr.com/post/41779384041</guid><pubDate>Tue, 29 Jan 2013 13:08:00 +0100</pubDate><category>css</category><category>test</category><category>target</category><category>checked</category><category>adjacent</category></item><item><title>Regex : changer rapidement les &amp; en &amp;amp;</title><description>&lt;p&gt;J&amp;#8217;ai pris très tôt la bonne habitudes de valider mes documents html. Comme toute personne un minimum consciencieuse. À force on fini par ne plus trop faire d&amp;#8217;erreur, on vérifie simplement que des étourderies ne se soient pas glissées ça et là.&lt;/p&gt;
&lt;p&gt;Oui mais voilà, il arrive que l&amp;#8217;on doit traquer les erreurs dans des documents qui ne sont pas les notres. Là, une chose revient très souvent et peu littéralement pourrir un rapport d&amp;#8217;erreur, cette chose c&amp;#8217;est les &lt;em&gt;&amp;amp;&lt;/em&gt; non convertis en entité html &lt;em&gt;(&amp;amp;amp;)&lt;/em&gt;.&lt;!-- more --&gt;&lt;/p&gt;
&lt;p&gt;Pour y remédier, je met à disposition une regex simple qui vous permettra de très vite les trouver et donc les convertir&amp;#160;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;\&amp;amp;(?![a-zA-Z0-9#]+\;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Comme vous l&amp;#8217;aurez certainement remarqué, cette regex prend garde de ne pas convertir les &lt;em&gt;&amp;amp;&lt;/em&gt; utilisés pour la déclaration d&amp;#8217;entité.&lt;br/&gt;Aucun risque, à priori, de double encodage, à une limitation près. Je me suis basé sur ma mémoire pour dresser la liste des caractères autorisés dans les noms d&amp;#8217;entités (alphanumériques et le signe &lt;em&gt;#&lt;/em&gt;). Il n&amp;#8217;est pas impossible que je soit passé à coté d&amp;#8217;autre caractères autorisés.&lt;br/&gt;Si vous remarquez un oubli, ou, si vous avez une documentation sur le sujet n&amp;#8217;hésitez pas à me le faire savoir&amp;#160;!&lt;/p&gt;</description><link>http://cahnory.tumblr.com/post/32796306474</link><guid>http://cahnory.tumblr.com/post/32796306474</guid><pubDate>Wed, 03 Oct 2012 11:10:07 +0200</pubDate><category>regex</category><category>regular</category><category>expression</category><category>amp</category></item><item><title>Sprites et css des drapeaux du monde</title><description>&lt;a href="http://cahnory.fr/css/flags"&gt;Sprites et css des drapeaux du monde&lt;/a&gt;</description><link>http://cahnory.tumblr.com/post/27324613748</link><guid>http://cahnory.tumblr.com/post/27324613748</guid><pubDate>Mon, 16 Jul 2012 12:23:26 +0200</pubDate><category>flags</category><category>sprite</category><category>css</category></item><item><title>Regex : valider une adresse IP v4</title><description>&lt;p&gt;Je suis régulièrement sur le chat de &lt;a href="http://www.developpez.com" title="Developpez.com"&gt;developpez.com&lt;/a&gt; où j&amp;#8217;essai de répondre aux questions posées dans la limite du possible et de mon humeur.&lt;br/&gt;Force est de constater que les questions concernants les expressions régulières reviennent souvent. N&amp;#8217;ayant pas pour habitude de conserver toutes les réponses, je me suis dit qu&amp;#8217;il pourrait être intéressant de les poster ici avec plus ou moins d&amp;#8217;explication sur comment j&amp;#8217;arrive au résultat voulu.&lt;/p&gt;
&lt;p&gt;Je commence avec une question posée ce matin (j&amp;#8217;évite en général d&amp;#8217;aller sur le chat pendant mes heures de travail mais il se trouve que j&amp;#8217;avais une question à poser moi aussi)&amp;#160;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;comment valider une IP v4&amp;#160;?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;!-- more --&gt;&lt;/p&gt;
&lt;h2&gt;Analyse&lt;/h2&gt;
&lt;p&gt;Une IP v4 est constituée de 4 nombres séparés par des points. Chaque nombre obéit aux mêmes règles&amp;#160;:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;le nombre doit être compris entre 0 et 255 inclus&lt;/li&gt;
&lt;li&gt;à l&amp;#8217;exception du nombre 0, il ne doit pas commencer par le chiffre 0 (01 et 047 ne sont pas valides)&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Nous allons donc nous attarder en premier lieu sur la regex de l&amp;#8217;un de ces nombres, la suite ne sera plus qu&amp;#8217;une formalité.&lt;/p&gt;
&lt;p&gt;Je sépare les possibilités selon 4 cas, basés sur le chiffre qui commence le nombre. Nous avons les nombres&amp;#160;:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;de 0 à 9&amp;#160;&lt;em&gt;(seul cas où le nombre peu commencer par tous les chiffres)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;de 10 à 99&amp;#160;&lt;em&gt;(seul cas où le nombre peu commencer par tous les chiffres sauf 0)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;de 100 à 199&amp;#160;&lt;em&gt;(nombres ne commençant que par 1)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;de 200 à 255 &lt;em&gt;(nombres ne commençant que par 2)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Le dernier cas sera lui même séparé en fonction de la dizaine, déterminant les possibilités de l&amp;#8217;unité&amp;#160;:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;pour les dizaines allant de 0 à 4, les unités iront de 0 à 9&lt;/li&gt;
&lt;li&gt;pour celle de 5, les unités irons de 0 à 5 (250 à 255)&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;Mise en pratique&lt;/h2&gt;
&lt;p&gt;Le premier cas est très simple&amp;#160;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[0-9]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Le second pas bien compliqué non plus&amp;#160;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[1-9][0-9]&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;mais si vous êtes familiarisé avec les regex, vous aurez sans doute noté que l&amp;#8217;on pouvait &lt;strong&gt;fusionner nos deux premier cas&lt;/strong&gt; de la sorte&amp;#160;:&lt;/div&gt;
&lt;pre&gt;&lt;code&gt;[1-9]?[0-9]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Le troisième cas&amp;#160;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1[0-9]{2}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Et enfin le quatrième cas, divisé en deux regex&amp;#160;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;2[0-4][0-9]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;et&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;25[0-5]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Maintenant il ne nous reste plus qu&amp;#8217;à regrouper toutes ces possibilités pour avoir la regex complète d&amp;#8217;un nombre d&amp;#8217;une adresse IP&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pour valider complètement l&amp;#8217;adresse IP, il faudra que ce motif apparaîsse 4 fois successives. Les trois premières apparitions du motif seront suivies d&amp;#8217;un point&amp;#160;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(?:(?:[1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Notez que le motif&amp;#160;?: peut être retiré, il indique simplement que le contenu des parenthèse ne doit pas être capturé. Si vous ne comprenez pas bien cette notion, sachez simplement que c&amp;#8217;est facultatif dans le cas présent.&lt;/p&gt;
&lt;p&gt;Maintenant nous ajoutons simplement la quatrième apparition du motif ainsi que les indicateur de début et fin de chaîne (^ et $)&amp;#160;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;^(?:(?:[1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}(?:[1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Notre regex est maintenant terminée est prête à l&amp;#8217;emplois&amp;#160;!&lt;/p&gt;</description><link>http://cahnory.tumblr.com/post/26341727859</link><guid>http://cahnory.tumblr.com/post/26341727859</guid><pubDate>Mon, 02 Jul 2012 14:08:00 +0200</pubDate><category>regex</category><category>ip</category><category>regular</category><category>expression</category></item><item><title>Effets de pression "façon OS X" en CSS3</title><description>&lt;p&gt;&lt;img align="middle" alt="Les boutons en actions" height="150" src="http://img526.imageshack.us/img526/2360/buttonsfq.png" width="513"/&gt;&lt;/p&gt;
&lt;p&gt;Sous OS X (et peut-être ailleurs) certains boutons ont un effet de pression bien particulier.  En plus d&amp;#8217;un assombrissement, une ombre interne latérale renforce la perception d&amp;#8217;enfoncement. On en distingue de plusieurs forme, certains ayant l&amp;#8217;air complètement enfoncés, d&amp;#8217;autres seulement en leur centre,… je vous présente ici un moyen de parvenir au même résultat.&lt;!-- more --&gt;&lt;/p&gt;
&lt;p&gt;L&amp;#8217;explication est assais simple, nous allons utiliser les pseudos éléments &lt;em&gt;::before&lt;/em&gt; et &lt;em&gt;::after&lt;/em&gt;, placés à l&amp;#8217;extérieur du bouton, de chaque coté à l&amp;#8217;aide d&amp;#8217;un positionnement &lt;em&gt;absolute&lt;/em&gt;. Tandis qu&amp;#8217;un &lt;em&gt;overflow: hidden&lt;/em&gt; masquera ces élément, leur ombre portée créée à l&amp;#8217;aide de la propriété &lt;em&gt;box-shadow&lt;/em&gt; chevauchera elle les boutons créant l&amp;#8217;illusion d&amp;#8217;une ombre interne à celui-ci.&lt;/p&gt;
&lt;p&gt;Une fois le principe intégré, il ne reste plus qu&amp;#8217;à s&amp;#8217;amuser un peu avec les propriétés à notre disposition pour varier les effets. Ici, on jouera principalement du &lt;em&gt;border-radius&lt;/em&gt;, de la taille des pseudos éléments ainsi que de la position de ceux-ci.&lt;/p&gt;
&lt;p&gt;Un exemple étant bien plus parlant, je vous invite à consulter &lt;a href="http://dabblet.com/gist/3009440" title="Exemples d'effets de pression"&gt;celui que je me suis amusé à faire&lt;/a&gt;.&lt;br/&gt;Pour chaque effet, j&amp;#8217;ai ajouté une version laissant apparaître les pseudos éléments, vous pourrez ainsi mieux visualiser leur fonctionnement.&lt;/p&gt;
&lt;p&gt;N&amp;#8217;hésitez pas à partager vos propres variations ;)&lt;/p&gt;</description><link>http://cahnory.tumblr.com/post/26065586504</link><guid>http://cahnory.tumblr.com/post/26065586504</guid><pubDate>Thu, 28 Jun 2012 13:31:00 +0200</pubDate><category>css</category><category>button</category><category>osx</category></item><item><title>Des checkbox/radio slider uniquement en CSS</title><description>&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lz6184eyVQ1qcjuyj.png"/&gt;&lt;/p&gt;
&lt;p&gt;Popularisé par iOS, le checkbox slider est un élément d&amp;#8217;interface utilisateur très apprécié (des concepteurs tout au moins). Il existe beaucoup de plugins JavaScript permettant de transformer les habituelles checkboxes en slider mais vous allez voir qu&amp;#8217;il est possible d&amp;#8217;y parvenir à l&amp;#8217;aide de CSS seulement.&lt;!-- more --&gt; Tout cet article parlera de checkbox mais vous pouvez (techniquement) l&amp;#8217;appliquer à des boutons radio.&lt;/p&gt;
&lt;h2&gt;Côté HTML&lt;/h2&gt;
&lt;p&gt;Nous allons devoir ajouter un élément à la suite de notre checkbox et, encapsuler le tout dans un label. Nous lui donnerons deux attributs data qui contiendront des &amp;#8220;labels&amp;#8221; pour les états checked et unchecked. Nous les afficherons à l&amp;#8217;aide des pseudo éléments &lt;em&gt;::before&lt;/em&gt; et &lt;em&gt;::after&lt;/em&gt;. Les attributs data implique l&amp;#8217;utilisation d&amp;#8217;HTML5.&lt;/p&gt;
&lt;pre&gt;&lt;code class="html"&gt;&amp;lt;label&amp;gt;&amp;lt;input type="checkbox" /&amp;gt;&amp;lt;span class="checkslide" data-checked="on" data-unchecked="off"&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/label&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nous aurions pu nous passer de cet élément supplémentaire mais, si webkit permet l&amp;#8217;utilisation des pseudo éléments &lt;em&gt;::before&lt;/em&gt; et &lt;em&gt;::after&lt;/em&gt; (constaté sous chrome) il n&amp;#8217;en est rien des autres navigateurs et surtout, c&amp;#8217;est contraire aux specs.&lt;/p&gt;
&lt;h2&gt;Côté CSS&lt;/h2&gt;
&lt;p&gt;Mettre notre .checkslide et l&amp;#8217;input dans le label permet de checker et unchecker l&amp;#8217;input en cliquant sur .checkslide. Mettre le .checkslide à la suite de l&amp;#8217;input va nous permettre d&amp;#8217;utiliser la technique dite du &amp;#8220;&lt;a href="http://css-tricks.com/the-checkbox-hack/" title="Stuff you can do with the Checkbox Hack"&gt;checkbox hack&lt;/a&gt;&amp;#8221; et styliser notre .checkslide en fonction de l&amp;#8217;état checked de l&amp;#8217;input&amp;#160;:&lt;/p&gt;
&lt;pre&gt;&lt;code class="css"&gt;input:checked ~ .checkslide::after {&lt;br/&gt;    content: attr(data-checked);&lt;br/&gt;}&lt;br/&gt;input:not(:checked) ~ .checkslide::after {&lt;br/&gt;    content: attr(data-unchecked);&lt;br/&gt;}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ici, notre checkbox sera suivi de &lt;em&gt;on&lt;/em&gt; ou &lt;em&gt;off&lt;/em&gt; selon qu&amp;#8217;elle est checked ou non. Ce qu&amp;#8217;il y a de bien avec cette technique c&amp;#8217;est que notre checkbox reste une checkbox classique sauf si le navigateur supporte &lt;em&gt;:checked&lt;/em&gt;, &lt;em&gt;:not&lt;/em&gt;, &lt;em&gt;::after&lt;/em&gt; et &lt;em&gt;::before&lt;/em&gt;. La bonne nouvelle c&amp;#8217;est que jusqu&amp;#8217;à preuve du contraire, les navigateurs qui supportent &lt;em&gt;:checked&lt;/em&gt; supportent également &lt;em&gt;:not&lt;/em&gt;, &lt;em&gt;::after et &lt;/em&gt;&lt;em&gt;::before&lt;/em&gt;.&lt;/p&gt;
&lt;h3&gt;On habille le tout&lt;/h3&gt;
&lt;p&gt;Maintenant nous allons donner à notre élément l&amp;#8217;apparence d&amp;#8217;un checkbox slider et il y a plusieurs façons d&amp;#8217;y parvenir. Ce qu&amp;#8217;il faut retenir c&amp;#8217;est que si nous voulons appliquer des styles à .checkslide, il faut utiliser, dans le sélecteur, &lt;em&gt;:checked&lt;/em&gt; pour que ceux-ci ne s&amp;#8217;appliquent qu&amp;#8217;aux navigateurs concernés. Cela va souvent nous obliger à les doubler&amp;#160;:&lt;/p&gt;
&lt;pre&gt;&lt;code class="css"&gt;input:checked ~ .checkslide,&lt;br/&gt;input:not(:checked) ~ .checkslide {&lt;br/&gt;    background: #999;&lt;br/&gt;}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Quelques styles plutard nous voilà avec quelques exemples de checkbox sliders compatibles Firefox, Opera, Chrome, Safari et Internet Explorer 9 et +. &lt;a href="http://dabblet.com/gist/1782989" title="Des checkbox/radio slider uniquement en CSS"&gt;À voir sur dabblet&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Au passage, dabblet est un excellant outil créé par &lt;strong&gt;Lea Verou&lt;/strong&gt; qui, contrairement à ce qui a pu être dit par erreur &lt;a href="http://lea.verou.me/2012/02/vendor-prefixes-the-css-wg-and-me/" title="Vendor prefixes, the CSS WG and me"&gt;n&amp;#8217;est pas une activiste des propriétés vendeurs&lt;/a&gt; mais bel et bien du web standard comme nous l&amp;#8217;aimons ;).&lt;/p&gt;</description><link>http://cahnory.tumblr.com/post/17331984025</link><guid>http://cahnory.tumblr.com/post/17331984025</guid><pubDate>Thu, 09 Feb 2012 22:00:00 +0100</pubDate><category>css</category><category>checkbox</category><category>slider</category></item><item><title>Les (fav|apple-touch-|speed-dial-)icons</title><description>&lt;p&gt;Bien connus de tous les développeurs web, le favicon fut pendant longtemps la seule icone dont on avait à se soucier. Aujourd&amp;#8217;hui ce n&amp;#8217;est plus le cas et un point s&amp;#8217;impose afin de gérer au mieux cet aspect certe mineur mais ô combien plaisant de nos sites internets.&lt;!-- more --&gt;&lt;/p&gt;
&lt;h2&gt;Au commencement était le favicon.ico&lt;/h2&gt;
&lt;p&gt;Le vétéran des icones de site c&amp;#8217;est lui et sa première apparition remonte avant sa normalisation par le W3C, sous Internet Explorer 5. Pour l&amp;#8217;utiliser il y a quelque règles à respecter.&lt;/p&gt;
&lt;p&gt;Premièrement, votre fichier doit réellement être de type ico. J&amp;#8217;entend qu&amp;#8217;&lt;strong&gt;il ne suffit pas de changer l&amp;#8217;extension de votre fichier&lt;/strong&gt; image en &lt;em&gt;ico&lt;/em&gt; pour qu&amp;#8217;il fonctionne correctement avec Internet Explorer (ou en tout cas pas toujours). À titre personnel j&amp;#8217;utilise le site &lt;a href="http://www.favicon.cc/" title="favicon.ico Generator"&gt;&lt;a href="http://www.favicon.cc"&gt;www.favicon.cc&lt;/a&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ensuite nous indiquons au navigateur où se situe le fichier à l&amp;#8217;aide d&amp;#8217;une balise meta&amp;#160;:&lt;/p&gt;
&lt;pre&gt;&lt;code class="html"&gt;&amp;lt;link rel="shortcut icon" type="image/x-icon" href="favicon.ico" /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Sachez que pour Internet Explorer 5, il faudra que le fichier soit situé à la racine du serveur (ce que vous pouvez truquer à l&amp;#8217;aide du mode Rewrite d&amp;#8217;Apache).&lt;/p&gt;
&lt;h3&gt;Un peu plus de transparence&lt;/h3&gt;
&lt;p&gt;Le favicon nous permet un niveau de transparence, c&amp;#8217;est pas mal mais on peut avoir mieux. Nous allons utiliser un fichier favicon.png de type &lt;em&gt;png24&lt;/em&gt;. Celui-ci ne sera utilisé que s&amp;#8217;il est supporté. Dans le cas contraire, ou, devrais-je dir sous Internet Explorer, c&amp;#8217;est le favicon.ico qui le sera. Pour que ce mécanisme opère &lt;strong&gt;il faut déclarer la version &lt;em&gt;png&lt;/em&gt; après la version &lt;em&gt;ico&lt;/em&gt;&lt;/strong&gt;&amp;#160;:&lt;/p&gt;
&lt;pre&gt;&lt;code class="html"&gt;&amp;lt;link rel="shortcut icon" type="image/x-icon" href="favicon.ico" /&amp;gt;&lt;br/&gt;&amp;lt;link rel="shortcut icon" type="image/png" href="favicon.png" /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Les apple-touch-icon c&amp;#8217;est trognon&lt;/h2&gt;
&lt;p&gt;C&amp;#8217;est avec l&amp;#8217;iPod touch que l&amp;#8217;apple-touch-icon fit sont apparition. L&amp;#8217;icone est automatiquement modifiée, une ombre portée et un effet &amp;#8220;glossy&amp;#8221; lui sont appliqués et ses coins sont arrondis. Avec la multiplication des supports, différentes tailles d&amp;#8217;apple-touch-icon ont fait leur apparition.&lt;/p&gt;
&lt;p&gt;Nous allons utiliser des icones dites &lt;em&gt;precomposed&lt;/em&gt;. C&amp;#8217;est à dire que l&amp;#8217;effet glossy ne leur sera pas appliqué, en revanche les bords arrondis et l&amp;#8217;ombre portée ne sont pas désactivables. Nous allons avoir 4 déclinaisons de notre icone&amp;#160;:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Une icone &lt;em&gt;precomposed&lt;/em&gt; de 114x114px&lt;/li&gt;
&lt;li&gt;Une icone &lt;em&gt;precomposed&lt;/em&gt; de 72x72px&lt;/li&gt;
&lt;li&gt;Une icone &lt;em&gt;precomposed&lt;/em&gt; de 57x57px&lt;/li&gt;
&lt;li&gt;Une icone de 57x57px&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;La dernière icone étant utilisée par d&amp;#8217;anciennes version d&amp;#8217;iOS ainsi que d&amp;#8217;autres appareils.&lt;/p&gt;
&lt;p&gt;Nous allons déclarer nos icones à l&amp;#8217;aide de balises meta, de la plus grande à la plus petite en spécifiant les dimensions des icones à l&amp;#8217;aide de l&amp;#8217;attribut &lt;em&gt;size&lt;/em&gt; seulement pour les icones de taille supérieure à 57px. La raison à cet ordre est que certaines versions d&amp;#8217;iOS nécessitant une image de seulement 57px ne téléchargent que la dernière icone, ignorant l&amp;#8217;attribut size.&lt;/p&gt;
&lt;pre&gt;&lt;code class="html"&gt;&amp;lt;link rel="apple-touch-icon-precomposed" sizes="114x114" href="apple-touch-icon-114x114-precomposed.png"&amp;gt;
&amp;lt;link rel="apple-touch-icon-precomposed" sizes="72x72" href="apple-touch-icon-72x72-precomposed.png"&amp;gt;
&amp;lt;link rel="apple-touch-icon-precomposed" href="apple-touch-icon-precomposed.png"&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nous ne déclarons pas notre dernière icone, elle sera utilisée par défaut par les appareils ne reconnaissant pas les icones &lt;em&gt;precomposed&lt;/em&gt;. Elle est, comme le favicon, à placer à la racine de votre serveur.&lt;/p&gt;
&lt;p&gt;Si nous ne désirons pas utiliser d&amp;#8217;icone &lt;em&gt;precomposed&lt;/em&gt;, nous n&amp;#8217;aurons alors que trois icones, une pour chaque taille, mais nous conserverons les trois balises meta en veillant à remplacer la valeur de l&amp;#8217;attribut &lt;em&gt;rel&lt;/em&gt;&amp;#160;:&lt;/p&gt;
&lt;pre&gt;&lt;code class="html"&gt;&amp;lt;link rel="apple-touch-icon" sizes="114x114" href="apple-touch-icon-114x114.png"&amp;gt;
&amp;lt;link rel="apple-touch-icon" sizes="72x72" href="apple-touch-icon-72x72.png"&amp;gt;
&amp;lt;link rel="apple-touch-icon" href="apple-touch-icon.png"&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Sachez qu&amp;#8217;Android utilise également les apple-touch-icon. Sous certaines versions vous devrez utiliser des urls absolues ou une balise base&amp;#160;:&lt;/p&gt;
&lt;pre&gt;&lt;code class="html"&gt;&amp;lt;base href="http://www.domaine.fr/base/" /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cette particularité a été constaté sur une Samsung Galaxy Tab (user-agent&amp;#160;: &lt;em&gt;Mozilla/5.0 (Linux; U; Android 2.2.1; fr-fr; GT-P1010 Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1&lt;/em&gt;).&lt;/p&gt;
&lt;h2&gt;Le Speed dial d&amp;#8217;Opera&lt;/h2&gt;
&lt;p&gt;Depuis Opera 11.10 il est possible de spécifier une image pour l&amp;#8217;écrans &lt;em&gt;Speed Dial&lt;/em&gt;. Un article de &lt;a href="http://dev.opera.com/articles/view/opera-speed-dial-enhancements/#setanicon" title="Make your site shine in Speed Dial"&gt;dev.opera.com&lt;/a&gt; fait état d&amp;#8217;une dimension maximale par défaut de 256x160px. Après plusieurs tests, j&amp;#8217;ai pourtant constaté que 384x240px semblait plus proche de la vérité. Dans tous les cas, votre image sera redimensionnée sur un fond blanc (mais cette couleur peut-elle être modifiée&amp;#160;?) et je vous conseille donc d&amp;#8217;&lt;strong&gt;utiliser un fond transparent&lt;/strong&gt;, le png24 étant bien pris en compte.&lt;/p&gt;
&lt;p&gt;Il est important de &lt;strong&gt;déclarer votre icon &lt;em&gt;Speed Dial&lt;/em&gt; avant le favicon&lt;/strong&gt;. On procède de la même manière, à l&amp;#8217;aide d&amp;#8217;une balise meta&amp;#160;:&lt;/p&gt;
&lt;pre&gt;&lt;code class="html"&gt;&amp;lt;link rel="icon" type="image/png" href="speed-dial-icon.png"&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Opera offre également la possibilité d&amp;#8217;afficher directement votre page html et d&amp;#8217;y appliquer des styles spécifiques au Speed Dial à l&amp;#8217;aide de &lt;em&gt;media query&lt;/em&gt; et du &lt;em&gt;view-mode&lt;/em&gt; &lt;em&gt;minimized&lt;/em&gt;&amp;#160;:&lt;/p&gt;
&lt;pre&gt;&lt;code class="css"&gt;@media screen and (view-mode: minimized) {&lt;br/&gt;    body {&lt;br/&gt;        color: #fff;&lt;br/&gt;        background: #b20000;&lt;br/&gt;    }&lt;br/&gt;}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ici je reprend simplement l&amp;#8217;&lt;a href="http://dev.opera.com/articles/view/opera-speed-dial-enhancements/#viewmode" title="Using view-mode:minimized"&gt;exemple fourni par Opera&lt;/a&gt;, vous trouverez également sur cette page d&amp;#8217;autres informations relative au &lt;em&gt;Speed Dial &lt;/em&gt;.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Nous nous retrouvons donc avec 7 images&amp;#160;:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;favicon.ico&lt;/li&gt;
&lt;li&gt;favicon.png&lt;/li&gt;
&lt;li&gt;apple-touch-icon-114x114-precomposed.png&lt;/li&gt;
&lt;li&gt;apple-touch-icon-72x72-precomposed.png&lt;/li&gt;
&lt;li&gt;apple-touch-icon-57x57-precomposed.png&lt;/li&gt;
&lt;li&gt;apple-touch-icon-57x57.png&lt;/li&gt;
&lt;li&gt;speed-dial-icon.png&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Et le code html suivant&amp;#160;:&lt;/p&gt;
&lt;pre&gt;&lt;code class="html"&gt;&amp;lt;base href="http://www.domaine.fr/base/" /&amp;gt;&lt;br/&gt;&lt;br/&gt;&amp;lt;link rel="apple-touch-icon-precomposed" sizes="114x114" href="apple-touch-icon-114x114-precomposed.png"&amp;gt;&lt;br/&gt;&amp;lt;link rel="apple-touch-icon-precomposed" sizes="72x72" href="apple-touch-icon-72x72-precomposed.png"&amp;gt;&lt;br/&gt;&amp;lt;link rel="apple-touch-icon-precomposed" href="apple-touch-icon-precomposed.png"&amp;gt;&lt;br/&gt;&lt;br/&gt;&amp;lt;link rel="icon" type="image/png" href="speed-dial-icon.png"&amp;gt;&lt;br/&gt;&lt;br/&gt;&amp;lt;link rel="shortcut icon" type="image/x-icon" href="favicon.ico" /&amp;gt;&lt;br/&gt;&amp;lt;link rel="shortcut icon" type="image/png" href="favicon.png" /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Je vous conseille de mettre toutes vos images à la racine de votre serveur ou, si ce n&amp;#8217;est pas possible/confortable, de simuler cet état à l&amp;#8217;aide du mode Rewrite d&amp;#8217;Apache. Certaines devant obligatoirement se placer là, autant toutes les regrouper.&lt;/p&gt;
&lt;p&gt;Voici une page démo que je vous invite à visiter. Si vous avez des configurations exotiques ou que vous rencontrez un résultat inattendu n&amp;#8217;hésitez pas à le partager&amp;#160;: &lt;a href="http://www.cahnory.fr/favicon-boilerplate/test.html" title="Icones de site internet"&gt;&lt;a href="http://www.cahnory.fr/favicon-boilerplate/test.html"&gt;http://www.cahnory.fr/favicon-boilerplate/test.html&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Sachez enfin que cette synthèse ne fait que rebondir sur un travail énorme de Mathias Bynens&amp;#160;: &lt;a href="http://mathiasbynens.be/notes/touch-icons" title="Everything you always wanted to know about touch icons · Mathias Bynens"&gt;&lt;a href="http://mathiasbynens.be/notes/touch-icons"&gt;http://mathiasbynens.be/notes/touch-icons&lt;/a&gt;&lt;/a&gt;. Tout le mérite de la partie sur les apple-touch-icon lui revient et je vous conseil de le lire si vous souhaitez connaître en détail la prise en charge de ces icones.&lt;/p&gt;
&lt;p&gt;Je met enfin à votre disposition un petit PSD qui permet de rapidement visualiser le rendu final de vos apple-touch-icon, &lt;em&gt;precomposed&lt;/em&gt; ou pas&amp;#160;: &lt;a href="http://goo.gl/KQ0GC" title="PSD apple-touch-icon"&gt;&lt;a href="http://goo.gl/KQ0GC"&gt;http://goo.gl/KQ0GC&lt;/a&gt;&lt;/a&gt;.&lt;/p&gt;</description><link>http://cahnory.tumblr.com/post/17258117178</link><guid>http://cahnory.tumblr.com/post/17258117178</guid><pubDate>Wed, 08 Feb 2012 10:00:00 +0100</pubDate><category>favicon</category><category>apple-touch-icon</category><category>speed-dial</category><category>html</category></item><item><title>Des boutons "épais" crossbrowser</title><description>&lt;p&gt;C&amp;#8217;est quelque chose que l&amp;#8217;on voit souvent sur le net et les tutos à ce sujet ne manquent pas. Alors pourquoi en écrire un de plus me direz-vous&amp;#160;? Car la plupart sont en anglais mais aussi, et surtout, parce que dans la folie du CSS3 beaucoup oublient les bonnes vieilles méthodes.&lt;/p&gt;
&lt;h2&gt;Guère épais… des boutons&lt;/h2&gt;
&lt;p&gt;Voici le type de bouton que nous allons réaliser, tel qu&amp;#8217;ils seront affichés par les navigateurs modernes et plus anciens&amp;#160;:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lyzllm99EB1qcjuyj.png"/&gt;&lt;!-- more --&gt;&lt;/p&gt;
&lt;h3&gt;Un petit reset des styles&lt;/h3&gt;
&lt;p&gt;Nous allons commencer par &amp;#8220;uniformiser&amp;#8221; les styles des trois éléments susceptibles d&amp;#8217;être transformés en bouton, à savoir les élément &lt;em&gt;a&lt;/em&gt;, &lt;em&gt;button&lt;/em&gt;, et &lt;em&gt;input[type=&amp;#8221;submit&amp;#8221;]&lt;/em&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class="css"&gt;.button {&lt;br/&gt;    background: #EEE;&lt;br/&gt;    border: 1px solid #DDD;&lt;br/&gt;    color: #666;&lt;br/&gt;    cursor: pointer;&lt;br/&gt;    display: -moz-inline-box; display: inline-block; *display: inline; *zoom: 1;&lt;br/&gt;    font: 1em/1.2em Arial, sans-serif;&lt;br/&gt;    outline: none;&lt;br/&gt;    margin: 0;&lt;br/&gt;    padding: .5em 1.25em;&lt;br/&gt;    text-decoration: none;&lt;br/&gt;}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;À ce stade là, notre bouton s&amp;#8217;affiche de la même manière quel que soit l&amp;#8217;élément. Vous noterez la manière &lt;em&gt;crossbrowser&lt;/em&gt; de définir un élément &lt;em&gt;inline-block&lt;/em&gt; (toute la ligne commençant par display y est consacrée). Notez que &lt;strong&gt;cette base de code est valable pour tout type de bouton&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;Pump up the volume&amp;#160;!&lt;/h3&gt;
&lt;p&gt;Maintenant nous allons ajouter du volume, le principal aspect de notre bouton. Pour y parvenir la propriété &lt;em&gt;border&lt;/em&gt; suffit amplement. Nul besoin d&amp;#8217;utiliser &lt;em&gt;box-shadow&lt;/em&gt; ici.&lt;/p&gt;
&lt;pre&gt;&lt;code class="css"&gt;.button {&lt;br/&gt;    background: #EEE;&lt;br/&gt;    border: 1px solid #DDD;&lt;br/&gt;    border-bottom: 3px solid #BBB;&lt;br/&gt;    color: #666;&lt;br/&gt;    cursor: pointer;&lt;br/&gt;    display: -moz-inline-box; display: inline-block; *display: inline; *zoom: 1;&lt;br/&gt;    font: 1em/1.2em Arial, sans-serif;&lt;br/&gt;    outline: none;&lt;br/&gt;    margin: 0;&lt;br/&gt;    padding: .5em 1.25em;&lt;br/&gt;    position: relative;&lt;br/&gt;    text-decoration: none;&lt;br/&gt;    top: -2px;&lt;br/&gt;}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nous avons &lt;strong&gt;épaissi et assombri le border-bottom&lt;/strong&gt; et avons remonté le bouton à l&amp;#8217;aide d&amp;#8217;un &lt;strong&gt;positionnement relatif&lt;/strong&gt; et de la propriété &lt;strong&gt;top&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;Pseudo classes&lt;/h3&gt;
&lt;p&gt;On ne retire pas les outlines d&amp;#8217;un élément impunément, il faut tout de même signaler l&amp;#8217;état &lt;em&gt;focus&lt;/em&gt; à l&amp;#8217;utilisateur. On va prendre soin d&amp;#8217;utiliser des propriétés implémentées par tous.&lt;/p&gt;
&lt;pre&gt;&lt;code class="css"&gt;.button:focus {&lt;br/&gt;    border-bottom-width: 2px;&lt;br/&gt;    top: -1px;&lt;br/&gt;    color: #2AD;&lt;br/&gt;}&lt;br/&gt;.button:hover {&lt;br/&gt;    background-color: #F4F4F4;&lt;br/&gt;}&lt;br/&gt;.button:active {&lt;br/&gt;    border-bottom-width: 1px;&lt;br/&gt;    color: #2AD;&lt;br/&gt;    top: 0;&lt;br/&gt;}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Au &lt;em&gt;focus&lt;/em&gt;, notre bouton va s&amp;#8217;enfoncer d&amp;#8217;1px et la couleur du texte vire au bleu. On applique le même principe pour la pseudo classe &lt;em&gt;:active&lt;/em&gt; mais en enfonçant cette fois notre bouton de 2px ce qui en fait un bouton plat bordé d&amp;#8217;1px. Pour &lt;em&gt;:hover&lt;/em&gt;, on éclairci légèrement le bouton, pas besoin d&amp;#8217;en faire des tonnes vu que nous utilisons un &lt;em&gt;cursor&lt;/em&gt; de type &lt;em&gt;pointer&lt;/em&gt;.&lt;/p&gt;
&lt;h3&gt;Rien que pour vos yeux&lt;/h3&gt;
&lt;p&gt;Notre base commune est prête, il est temps de s&amp;#8217;amuser avec quelques propriétés css3. Un peu de &lt;em&gt;linear-gradient&lt;/em&gt;, un léger &lt;em&gt;border-radius&lt;/em&gt; et un soupçon de &lt;em&gt;box-shadow&lt;/em&gt;,… tout vient à point à qui sait attendre.&lt;/p&gt;
&lt;pre&gt;&lt;code class="css"&gt;.button {&lt;br/&gt;    background: #EEE;&lt;br/&gt;    background-image: linear-gradient(rgba(0,0,0,0), rgba(0,0,0,.07));&lt;br/&gt;    border: 1px solid #DDD;&lt;br/&gt;    border-bottom: 3px solid #BBB;&lt;br/&gt;    border-radius: 3px;&lt;br/&gt;    box-shadow: inset 0 1px rgba(255,255,255,.5), inset 0 0 0 1px rgba(255,255,255,.2),0 2px 2px -1px rgba(0,0,0,.6);&lt;br/&gt;    color: #666;&lt;br/&gt;    cursor: pointer;&lt;br/&gt;    display: -moz-inline-box; display: inline-block; *display: inline; *zoom: 1;&lt;br/&gt;    font: 1em/1.2em Arial, sans-serif;&lt;br/&gt;    outline: none;&lt;br/&gt;    margin: 0;&lt;br/&gt;    padding: .5em 1.25em;&lt;br/&gt;    position: relative;&lt;br/&gt;    text-decoration: none;&lt;br/&gt;    text-shadow: 0 1px #FFF;&lt;br/&gt;    top: -2px;&lt;br/&gt;}&lt;br/&gt;.button:focus {&lt;br/&gt;    border-bottom-width: 2px;&lt;br/&gt;    top: -1px;&lt;br/&gt;    color: #2AD;&lt;br/&gt;}&lt;br/&gt;.button:hover {&lt;br/&gt;    background-color: #F4F4F4;&lt;br/&gt;    box-shadow: inset 0 1px rgba(255,255,255,.5), inset 0 0 8px 1px rgba(255,255,255,.5),0 2px 2px -1px rgba(0,0,0,.6);&lt;br/&gt;}&lt;br/&gt;.button:active {&lt;br/&gt;    border-bottom-width: 1px;&lt;br/&gt;    box-shadow: inset 0 1px rgba(255,255,255,.5), inset 0 0 0 1px rgba(255,255,255,.2),0 2px 2px -1px rgba(0,0,0,.6);&lt;br/&gt;    color: #2AD;&lt;br/&gt;    top: 0;&lt;br/&gt;}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Notez que pour plus de clarté, je n&amp;#8217;utilise ici que les propriétés standards. Libre à vous d&amp;#8217;ajouter les équivalents vendeurs (-moz, -webkit,…), les filtres Internet Explorer ou encore &lt;a href="http://leaverou.github.com/prefixfree/" title="Prefix free: Break free from CSS vendor prefix hell!"&gt;-prefix-free&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Groupe de boutons&lt;/h2&gt;
&lt;p&gt;Pour coller nos boutons les uns aux autres en une jolie barre, nous allons utiliser un élément englobant et une classe &lt;em&gt;.button-set&lt;/em&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class="css"&gt;.button-set {&lt;br/&gt;    padding-left: 1px;&lt;br/&gt;}&lt;br/&gt;.button-set .button {&lt;br/&gt;    border-radius: 0;&lt;br/&gt;    margin-left: -1px;&lt;br/&gt;}&lt;br/&gt;.button-set .button:first-child {&lt;br/&gt;    border-radius: 3px 0 0 3px;&lt;br/&gt;}&lt;br/&gt;.button-set .button:last-child {&lt;br/&gt;    border-radius: 0 3px 3px 0;&lt;br/&gt;}&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class="html"&gt;&amp;lt;span class="button-set"&amp;gt;&lt;br/&gt;    &amp;lt;a href="#" class="button"&amp;gt;link&amp;lt;/a&amp;gt;&amp;lt;!--&lt;br/&gt;    --&amp;gt;&amp;lt;button class="button"&amp;gt;button&amp;lt;/button&amp;gt;&amp;lt;!--&lt;br/&gt;    --&amp;gt;&amp;lt;input type="submit" class="button" value="submit" /&amp;gt;&lt;br/&gt;&amp;lt;/span&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Afin de supprimer tout espace entre les éléments &lt;em&gt;inline-block&lt;/em&gt;, j&amp;#8217;ajoute des commentaires html entre chacun d&amp;#8217;eux. Sachez tout de même que les commentaires sont des élément à part entière du DOM et qu&amp;#8217;il est bon de réduire autant que possible le nombre d&amp;#8217;élément d&amp;#8217;une page. Essayez donc de les délaisser et &lt;strong&gt;collez plutôt les boutons les un aux autres&lt;/strong&gt;, balise fermante contre balise ouvrante, dés que cela est possible.&lt;/p&gt;
&lt;p&gt;On applique simplement un &lt;em&gt;margin-left&lt;/em&gt; de -1px afin de superposer les bords et un &lt;em&gt;padding-left&lt;/em&gt; de 1px au .&lt;em&gt;button-set&lt;/em&gt; pour compenser la marge négative du premier élément. On termine notre effet en réglant les valeurs de &lt;em&gt;border-radius&lt;/em&gt; en fonction de la position de nos éléments.&lt;/p&gt;
&lt;p&gt;Et nous pouvons enfin &lt;a href="http://dabblet.com/gist/1755765" title='Démo - Des boutons "épais" crossbrowser'&gt;admirer le résultat&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ici, même si seuls les navigateurs modernes auront une finition impeccable à base de CSS3, les dinosaures auront quelque chose d&amp;#8217;acceptable et dans l&amp;#8217;esprit.&lt;/p&gt;</description><link>http://cahnory.tumblr.com/post/17203572968</link><guid>http://cahnory.tumblr.com/post/17203572968</guid><pubDate>Tue, 07 Feb 2012 10:00:00 +0100</pubDate><category>css</category><category>bouton</category><category>3d</category></item><item><title>UTF-8, comment ça marche �</title><description>&lt;p&gt;L&amp;#8217;UTF-8 est un encodage permettant de gérer bien plus de caractères que l&amp;#8217;ISO, limité à seulement 256. Il est universel et couvre aussi bien les caractères latins que cyrilliques, arabes, japonais… à titre personnel, il m&amp;#8217;est nécessaire pour afficher mon prénom ;).&lt;/p&gt;
&lt;p&gt;Si l&amp;#8217;UTF-8 est très utile, il n&amp;#8217;en reste pas moins que, si l&amp;#8217;on est peu habitué aux problématiques d&amp;#8217;encodage des caractères, son utilisation peut être déroutante. En effet, même si l&amp;#8217;utilisation de l&amp;#8217;UTF-8 est devenu la norme, il n&amp;#8217;est pas forcément l&amp;#8217;encodage par défaut des outils que nous utilisons.&lt;br/&gt; Je vais dans cet article tenter de transmettre ce que je sais sur cet encodage. Vous verrez qu&amp;#8217;une fois que l&amp;#8217;on sait un minimum comment tout cela fonctionne, l&amp;#8217;utilisation d&amp;#8217;UTF-8 n&amp;#8217;aura plus que des avantages.&lt;!-- more --&gt;&lt;/p&gt;
&lt;p&gt;Avant de commencer, je tiens à souligner que la majeure partie de ce que j&amp;#8217;ai pu apprendre sur cet encodage provient d&amp;#8217;une seule source, un article brillant d&amp;#8217;un certain Thierry. Celui-ci n&amp;#8217;est depuis quelques temps plus en ligne ce qui m&amp;#8217;a motivé à rédiger cet article. &lt;strike&gt;Dans l&amp;#8217;éventualité qu&amp;#8217;il soit à nouveau en ligne, voici le lien qui y menait&amp;#160;: &lt;a href="http://electron-libre.fassnet.net/utf8.php"&gt;http://electron-libre.fassnet.net/utf8.php&lt;/a&gt;&lt;/strike&gt; L&amp;#8217;article est de nouveau en ligne : &lt;a href="http://www.electron-libre.org/utf8.php" title="Tutoriel sur la mise en place d'utf-8 avec php et mysql"&gt;&lt;a href="http://www.electron-libre.org/utf8.php"&gt;http://www.electron-libre.org/utf8.php&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Les sources de vos données&lt;/h2&gt;
&lt;h3&gt;L&amp;#8217;encodage et MySQL&lt;/h3&gt;
&lt;p&gt;Sous MySQL, il vous est possible de définir l&amp;#8217;encodage utilisé sur quatre niveaux&amp;#160;:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;la connexion&lt;/li&gt;
&lt;li&gt;la base de donnée&lt;/li&gt;
&lt;li&gt;la table&lt;/li&gt;
&lt;li&gt;le champs&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Sauf cas particuliers, veillez à ce que l&amp;#8217;encodage soit &amp;#8220;&lt;strong&gt;utf8&lt;/strong&gt;&amp;#8221; (sans tiret) sur chacun de ces niveaux. Pour préciser au serveur que vous allez communiquer avec lui en UTF-8, exécutez cette requête &lt;strong&gt;directement après chaque connexion&lt;/strong&gt;&amp;#160;:&lt;/p&gt;
&lt;pre&gt;&lt;code class="sql"&gt;SET NAMES 'utf8'&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La collation (COLLATE) n&amp;#8217;impactera pas vos données mais, lors de vos recherches elle définie comment les caractères sont regroupés.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;utf8_bin&lt;/strong&gt; effectue un regroupement binaire &amp;#8220;&lt;strong&gt;a&amp;#160;!= à&amp;#160;!= A&amp;#160;!= À&lt;/strong&gt;&amp;#8221;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;utf8_general_cs&lt;/strong&gt; effectue un regroupement par &amp;#8220;généralité&amp;#8221; sensible à la casse &amp;#8220;&lt;strong&gt;a = à&amp;#160;!= A = À&lt;/strong&gt;&amp;#8221;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;utf8_general_ci&lt;/strong&gt; effectue un regroupement par &amp;#8220;généralité&amp;#8221; insensible à la casse &amp;#8220;&lt;strong&gt;a = à = A = À&lt;/strong&gt;&amp;#8221;.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Si vous ne savez pas lequel choisir, utilisez &lt;strong&gt;utf8_general_ci&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;Vos fichiers aussi doivent être encodés&lt;/h3&gt;
&lt;p&gt;Sachez que si vous stocker des données dans des fichiers, ceux-ci devront eux aussi être encodé en UTF-8. D&amp;#8217;une manière générale, &lt;strong&gt;encodez toujours vos fichiers en UTF-8&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Aussi, &lt;strong&gt;vos fichiers ne doivent pas contenir de &lt;a href="http://fr.wikipedia.org/wiki/Byte_Order_Mark" title="Marque d'ordre des octets"&gt;BOM&lt;/a&gt;&lt;/strong&gt;. Ce caractère &amp;#8220;invisible&amp;#8221; spécifique à l&amp;#8217;unicode est parfois ajouté en début de fichier par votre éditeur et peut être source de perturbations. En effet, bien qu&amp;#8217;il s&amp;#8217;agisse d&amp;#8217;un caractère invisible il aura pour effet, par exemple dans un script php, d&amp;#8217;envoyer et clore l&amp;#8217;entête HTTP et débuter l&amp;#8217;envois du corps de celle-ci.&lt;/p&gt;
&lt;p&gt;L&amp;#8217;encodage de vos fichiers se gère dans votre éditeur, qui a sa propre méthode. Une liste de procédures à suivre en fonctions de différents éditeurs est à votre disposition, n&amp;#8217;hésitez pas à proposer le votre s&amp;#8217;il n&amp;#8217;y figure pas.&lt;/p&gt;
&lt;h4&gt;Éditeurs Windows&lt;/h4&gt;
&lt;h5&gt;Komodo Edit&lt;/h5&gt;
&lt;p&gt;&lt;strong&gt;Configuration par défaut&lt;/strong&gt;&lt;br/&gt; Edit&amp;#160;› Current file settings&amp;#160;› Onglets &amp;#8220;Properties&amp;#8221;&amp;#160;› Encoding (UTF-8). Décochez &amp;#8220;Use signature (BOM)&amp;#8221;&lt;/p&gt;
&lt;h5&gt;UltraEdit&lt;/h5&gt;
&lt;p&gt;&lt;strong&gt;Configuration par défaut&lt;/strong&gt;&lt;br/&gt;Advanced&amp;#160;› Configuration&amp;#160;› File Handling&amp;#160;› Save. Décochez &amp;#8220;Write UTF-8 BOM header to all UTF-8 files when saved&amp;#8221; et &amp;#8220;Write UTF-8 BOM on new files created within this program (if above is not set)&amp;#8221;&lt;/p&gt;
&lt;h5&gt;phpDesigner 8&amp;#160;&lt;small&gt;(merci à LeFauve)&lt;/small&gt;&lt;/h5&gt;
&lt;p&gt;&lt;strong&gt;Configuration par défaut&lt;/strong&gt;&lt;br/&gt;Tools&amp;#160;› Preferences&amp;#160;› General (UTF-8). Cochez &amp;#8220;Encoding Types&amp;#8221; et &amp;#8220;Load as UTF-8&amp;#8221;, activez &amp;#8220;UTF-8&amp;#8221; et décochez &amp;#8220;Save with BOM&amp;#8221;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Définition par fichier&lt;/strong&gt;&lt;br/&gt;File&amp;#160;› File Encoding&lt;/p&gt;
&lt;h4&gt;Éditeurs OS X&lt;/h4&gt;
&lt;h5&gt;Panic coda&lt;/h5&gt;
&lt;p&gt;&lt;strong&gt;Configuration par défaut&lt;/strong&gt;&lt;br/&gt;Coda&amp;#160;› Preferences&amp;#160;› Editor&amp;#160;› Default File Encoding&amp;#160;› Unicode (UTF-8)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Définition par fichier&lt;/strong&gt;&lt;br/&gt;Text&amp;#160;› Encoding&amp;#160;› Unicode (UTF-8)&lt;/p&gt;
&lt;h5&gt;TextEdit&lt;/h5&gt;
&lt;p&gt;&lt;strong&gt;Configuration par défaut&lt;/strong&gt;&lt;br/&gt;TextEdit&amp;#160;› Préférences&amp;#160;› Ouverture et enregistrement&amp;#160;› Encodage&amp;#160;› Unicode (UTF-8)&lt;/p&gt;
&lt;h4&gt;Ubuntu&lt;/h4&gt;
&lt;h5&gt;Bluefish&lt;/h5&gt;
&lt;p&gt;&lt;strong&gt;Définition par fichier&lt;/strong&gt;&lt;br/&gt;Document&amp;#160;› encodage des caractères&amp;#160;› UTF-8&lt;/p&gt;
&lt;h4&gt;Multi OS&lt;/h4&gt;
&lt;h5&gt;Aptana Studio 3&lt;/h5&gt;
&lt;p&gt;&lt;strong&gt;Configuration par défaut&lt;/strong&gt;&lt;br/&gt;Aptana Studio 3&amp;#160;› Preferences&amp;#160;› General&amp;#160;› Workspace&amp;#160;› Text file encoding&amp;#160;› Other&amp;#160;› UTF-8&lt;/p&gt;
&lt;h3&gt;Données externes&lt;/h3&gt;
&lt;p&gt;Il peut arriver que vous récupériez vos données depuis d&amp;#8217;autres services et/ou de vos utilisateurs (formulaires). Il vous faudra vous assurer qu&amp;#8217;elles soient bien en UTF-8.&lt;/p&gt;
&lt;pre&gt;&lt;code class="php"&gt;function toUtf8($string) {&lt;br/&gt;    if ('UTF-8' != $encoding = mb_detect_encoding($string, mb_detect_order(), true)) {&lt;br/&gt;        if($encoding) {&lt;br/&gt;            $string = mb_convert_encoding($string, 'UTF-8', $encoding);&lt;br/&gt;        } else {&lt;br/&gt;            $string = mb_convert_encoding($string, 'UTF-8');&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;    return $string;&lt;br/&gt;}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cette fonction vérifie qu&amp;#8217;une chaine de caractères est bien encodée en UTF-8 et, si tel n&amp;#8217;est pas le cas, la convertie. Elle retournera donc toujours une chaîne encodée en UTF-8.&lt;/p&gt;
&lt;p&gt;Pour les formulaires html il existe l&amp;#8217;attribut &amp;#8220;&lt;strong&gt;&lt;em&gt;accept-charset&lt;/em&gt;&lt;/strong&gt;&amp;#8221;, cependant, comme tout ce qui provient du client est modifiable, je vous &lt;strong&gt;déconseille son utilisation&lt;/strong&gt;. Préférez plutôt le passage des valeurs saisies à la fonction ci-dessus, cela demandera plus de ressource server mais vous serez sûr que les données reçues soient bien en UTF-8.&lt;/p&gt;
&lt;h2&gt;Manipuler vos données UTF-8&lt;/h2&gt;
&lt;p&gt;Les fonctions classiques de manipulation de string, tel que strlen, ne sont pas faites pour fonctionner avec de l&amp;#8217;UTF-8. En remplacement, &lt;strong&gt;nous utiliseront &lt;a href="http://php.net/manual/fr/ref.mbstring.php" title="Fonctions sur les chaînes de caractères multi-octets"&gt;mbstring&lt;/a&gt;&lt;/strong&gt;. Un petit exemple rapide&amp;#160;:&lt;/p&gt;
&lt;pre&gt;&lt;code class="php"&gt;echo strlen('Ç');               // Affiche 2&lt;br/&gt;echo mb_strlen('Ç', 'UTF-8');   // Affiche 1&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Comme vous pouvez le constater, strlen est dans les choux et ce parcequ&amp;#8217;elle n&amp;#8217;est pas faite pour manipuler des caractères encodés sur plusieurs octets. mb_strlen elle, peut manipuler des chaines sous différents encodages, spécifié à l&amp;#8217;aide du second paramètre. Il en est de même de toutes les fonctions mbstring.&lt;/p&gt;
&lt;p&gt;Pour plus de confort et, parceque nous avons décider de n&amp;#8217;utiliser que de l&amp;#8217;UTF-8, nous allons en faire notre encodage par défaut. Vous pouvez le faire dans votre php.ini, httpd.conf, .htaccess ou script php. Ici nous allons le définir dans notre fichier .htaccess&amp;#160;:&lt;/p&gt;
&lt;pre&gt;&lt;code class="apache"&gt;&amp;lt;IfModule mod_php5.c&amp;gt;&lt;br/&gt;    php_value mbstring.detect_order         "auto"&lt;br/&gt;    php_value mbstring.http_output          "UTF-8"&lt;br/&gt;    php_value mbstring.internal_encoding    "UTF-8"&lt;br/&gt;    php_value mbstring.language             "uni"&lt;br/&gt;&amp;lt;/IfModule&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Notez que nous prenons soin de vérifier la présence du module php. Plus exactement, ici nous testons la présence du module php5 mais vous pourriez tout à fait remplacer &lt;em&gt;mod_php5.c&lt;/em&gt; par &lt;em&gt;mod_php4.c&lt;/em&gt; ou encore mettre deux blocs &lt;em&gt;ifModule&lt;/em&gt;, un pour chaque version de php dans le but d&amp;#8217;avoir un fichier .htaccess paré à toutes situations.&lt;/p&gt;
&lt;p&gt;Nous ajoutons ensuite une définition alternative dans notre script php au cas où php ne serait pas exécuté en tant que module apache&amp;#160;:&lt;/p&gt;
&lt;pre&gt;&lt;code class="php"&gt;if(mb_internal_encoding() !== 'UTF-8') {&lt;br/&gt;    mb_detect_order('auto');&lt;br/&gt;    mb_http_output('UTF-8');&lt;br/&gt;    mb_internal_encoding('UTF-8');&lt;br/&gt;    mb_language('uni');&lt;br/&gt;}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Maintenant, il n&amp;#8217;est plus nécessaire de spécifier l&amp;#8217;encodage lors de l&amp;#8217;utilisation de fonctions mbstring.&lt;/p&gt;
&lt;p&gt;Si vous utilisez les fonctions preg_replace, preg_match,… &lt;strong&gt;veillez à utiliser le pattern modifier &amp;#8220;u&amp;#8221;&lt;/strong&gt; (attention à la casse) pour que le pattern comme le sujet soient traités en UTF-8. mbstring n&amp;#8217;offrant que les fonctions ereg.&lt;/p&gt;
&lt;h2&gt;L&amp;#8217;affichage de vos données&lt;/h2&gt;
&lt;p&gt;Maintenant que vos données sont stockées dans le bon format il vous faut les afficher correctement. Pour se faire il va falloir spécifier le charset utilisé.&lt;/p&gt;
&lt;p&gt;Trois méthodes vont vous êtres expliquées. Voici l&amp;#8217;ordre de priorité d&amp;#8217;application du charset de celles-ci, de la plus prioritaire à la moins prioritaire&amp;#160;:&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;PHP&lt;/li&gt;
&lt;li&gt;Apache&lt;/li&gt;
&lt;li&gt;HTML&lt;/li&gt;
&lt;/ol&gt;&lt;h3&gt;Apache&lt;/h3&gt;
&lt;p&gt;Si vous faites le choix d&amp;#8217;utilisez exclusivement UTF-8, privilégiez autant que possible de définir le charset au niveau d&amp;#8217;apache. Cela vous assurera un charset défini pour tous vos scripts.&lt;/p&gt;
&lt;p&gt;Dans votre fichier httpd.conf ou dans un fichier .htaccess ajoutez/modifier l&amp;#8217;instruction suivante&amp;#160;:&lt;/p&gt;
&lt;pre&gt;&lt;code class="apache"&gt;AddDefaultCharset UTF-8&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;PHP&lt;/h3&gt;
&lt;p&gt;Si vous ne pouvez pas modifier la configuration d&amp;#8217;apache d&amp;#8217;une façon ou d&amp;#8217;une autre vous pouvez spécifier l&amp;#8217;encodage de cette façon&amp;#160;:&lt;/p&gt;
&lt;pre&gt;&lt;code class="apache"&gt;header('Content-type: text/html; charset=UTF-8');&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Notez qu&amp;#8217;ici l&amp;#8217;on spécifie un type text/html mais vous pouvez le modifier si vous désirer envoyer tout autre type de contenu.&lt;/p&gt;
&lt;h3&gt;HTML&lt;/h3&gt;
&lt;p&gt;Vous pouvez enfin utiliser une balise meta&amp;#160;:&lt;/p&gt;
&lt;pre&gt;&lt;code class="html"&gt;&amp;lt;meta http-equiv="Content-type" content="text/html; charset=UTF-8"/&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Attention, en html5 la syntaxe change&amp;#160;:&lt;/p&gt;
&lt;pre&gt;&lt;code class="html"&gt;&amp;lt;meta charset="utf-8" /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Détecter et corriger les erreurs d&amp;#8217;encodage&lt;/h2&gt;
&lt;p&gt;Si vous rencontrez des caractères de ce type&amp;#160;:&lt;/p&gt;
&lt;p&gt;Ã€ÃÃ‚ÃƒÃ„Ã…Ã Ã¡Ã¢Ã£Ã¤Ã¥Ã’Ã“Ã”Ã•Ã–Ã˜Ã²Ã³Ã´ÃµÃ¶Ã¸ÃˆÃ‰ÃŠÃ‹Ã©Ã¨ÃªÃ«Ã‡Ã§ÃŒÃÃŽÃÃ¬Ã­Ã®Ã¯Ã™ÃšÃ›ÃœÃ¹ÃºÃ»Ã¼Ã¿Ã‘Ã±&lt;/p&gt;
&lt;p&gt;C&amp;#8217;est que vos données sont bien encodées en UTF-8 mais qu&amp;#8217;elles ne sont pas affichées comme tel. Vérifiez chaque point de la partie &amp;#8220;&lt;strong&gt;L&amp;#8217;affichage de vos données&lt;/strong&gt;&amp;#8221;&lt;/p&gt;
&lt;p&gt;Si vous rencontrez des &amp;#8220;�&amp;#8221; c&amp;#8217;est que vos données ne sont pas encodées en UTF-8. Dans ce cas, demandez-vous d&amp;#8217;où elles proviennent et veillez à ce que chaque point de la partie &amp;#8220;&lt;strong&gt;Les sources de vos données&lt;/strong&gt;&amp;#8221; qui s&amp;#8217;y rapportent soient bien respectés.&lt;/p&gt;</description><link>http://cahnory.tumblr.com/post/17108999879</link><guid>http://cahnory.tumblr.com/post/17108999879</guid><pubDate>Mon, 06 Feb 2012 14:06:00 +0100</pubDate><category>apache</category><category>html</category><category>php</category><category>utf-8</category><category>mysql</category><category>utf8</category></item><item><title>Centrage vertical et horizontal d'éléments de taille variable</title><description>&lt;p&gt;Décidément, le respect de la sémantique nous aura donné du fil à retordre. La balise &lt;em&gt;table&lt;/em&gt;, encore elle, permet le plus simplement du monde de centrer des éléments sur les deux axes. Le problème et que son usage se limite aux données tabulaires, exit donc son utilisation pour de la mise en page.&lt;/p&gt;
&lt;h2&gt;Demain tout ira mieux tu verras&lt;/h2&gt;
&lt;p&gt;Les navigateurs modernes (ne rigole pas, toi qui me lis du futur à travers ce flux d&amp;#8217;information qui pénètre directement ton cerveau) nous ont apporté le &lt;em&gt;display&lt;/em&gt; &lt;em&gt;table&lt;/em&gt; et ses variantes. En imbriquant un élément en &lt;em&gt;display &lt;strong&gt;table-cell&lt;/strong&gt;&lt;/em&gt; dans un élément en &lt;em&gt;display &lt;strong&gt;table&lt;/strong&gt;&lt;/em&gt;, nous allons pouvoir aligner verticalement un élément &lt;em&gt;inline&lt;/em&gt; ou, ici, &lt;strong&gt;&lt;em&gt;inline-block&lt;/em&gt;&lt;/strong&gt;&amp;#160;:&lt;/p&gt;
&lt;pre&gt;&lt;code class="html"&gt;&amp;lt;div class="layout"&amp;gt;&lt;br/&gt;    &amp;lt;div class="layout-wrapper"&amp;gt;&lt;br/&gt;        &amp;lt;div class="layout-content"&amp;gt;&lt;br/&gt;            Vous êtes&amp;lt;br /&amp;gt;&lt;br/&gt;            centré !&lt;br/&gt;        &amp;lt;/div&amp;gt;&lt;br/&gt;    &amp;lt;/div&amp;gt;&lt;br/&gt;&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class="css"&gt;html, body {&lt;br/&gt;    height: 100%;&lt;br/&gt;    margin: 0;&lt;br/&gt;    width: 100%;&lt;br/&gt;}&lt;br/&gt;.layout {&lt;br/&gt;    display: table;&lt;br/&gt;    height: 100%;&lt;br/&gt;    overflow: hidden;&lt;br/&gt;    text-align: center;&lt;br/&gt;    width: 100%;&lt;br/&gt;}&lt;br/&gt;.layout-wrapper {&lt;br/&gt;    display: table-cell;&lt;br/&gt;    vertical-align: middle;&lt;br/&gt;    width: 100%;&lt;br/&gt;}&lt;br/&gt;.layout-content {&lt;br/&gt;    display: inline-block;&lt;br/&gt;    text-align: left; /* Retour à l'alignement classique, non nécessaire */&lt;br/&gt;}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Voilà ce que ça donne &lt;a href="http://dabblet.com/gist/1731918" title="Centrage horizontal et vertical  navigateurs modernes"&gt;en live&lt;/a&gt; (navigateur correcte exigé).&lt;/p&gt;
&lt;p&gt;Ici j&amp;#8217;applique des styles aux éléments html et body dans l&amp;#8217;unique but que le centrage vertical se fasse par rapport à la hauteur de la fenêtre mais vous pourriez tout à fait centrer par rapport à un autre élément ou encore, appliquer des dimensions fixes à &lt;em&gt;.layout&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Notez que si vous avez une meilleure idée pour le nom des différentes classes vous pouvez me la faire savoir dans les commentaires ;).&lt;/p&gt;
&lt;p&gt;Pour ce qui est des navigateurs modernes, nous avons terminé. Si vous ne vous souciez pas d&amp;#8217;Internet Explorer lte 7 et autre Firefox lt 3, vous pourriez très bien vous contentez du code ci-dessus.&lt;/p&gt;
&lt;h2&gt;Jurassic Explorer&lt;/h2&gt;
&lt;p&gt;Sur Internet Explorer lte 7 nous allons pouvoir nous approcher de ce résultat. En fait la seule différence que nous allons constater survient lorsque le contenu est plus grand (height) que le conteneur. Quand cela se produit, notre contenu sortira du conteneur par le haut ce qui est disgracieux, voir très embêtant quand ce conteneur est le body et qu&amp;#8217;il est donc impossible de voir ce qui dépasse. Je vais sauter les explications tant ce workaround se base sur des spécificités d&amp;#8217;Internet Explorer&amp;#160;:&lt;/p&gt;
&lt;pre&gt;&lt;code class="css"&gt;html, body {&lt;br/&gt;    height: 100%;&lt;br/&gt;    margin: 0;&lt;br/&gt;    width: 100%;&lt;br/&gt;}&lt;br/&gt;.layout {&lt;br/&gt;    display: table;&lt;br/&gt;    height: 100%;&lt;br/&gt;    overflow: hidden;&lt;br/&gt;    text-align: center;&lt;br/&gt;    width: 100%;&lt;br/&gt;    *position: relative;&lt;br/&gt;}&lt;br/&gt;.layout-wrapper {&lt;br/&gt;    display: table-cell;&lt;br/&gt;    vertical-align: middle;&lt;br/&gt;    width: 100%;&lt;br/&gt;    *left: 0;&lt;br/&gt;    *position: absolute;&lt;br/&gt;    *top: 50%;&lt;br/&gt;}&lt;br/&gt;.layout-content {&lt;br/&gt;    display: inline-block;&lt;br/&gt;    text-align: left; /* Retour à l'alignement classique, non nécessaire */&lt;br/&gt;    *display: inline;&lt;br/&gt;    *left: 0;&lt;br/&gt;    *position: relative;&lt;br/&gt;    *zoom: 1;&lt;br/&gt;    *top: -50%;&lt;br/&gt;}&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Firefox wrap toujours deux fois&lt;/h2&gt;
&lt;p&gt;Comme l&amp;#8217;on peut le voir &lt;a href="https://developer.mozilla.org/en/CSS/display#compat-desktop" title="Display  Browser compatibility"&gt;ici&lt;/a&gt;, la valeur de display &lt;em&gt;inline-block&lt;/em&gt; n&amp;#8217;est supportée qu&amp;#8217;à partir de Firefox 3. Avant cela, on doit user de &lt;a href="https://developer.mozilla.org/en/CSS_Reference/Mozilla_Extensions#display" title="Mozilla CSS Extensions  display"&gt;propriétés vendeurs&lt;/a&gt; et celle qui dans le cas présent s&amp;#8217;y prette le mieux et &lt;em&gt;-moz-inline-stack&lt;/em&gt;. Le souci avec celle-ci c&amp;#8217;est qu&amp;#8217;elle empile, les unes sur les autres, toutes les lignes de l&amp;#8217;élément (d&amp;#8217;où son nom). Pour y remédier nous allons devoir ajouter un nouveau wrapper en &lt;em&gt;display block&lt;/em&gt; à l&amp;#8217;intérieur de notre élément &lt;em&gt;.content&lt;/em&gt;. Un simple div fera l&amp;#8217;affaire.&lt;/p&gt;
&lt;pre&gt;&lt;code class="html"&gt;&amp;lt;div class="layout"&amp;gt;&lt;br/&gt;    &amp;lt;div class="layout-wrapper"&amp;gt;&lt;br/&gt;        &amp;lt;div class="layout-content"&amp;gt;&lt;br/&gt;            &amp;lt;div&amp;gt;&lt;br/&gt;                Vous êtes&amp;lt;br /&amp;gt;&lt;br/&gt;                centré !&lt;br/&gt;            &amp;lt;/div&amp;gt;&lt;br/&gt;        &amp;lt;/div&amp;gt;&lt;br/&gt;    &amp;lt;/div&amp;gt;&lt;br/&gt;&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class="css"&gt;html, body {&lt;br/&gt;    height: 100%;&lt;br/&gt;    margin: 0;&lt;br/&gt;    width: 100%;&lt;br/&gt;}&lt;br/&gt;.layout {&lt;br/&gt;    display: table;&lt;br/&gt;    height: 100%;&lt;br/&gt;    overflow: hidden;&lt;br/&gt;    text-align: center;&lt;br/&gt;    width: 100%;&lt;br/&gt;    *position: relative;&lt;br/&gt;}&lt;br/&gt;.layout-wrapper {&lt;br/&gt;    display: table-cell;&lt;br/&gt;    vertical-align: middle;&lt;br/&gt;    width: 100%;&lt;br/&gt;    *left: 0;&lt;br/&gt;    *position: absolute;&lt;br/&gt;    *top: 50%;&lt;br/&gt;}&lt;br/&gt;.layout-content {&lt;br/&gt;    display: -moz-inline-stack;&lt;br/&gt;    display: inline-block;&lt;br/&gt;    text-align: left; /* Retour à l'alignement classique, non nécessaire */&lt;br/&gt;    *display: inline;&lt;br/&gt;    *left: 0;&lt;br/&gt;    *position: relative;&lt;br/&gt;    *zoom: 1;&lt;br/&gt;    *top: -50%;&lt;br/&gt;}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Là nous avons fini et nous pouvons &lt;a href="http://dabblet.com/gist/1732349" title="Centrage horizontal et vertical  universel"&gt;admirer le résultat&lt;/a&gt;.&lt;/p&gt;</description><link>http://cahnory.tumblr.com/post/16988618236</link><guid>http://cahnory.tumblr.com/post/16988618236</guid><pubDate>Fri, 03 Feb 2012 21:45:40 +0100</pubDate><category>css</category><category>centrage</category><category>alignement</category><category>horizontal</category><category>vertical</category></item><item><title>Clear float, technique définitive</title><description>&lt;p&gt;Lorsqu&amp;#8217;on aborde la propriété clear, chacun a sa méthode. Il en existe une ribambelle et toutes nécessitent un élément html supplémentaire. Là il existe deux possibilités&amp;#160;:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Un clearer, un élément ajouté à la suite du dernier floatant.&lt;/li&gt;
&lt;li&gt;Un contener, un élément parent à tous les floatants.&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;Quel élément&amp;#160;?&lt;/h2&gt;
&lt;p&gt;Ma préférence va au contener pour plusieurs raisons&amp;#160;:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Le clearer est souvent ajouté au html dans ce seul et unique but là où le contener est bien souvent présent naturellement (le ul des li en est le parfait exemple).&lt;/li&gt;
&lt;li&gt;On pourra appliquer au contener backgrounds, borders et autres effets. C&amp;#8217;est d&amp;#8217;ailleurs bien souvent pour que ces effets s&amp;#8217;affichent correctement que l&amp;#8217;on ajoute un clearer (inutile donc).&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;La technique la plus répandue avec un contener consiste à définir la propriété &lt;em&gt;overflow&lt;/em&gt; en&lt;em&gt; hidden&lt;/em&gt; (il me semble que ça fonctionne également avec &lt;em&gt;auto&lt;/em&gt;). L&amp;#8217;inconvénient de cette méthode est que l&amp;#8217;on n&amp;#8217;a pas forcément envie de définir cette propriété ainsi.&lt;/p&gt;
&lt;h2&gt;::after&lt;/h2&gt;
&lt;p&gt;Une autre technique nécessite l&amp;#8217;utilisation du pseudo élément &lt;strong&gt;&lt;em&gt;::after&lt;/em&gt;&lt;/strong&gt;. Elle me semble peu répandue et pourtant elle fait des merveilles. Prenons par exemple ce code html&amp;#160;:&lt;/p&gt;
&lt;pre&gt;&lt;code class="html"&gt;&amp;lt;ul&amp;gt;&lt;br/&gt;    &amp;lt;li&amp;gt;Je float !&amp;lt;/li&amp;gt;&lt;br/&gt;    &amp;lt;li&amp;gt;Je float !&amp;lt;/li&amp;gt;&lt;br/&gt;    &amp;lt;li&amp;gt;Je float !&amp;lt;/li&amp;gt;&lt;br/&gt;&amp;lt;/ul&amp;gt;&lt;br/&gt;Je float plus… du con la joie ! y à pas de consigne pour ces bouteilles :D&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nous appliquons un &lt;em&gt;float: left&lt;/em&gt; aux li et nous utilisons &lt;strong&gt;&lt;em&gt;::after&lt;/em&gt;&lt;/strong&gt; pour appliquer le &lt;em&gt;clear&lt;/em&gt;&amp;#160;:&lt;/p&gt;
&lt;pre&gt;&lt;code class="css"&gt;li { float: left }&lt;br/&gt;ul:after {&lt;br/&gt;    clear: left;&lt;br/&gt;    content: ' '; /* Attention, c'est un espace insécable (alt+space) */&lt;br/&gt;    display: block;&lt;br/&gt;    height: 0;&lt;br/&gt;}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Je pense que c&amp;#8217;est parceque beaucoup se sont arrêtés là que cette technique est peu répandue. En effet si vous avez bien suivi, sous Internet Explorer lte 7, &lt;strong&gt;&lt;em&gt;::after&lt;/em&gt;&lt;/strong&gt; n&amp;#8217;est pas reconnu mais le workaround n&amp;#8217;est pourtant pas bien compliqué&amp;#160;:&lt;/p&gt;
&lt;pre&gt;&lt;code class="css"&gt;ul { *zoom: 1 }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ça on peut pas dire que je vous ai menti :).&lt;/p&gt;
&lt;h2&gt;On récapitule&lt;/h2&gt;
&lt;p&gt;Toujours avec notre &lt;em&gt;ul&lt;/em&gt; aux &lt;em&gt;li&lt;/em&gt; floatants, voici le code css complet&amp;#160;:&lt;/p&gt;
&lt;pre&gt;&lt;code class="css"&gt;li { float: left }&lt;br/&gt;ul { *zoom: 1 }&lt;br/&gt;ul:after {&lt;br/&gt;    clear: left;&lt;br/&gt;    content: ' '; /* Attention, c'est un espace insécable (alt+space) */&lt;br/&gt;    display: block;&lt;br/&gt;    height: 0;&lt;br/&gt;}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Et le  &lt;a href="http://dabblet.com/gist/1725112" title="Démonstration de la technique"&gt;résultat en live&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Le titre de ce bulletin est clair mais il faut tout de même être prudent avec ce genre d&amp;#8217;affirmation. J&amp;#8217;utilise très souvent cette technique et jusqu&amp;#8217;à présent, elle ne m&amp;#8217;a jamais fait défaut. Mais qui sait, dans une galaxie lointaine, très lointaine…&lt;/p&gt;</description><link>http://cahnory.tumblr.com/post/16929111653</link><guid>http://cahnory.tumblr.com/post/16929111653</guid><pubDate>Thu, 02 Feb 2012 20:02:00 +0100</pubDate><category>css</category><category>float</category><category>clear</category></item><item><title>Apparaître comme auteur identifié sur google</title><description>&lt;p&gt;Vous aurez peut-être remarqué lors de vos recherches sur google que certains résultats étaient associés à un profil google+. On y trouve photo, nom et prénom, le tout lié au profil correspondant. Rien de mystérieux à ça, tout est expliqué ici : &lt;a href="http://support.google.com/webmasters/bin/answer.py?hl=fr&amp;amp;answer=1408986" title="Informations relatives à l'auteur dans les résultats de recherche"&gt;&lt;a href="http://support.google.com/webmasters/bin/answer.py?hl=fr&amp;amp;answer=1408986"&gt;http://support.google.com/webmasters/bin/answer.py?hl=fr&amp;amp;answer=1408986&lt;/a&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Tout&amp;#160;?&lt;/h2&gt;
&lt;p&gt;Et bien en réalité pas vraiment. Google vous décrit deux étapes clés&amp;#160;:&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;Ajouter votre site à votre profil google+&lt;/li&gt;
&lt;li&gt;Placer sur vos pages un lien vers votre profil avec le paramètre d&amp;#8217;url rel=author
&lt;pre&gt;&lt;code class="html"&gt;&amp;lt;a href="https://plus.google.com/113747396260316171527?rel=author"&amp;gt;G+&amp;lt;/a&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;Mais, selon la cible de vos pages, vous n&amp;#8217;aurez peut-être pas envie que ce lien soit visible. Vous pourriez très bien le masquer à l&amp;#8217;aide de css… ou alors vous pourriez utiliser cette petite astuce qui, testée &amp;#8220;dans le doute&amp;#8221;, s&amp;#8217;est révélée efficace&amp;#160;:&lt;/p&gt;
&lt;pre&gt;&lt;code class="html"&gt;&amp;lt;link rel="author" href="https://plus.google.com/113747396260316171527?rel=author" /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Google en tient compte mais n&amp;#8217;en fait pas la promotion ;)&lt;/p&gt;</description><link>http://cahnory.tumblr.com/post/16879985949</link><guid>http://cahnory.tumblr.com/post/16879985949</guid><pubDate>Wed, 01 Feb 2012 22:25:00 +0100</pubDate><category>astuce</category><category>google</category><category>author</category></item><item><title>Un table menu sans… table</title><description>&lt;div&gt;
&lt;p&gt;À l&amp;#8217;époque où l&amp;#8217;on pouvait user et abuser des tableaux sans se faire taper sur les doigts (mais tuant une fée de la sémantique quelque part dans le monde), il était aisé d&amp;#8217;avoir un menu dont les boutons se répartissaient la place disponible. En fait il n&amp;#8217;y avait même rien à faire.&lt;/p&gt;
&lt;p&gt;Oui mais voilà entre temps on apprit qu&amp;#8217;une balise &lt;em&gt;table&lt;/em&gt; ne servait qu&amp;#8217;à afficher des tableaux. Dit comme ça, ça peut paraître évident mais en même temps, une balise &lt;em&gt;q&lt;/em&gt; ne sert pas à afficher des… bref, maintenant ce n&amp;#8217;est plus aussi simple. La bonne nouvelle c&amp;#8217;est que ce n&amp;#8217;est pas bien dur non plus&amp;#160;!&lt;/p&gt;
&lt;h2&gt;Un peu de css&lt;/h2&gt;
&lt;p&gt;Finalement, ce que nous voulons c&amp;#8217;est que notre menu s&amp;#8217;affiche comme un tableau. Encore une fois ça va paraître évident car il suffira d&amp;#8217;user de la propriété &lt;strong&gt;&lt;em&gt;display&lt;/em&gt;&lt;/strong&gt; et de ses valeurs &lt;strong&gt;&lt;em&gt;table&lt;/em&gt;&lt;/strong&gt; et &lt;strong&gt;&lt;em&gt;table-cell&lt;/em&gt;&lt;/strong&gt; (non, table-pepper n&amp;#8217;existe pas).&lt;/p&gt;
&lt;pre&gt;&lt;code class="css"&gt;.menu {&lt;br/&gt;    display: table;&lt;br/&gt;    width: 100%;&lt;br/&gt;}&lt;br/&gt;.menu-item {&lt;br/&gt;    display: table-cell;&lt;br/&gt;}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Un petit tour sur &lt;a href="http://www.quirksmode.org/css/display.html" title="The display declaration"&gt;quirksmode&lt;/a&gt; et nous nous rendons vite compte qu&amp;#8217;Internet Explorer lte 7 ne supporte pas ces propriétés. On pourrait se dire que la paléontologie n&amp;#8217;a rien à voir avec l&amp;#8217;intégration web mais nous allons tout de même veiller à obtenir un affichage correcte. Ici j&amp;#8217;utilise des hacks css mais il est tout à fait possible de cibler ce dinosaure autrement.&lt;/p&gt;
&lt;pre&gt;&lt;code class="css"&gt;.menu {&lt;br/&gt;    display: table;&lt;br/&gt;    width: 100%;&lt;br/&gt;    *zoom: 1;&lt;br/&gt;}&lt;br/&gt;.menu-item {&lt;br/&gt;    display: table-cell;&lt;br/&gt;    *float: left;&lt;br/&gt;}&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;And now ladies and gentleman&lt;/h2&gt;
&lt;p&gt;Quelque css bling bling plus tard voilà le résultat obtenu pour Internet Explorer lte 7 et les autres&amp;#160;:&lt;/p&gt;
&lt;p&gt;&lt;img align="middle" alt="Résultat final" height="133" src="http://img24.imageshack.us/img24/5003/menuxg.png" width="728"/&gt;&lt;/p&gt;
&lt;p&gt;Et la démo live sur &lt;a href="http://dabblet.com/gist/1718808" title="Résultat en live"&gt;dabblet&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Avant de clôturer ce post je me dois de signaler quelque petites incertitudes. Je n&amp;#8217;ai pas sous la main de version de Safari lt 4 et il se pourrait qu&amp;#8217;il nécessite une petite retouche.&lt;/p&gt;
&lt;/div&gt;</description><link>http://cahnory.tumblr.com/post/16874844567</link><guid>http://cahnory.tumblr.com/post/16874844567</guid><pubDate>Wed, 01 Feb 2012 20:43:00 +0100</pubDate><category>css</category><category>menu</category><category>table</category></item></channel></rss>
