<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://blogs.medialibs.com/sb.php/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>Simon Bonaventure</title>
  <link>http://blogs.medialibs.com/sb.php/</link>
  <description></description>
  <language>fr</language>
  <copyright>Medialibs</copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>DotClear</generator>
  
    
  <item>
    <title>Réaliser des aides pour les formulaires avec CSS et Javascript</title>
    <link>http://blogs.medialibs.com/sb.php/post/2007/04/30/Realiser-des-aides-pour-les-formulaires-avec-CSS-et-Javascript</link>
    <guid isPermaLink="false">urn:md5:fe0c55835ee4147a889cdc96f545e3de</guid>
    <pubDate>Mon, 30 Apr 2007 16:43:00 +0200</pubDate>
    <dc:creator>Simon Bonaventure</dc:creator>
        <category>css</category><category>dom</category><category>effets</category><category>formulaire</category><category>intégration</category><category>javascript</category>    
    <description>
    Depuis la version 0.14a d'e-majne, vous avez certainement rencontré une
nouveauté sur les formulaires. Lors de l'ajout de champs de formulaires, il est
possible de remplir un nouveau champ, le champ d'information :  On peut se servir de ce champ pour compléter
le libellé du champ afin de donner plus d'informations sur le champ à
compléter. Nous allons voir comment gérer l'affichage de ces champs de façon un
peu moins brut, voir un peu tendance... Attention, ce billet est relativement
long, donc pour ceux qui n'ont pas trop le temps voici le résultat final
voir le résultat final        </description>
    <content:encoded>&lt;p&gt;Depuis la version 0.14a d'e-majne, vous avez certainement rencontré une
nouveauté sur les formulaires. Lors de l'ajout de champs de formulaires, il est
possible de remplir un nouveau champ, le champ d'information : &lt;img src=&quot;http://blogs.medialibs.com/public/s.bonaventure/informations.png&quot; alt=&quot;informations.png&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt; On peut se servir de ce champ pour compléter
le libellé du champ afin de donner plus d'informations sur le champ à
compléter. Nous allons voir comment gérer l'affichage de ces champs de façon un
peu moins brut, voir &lt;a href=&quot;http://www.askthecssguy.com/2007/03/form_field_hints_with_css_and.html&quot; hreflang=&quot;en&quot;&gt;un peu tendance&lt;/a&gt;... Attention, ce billet est relativement
long, donc pour ceux qui n'ont pas trop le temps voici le résultat final
&lt;a href=&quot;http://communaute.medialibs.com/images/divers/form.html&quot; hreflang=&quot;fr&quot; title=&quot;voir le résultat final&quot;&gt;voir le résultat final&lt;/a&gt;&lt;/p&gt;    &lt;h2&gt;Le XHTML et le CSS :&lt;/h2&gt;
&lt;p&gt;Tout d'abord, il va falloir modifier vos templates si vous voulez pouvoir
remonter ce champ de nouveauté pour qu'au niveau du HTML, cela nous donne
quelque chose comme cela :&lt;/p&gt;
&lt;pre&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;
        &amp;lt;label for=&amp;quot;libelleid&amp;quot;&amp;gt;
                libelle
                &amp;lt;span class=&amp;quot;obligatory&amp;quot;&amp;gt;*&amp;lt;/span&amp;gt; :
        &amp;lt;/label&amp;gt;
        &amp;lt;span&amp;gt;
                &amp;lt;input name=&amp;quot;libelle&amp;quot; id=&amp;quot;libelleid&amp;quot; type=&amp;quot;text&amp;quot;&amp;gt;
                &amp;lt;span class=&amp;quot;aide&amp;quot;&amp;gt;
                        &amp;lt;p&amp;gt;
                        voici mon champ d'information
                        &amp;lt;/p&amp;gt;
                &amp;lt;/span&amp;gt;
        &amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Ce qui impose pour le template creator_form.html de rajouter cet élément à
la place des champs de formulaire :&lt;/p&gt;
&lt;pre&gt;
&amp;lt;span mXattribut=&amp;quot;class:error2&amp;quot;&amp;gt;
        &amp;lt;mx:text id=&amp;quot;fields_input&amp;quot;/&amp;gt;
        &amp;lt;mx:bloc id=&amp;quot;additionnals_informations&amp;quot;&amp;gt;
                &amp;lt;span class=&amp;quot;aide&amp;quot;&amp;gt;
                        &amp;lt;mx:text id=&amp;quot;additionnals_informations&amp;quot; /&amp;gt;
                &amp;lt;/span&amp;gt;
        &amp;lt;/mx:bloc id=&amp;quot;additionnals_informations&amp;quot;&amp;gt;
&amp;lt;/span&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Si maintenant on appliquait un peu de CSS afin de rendre tout ça un peu plus
propre.&lt;/p&gt;
&lt;pre&gt;
body{
        font-family: Verdana, Arial, Helvetica, sans-serif;
        font-size:65%;
}
*{
        margin:0;
        padding:0;
}
form{
        width:600px;
}
fieldset{
        border: 1px solid #757575;
        margin:10px;
        padding:5px;
}
legend{
        color:#757575;
        font-size:1.1em;
        font-weight: bold;
        padding:0 5px;
}
.row{
        clear:both;
        margin: 5px;
        padding: 5px;
        position:relative;
}
label{
        float:left;
        width:170px;
}
input, select, textarea{
        border: 1px solid #999999;
        text-align:left!important;
        width: auto;
}
&lt;/pre&gt;
&lt;p&gt;Si maintenant on applique un style à nos aides, voici ce que cela donne. On
pourra remarquer que les aides sur les champs de formulaires sont masqués par
défaut à l'aide d'un &lt;code&gt;display:none;&lt;/code&gt;, car nous allons afficher ces
aides uniquement lorsque l'internaute aura placé sa souris dans le champs
(focus).&lt;/p&gt;
&lt;pre&gt;
.aide {
        display:none;
        width: 191px;
        z-index:800;
        margin:-5px 0 0 15px;
        position:absolute;
        background:url(/common_images/skin001/form_aide.gif) bottom right no-repeat;
}
.aide p{
        margin:0;
        padding:10px 12px 10px 18px;
        background:url(/common_images/skin001/pointer_form.gif) top right no-repeat;
}
&lt;/pre&gt;
&lt;h2&gt;Le Javascript :&lt;/h2&gt;
&lt;p&gt;On va maintenant en javascript parser notre page afin de trouver tout les
champs de formulaire de type input, et pour chacun d'entre eux, nous allons
réagir au focus en affichant l'aide et enlever cette aide lorsque le curser de
la souris ne se trouve plus dans mon champ de formulaire (onblur).&lt;/p&gt;
&lt;pre&gt;
function prepareInputsForHints() {
        var inputs = document.getElementsByTagName(&amp;quot;input&amp;quot;);
        for (var i=0; i&amp;lt;inputs.length; i++){
                inputs[i].onfocus = function () {
                        if(this.parentNode.getElementsByTagName(&amp;quot;span&amp;quot;).length&amp;gt;0){
                                this.parentNode.getElementsByTagName(&amp;quot;span&amp;quot;)[0].style.display = &amp;quot;inline&amp;quot;;
                        }
                }
                inputs[i].onblur = function () {
                        if(this.parentNode.getElementsByTagName(&amp;quot;span&amp;quot;).length&amp;gt;0){
                                this.parentNode.getElementsByTagName(&amp;quot;span&amp;quot;)[0].style.display = &amp;quot;none&amp;quot;;
                        }
                }
        }
}
&lt;/pre&gt;
&lt;p&gt;Il va falloir faire exactement la même manipulation pour les champs de type
select (liste déroulante) et textarea (texte multilignes), juste ici aucun
soucis, on change les input par les champs de formulaire correspondant.
Malheureusement, avec e-majine il existe un peu plus que ces champs de
formulaire, il faut aussi prévoir l'affichage de mes champs de formulaire de
type input radio et case à cocher qui ont une structure XHTML différente que
des champs de formulaire normaux, donc il va falloir gérer des conditions et un
fonctionnement différent de ce script. Et puis il y a aussi le soucis pour les
champs de formulaire de type file, pour lesquelles la réaction au comportement
focus se fait sur le bouton parcourir, ce qui en sera visible que pour les
utilisateur qui naviguent à l'aide de la touche tabulation, donc pour ces
champs de type fichier, l'affichage de l'aide se fera au survol.&lt;br /&gt;
Je vous fait grâce du fonctionnement de ce script, pour les plus curieux, tout
se trouve dans le ficher à télécharger ci-dessous.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blogs.medialibs.com/public/s.bonaventure/prepareInputsForHintsSimple.js.zip&quot; hreflang=&quot;fr&quot; title=&quot;attention fichier zippé&quot;&gt;Télécharger la première version du
script&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Un peu d'animation avec tout ça :&lt;/h2&gt;
&lt;p&gt;Maintenant, si on jouait avec des effets à la sauce 2.0, jouer d'accord mais
en toute légèetré d'abbord, voici donc une librairie qui regroupe juste des
effets graphique pour seulement 4ko, &lt;a href=&quot;http://simplejs.bleebot.com/&quot; hreflang=&quot;en&quot; title=&quot;simple.js&quot;&gt;simple.js&lt;/a&gt;. Parmis tout les effets que
propose cette librairie javascript, il y en a un qui m'intéresse tout
particulièrement c'est &lt;em&gt;$opacity&lt;/em&gt; qui va me permettre d'afficher l'aide
nom seulement dans la bulle grâce à mes styles, mais aussi en fondu, il faut
donc tout d'abord faire appel à cette librairie :&lt;/p&gt;
&lt;pre&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;/common_scripts/simple.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Lorsqu'on regarde la documentation de cette librairie javascript pour cette
fonction, il est écrit :&lt;/p&gt;
&lt;pre&gt;
$opacity(id, opacStart, opacEnd, millisec)
&lt;/pre&gt;
&lt;p&gt;On remarque donc que cette fonction s'applique à un identifiant, avec une
opacité de départ et de fin, et une durée en millisecondes entre les deux
opacités. Le soucis c'est qu'avec e-majine, nous n'avons pas d'identifiant sur
les balises &lt;code&gt;span&lt;/code&gt; qui entourent nos aides, pas de soucis, grâce au
javascript et surtout du DOM, nous allons recréer ces identifiants.&lt;/p&gt;
&lt;pre&gt;
var identifant = this.parentNode.getElementsByTagName(&amp;quot;span&amp;quot;)[0].setAttribute(&amp;quot;id&amp;quot;, this.id+'aide');
&lt;/pre&gt;
&lt;p&gt;Et nous allons donc pouvoir appliquer la fonction qui gère l'opacité&lt;/p&gt;
&lt;pre&gt;
$opacity(this.id+'aide', 0, 100, 1500);
&lt;/pre&gt;
&lt;p&gt;Ce qui nous donne au final :&lt;/p&gt;
&lt;pre&gt;
inputs[i].onfocus = function () {
        if(this.parentNode.getElementsByTagName(&amp;quot;span&amp;quot;).length&amp;gt;0){
                this.parentNode.getElementsByTagName(&amp;quot;span&amp;quot;)[0].style.display = &amp;quot;inline&amp;quot;;
                var identifant = this.parentNode.getElementsByTagName(&amp;quot;span&amp;quot;)[0].setAttribute(&amp;quot;id&amp;quot;, this.id+'aide');
                $opacity(this.id+'aide', 0, 100, 1500);
                return false;
        }
}
inputs[i].onblur = function () {
        if(this.parentNode.getElementsByTagName(&amp;quot;span&amp;quot;).length&amp;gt;0){
                var identifant = this.parentNode.getElementsByTagName(&amp;quot;span&amp;quot;)[0].setAttribute(&amp;quot;id&amp;quot;, this.id+'aide');
                $opacity(this.id+'aide', 100, 0, 1500);
                this.parentNode.getElementsByTagName(&amp;quot;span&amp;quot;)[0].style.display = &amp;quot;none&amp;quot;;
                return false;
        }
}
&lt;/pre&gt;
&lt;p&gt;Attention, il est important de remarquer qu'à la réaction sur le
&lt;code&gt;onblur&lt;/code&gt;, je repasse l'opacité à 0, sinon lorsqu'on clique deux fois
sur un même élément de formulaire, la gestion de l'opacité ne sera pas
bonne.&lt;/p&gt;
&lt;h2&gt;Et l'accessibilité dans tout ça&lt;/h2&gt;
&lt;p&gt;Exact, comment font les utilisateurs ne disposant pas de javascript pour
avoir accès à ces champs d'aide dans les formulaires. Et bien plutôt que
d'appliquer les styles (avec un style &lt;code&gt;display:none;&lt;/code&gt;) à ces champs
pour tout les utilisateurs, je vais insérer ces styles la via javascript.&lt;/p&gt;
&lt;pre&gt;
document.write('&amp;lt;style type=&amp;quot;text/css&amp;quot;&amp;gt;.aide {filter:Alpha(opacity=0); -moz-opacity:0; opacity:0;display:inline;width: 191px;z-index:800;margin:-5px 0 0 15px;position:absolute;background:url(/common_images/skin001/form_aide.gif) bottom right no-repeat;}.aide p{margin:0;padding:10px 12px 10px 18px;background:url(/common_images/skin001/pointer_form.gif) top right no-repeat;}&amp;lt;/style&amp;gt;');
&lt;/pre&gt;
&lt;p&gt;Désormais, il ne reste plus qu'a intégrer ces deux fichiers javascript&lt;/p&gt;
&lt;pre&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;/common_scripts/simple.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;/common_scripts/helpForm.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Voici le &lt;a href=&quot;http://communaute.medialibs.com/images/divers/form.html&quot; hreflang=&quot;fr&quot;&gt;résultat final.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blogs.medialibs.com/public/s.bonaventure/helpForm.zip&quot; hreflang=&quot;fr&quot;&gt;Télécharger les
deux scripts ainsi que le template et la feuille de style permettant de faire
fonctionner ces aides pour les formulaires.&lt;/a&gt;&lt;/p&gt;</content:encoded>
    
          <enclosure url="http://blogs.medialibs.com/public/s.bonaventure/helpForm.zip"
      length="4806" type="application/zip" />
    

    <comments>http://blogs.medialibs.com/sb.php/post/2007/04/30/Realiser-des-aides-pour-les-formulaires-avec-CSS-et-Javascript#comment-form</comments>
    <wfw:comment>http://blogs.medialibs.com/sb.php/post/2007/04/30/Realiser-des-aides-pour-les-formulaires-avec-CSS-et-Javascript#comment-form</wfw:comment>
    <wfw:commentRss>http://blogs.medialibs.com/sb.php/feed/rss2/comments/97</wfw:commentRss>
  </item>
    
  <item>
    <title>Comment faire un menu déroulant avec e-majine.</title>
    <link>http://blogs.medialibs.com/sb.php/post/2007/03/05/Comment-faire-un-menu-deroulant-avec-e-majine</link>
    <guid isPermaLink="false">urn:md5:34ba6ea9c9e63a3f0b5bb4f95c5ecdcc</guid>
    <pubDate>Mon, 05 Mar 2007 14:42:00 +0100</pubDate>
    <dc:creator>Simon Bonaventure</dc:creator>
        <category>css</category><category>intégration</category><category>jaavscript</category><category>menu</category><category>xhtml</category>    
    <description>
    Avec e-majine il est possible de réaliser des menus déroulant, c'est à dire
qu'au survol d'un item de menu, on va afficher tout les sous-niveau de cet
item.        </description>
    <content:encoded>&lt;p&gt;Avec e-majine il est possible de réaliser des menus déroulant, c'est à dire
qu'au survol d'un item de menu, on va afficher tout les sous-niveau de cet
item.&lt;/p&gt;    &lt;p&gt;Pour cela, il faut tout d'abord aller dans le factory puis dans votre projet
pour aller configurer la navigation, et ici, on pourra noter l'apparition d'une
nouvelle case à cocher « menu toujours déplié ». Cette dernière permet de
faire apparaître tout les niveaux et sous niveaux d'un menu, sans avoir besoin
de cliquer sur un item du menu pour faire apparaître les sous item de ce menu.
Mais aussi subtil que cela puisse paraître c'est grâce à cette case que l'on va
pouvoir réaliser notre menu déroulant. Il ne faut pas oublier de sélectionner
le type de menu vertical dans le factory, car un menu de type vertical est en
réalité un menu à listes imbriqués, ce qui est indispensable pour réaliser un
menu déroulant. &lt;img src=&quot;http://blogs.medialibs.com/public/s.bonaventure/menudepilie.png&quot; alt=&quot;menu depilié&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt; Voici de façon
simplifié la structure html dont on a besoin:&lt;/p&gt;
&lt;pre&gt;
&amp;lt;ul id=&amp;quot;first_level&amp;quot;&amp;gt;
      &amp;lt;li&amp;gt;
            &amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;libelle&amp;lt;/a&amp;gt;
            &amp;lt;ul class=&amp;quot;second_level&amp;quot;&amp;gt;
                  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;libelle&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
                  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;libelle&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
                  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;libelle&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
                  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;libelle&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
            &amp;lt;/ul&amp;gt;
      &amp;lt;/li&amp;gt;
      &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;libelle&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
      &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;libelle&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Toute première chose à faire, avant de commencer à donner une apparence à
notre menu, il faut masquer les seconds niveaux de notre arborescence. On va
éviter l'utilisation de la propriété &lt;code&gt;display:none;&lt;/code&gt; qui pose
quelques soucis avec certains navigateurs non graphiques.&lt;/p&gt;
&lt;pre&gt;
ul#first_level li ul{
      position:absolute;
      left:-999em;
}
&lt;/pre&gt;
&lt;p&gt;Une fois que cette étape est faite, il en reste plus qu'a habiller notre
menu, et à gérer la réaction au survol pour afficher les seconds niveaux de
liste qu'on a masqués auparavant. Pour faire cela, on va utiliser la pseudo
classe &lt;code&gt;:hover&lt;/code&gt; non pas sur un lien comme on a l'habitude de le
faire, mais sur nos éléments de liste (&lt;code&gt;&amp;lt;li&amp;gt;...&amp;lt;/li&amp;gt;&lt;/code&gt;),
jusqu'ici fantastique, cela fonctionne me direz-vous mais en plus &lt;strong&gt;cela
fonctionne sans javascript&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;
ul#first_level li:hover ul {
        left: auto;
}
&lt;/pre&gt;
&lt;p&gt;Malheureusement Internet Explorer ne comprend cette pseudo-classe
&lt;code&gt;:hover&lt;/code&gt; que sur les liens. C'est pourquoi nous avons avoir besoin
malgré tout de javascript pour IE.&lt;/p&gt;
&lt;pre&gt;
sfHover = function() {
        var sfEls = document.getElementById(&amp;quot;first_level&amp;quot;).getElementsByTagName(&amp;quot;LI&amp;quot;);
        for (var i=0; i&amp;lt;sfEls.length; i++) {
                sfEls[i].onmouseover=function() {
                        this.className+=&amp;quot; sfhover&amp;quot;;
                }
                sfEls[i].onmouseout=function() {
                        this.className=this.className.replace(new RegExp(&amp;quot; sfhover\\b&amp;quot;), &amp;quot;&amp;quot;);
                }
        }
}
if (window.attachEvent) window.attachEvent(&amp;quot;onload&amp;quot;, sfHover);
&lt;/pre&gt;
&lt;p&gt;En gros, ce code va appliquer la classe &amp;quot;sfhover&amp;quot; aux items (&amp;quot;li&amp;quot;) de la
liste (&amp;quot;ul&amp;quot;) nommée (&amp;quot;id&amp;quot;) &amp;quot;first_level&amp;quot;, lorsque ces items sont survolés par
la souris. Cette classe est ensuite retirée en utilisant une expression
régulière lorsque la souris quitte la zone. Donc, du coup le style
devient :&lt;/p&gt;
&lt;pre&gt;
ul#first_level li:hover ul, ul#first_level li.sfhover ul {
        left: auto;
}
&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;Cet article s'inspire de l'excellent pompage.net et de &lt;a href=&quot;http://pompage.net/pompe/deroulants/&quot; hreflang=&quot;fr&quot; title=&quot;les menus déroulant chez pompage&quot;&gt;son article sur les menus
déroulant&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;</content:encoded>
    
    

    <comments>http://blogs.medialibs.com/sb.php/post/2007/03/05/Comment-faire-un-menu-deroulant-avec-e-majine#comment-form</comments>
    <wfw:comment>http://blogs.medialibs.com/sb.php/post/2007/03/05/Comment-faire-un-menu-deroulant-avec-e-majine#comment-form</wfw:comment>
    <wfw:commentRss>http://blogs.medialibs.com/sb.php/feed/rss2/comments/91</wfw:commentRss>
  </item>
    
  <item>
    <title>Structure et mise en forme optimales d'une page XHTML ...</title>
    <link>http://blogs.medialibs.com/sb.php/post/2007/01/22/les-templates-e-majine-evoluent</link>
    <guid isPermaLink="false">urn:md5:77321dc467f811a4b2cd6d1de5311195</guid>
    <pubDate>Mon, 22 Jan 2007 12:00:00 +0100</pubDate>
    <dc:creator>Simon Bonaventure</dc:creator>
        <category>css</category><category>e-majine</category><category>intégration</category><category>xhtml</category>    
    <description>
    Etudions la manière d'organiser une page afin d'être le plus optimal
possible. Première étape, séparer le contenu de la mise en forme. Il faut se le
dire, le XHTML n'est pas un langage de mise en page, mais un langage de
description. Grâce au XHTML, il est possible d'organiser son contenu en
regroupant des éléments de contenu entre eux, et de leurs donner un sens
(sémantique) tout en le laissant accessible à tous. Le CSS est le langage qui
va nous permettre d'habiller, de mettre en forme, ces éléments. Voyons ensemble
comment organiser son XHTML et ses CSS afin d'avoir une page XHTML
optimale.        </description>
    <content:encoded>&lt;p&gt;Etudions la manière d'organiser une page afin d'être le plus optimal
possible. Première étape, séparer le contenu de la mise en forme. Il faut se le
dire, le XHTML n'est pas un langage de mise en page, mais un langage de
description. Grâce au XHTML, il est possible d'organiser son contenu en
regroupant des éléments de contenu entre eux, et de leurs donner un sens
(sémantique) tout en le laissant accessible à tous. Le CSS est le langage qui
va nous permettre d'habiller, de mettre en forme, ces éléments. Voyons ensemble
comment organiser son XHTML et ses CSS afin d'avoir une page XHTML
optimale.&lt;/p&gt;    &lt;h2&gt;La structure (XHTML)&lt;/h2&gt;
&lt;p&gt;Tout d'abord, il faut trouver la structure XHTML &lt;a href=&quot;http://blog.html.it/layoutgala/&quot; hreflang=&quot;en&quot;&gt;la plus souple possible&lt;/a&gt;,
dans laquelle nous avons peu de modification à faire du XHTML, tout en ayant la
possibilité, avec les feuilles de styles, de faire un maximum de mises en page
possibles.&lt;/p&gt;
&lt;p&gt;Au niveau de l'en-tête (&amp;lt;head&amp;gt;...&amp;lt;/head&amp;gt;), utilisons une DTD
XHTML 1.0 Strict. Nous choisissons cette DTD, car c'est la dernière norme en
vigueur du W3C. &lt;a href=&quot;http://openweb.eu.org/articles/specifier_langue/&quot; hreflang=&quot;fr&quot;&gt;Elle permet de spécifier la langue du document&lt;/a&gt; : pour
chacune des langues, chaque en-tête doit être différente.&lt;/p&gt;
&lt;p&gt;Dans le corps de la page (&amp;lt;body&amp;gt;...&amp;lt;/body&amp;gt;), nous retrouvons
tout d'abord un div#page contenant l'intégralité du site. Grâce à ce calque, il
est possible de restreindre le site en largeur, pourquoi pas en hauteur, et
puis de le centrer.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Le premier calque enfant du calque #page est #accessibility. On y retrouve
des liens d'évitement qui nous permettent d'accéder directement au menu, au
contenu,...(&lt;a href=&quot;http://css.alsacreations.com/Accessibilite-du-Web/Les-liens-d-evitement&quot; hreflang=&quot;fr&quot;&gt;cf Alsacréations - les liens d'évitements&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Un calque #banner, avec un titre reprenant un titre générique à votre
projet (pensez aux mots clefs ...) et un lien sur ce titre, permet de revenir à
la page d'accueil.&lt;/li&gt;
&lt;li&gt;Ensuite, le calque #wrapper, va lui contenir les calques #conteneur,
#leftbar et #rightbar. A l'aide de cet élément, nous pouvons dissocier
l'affichage des éléments de contenu (le menu, les outils et le contenu) qui
peuvent être contraints en largeur et centrés, de la bannière qui elle peut
s'adapter à la largeur de l'écran. Cet élément va également servir à mettre une
image de fond sous ces trois colonnes.&lt;/li&gt;
&lt;li&gt;Les calques #leftbar et #rightbar correspondent aux deux colonnes de la
page de base. A l'intérieur de ces deux colonnes, retrouvons un menu et des
outils par exemple.&lt;/li&gt;
&lt;li&gt;Le calque #footer donne la possibilité d'y mettre des liens pour revenir en
haut de page, ou bien pour faire un rappel/accéder à des rubriques importantes
de votre site.&lt;/li&gt;
&lt;li&gt;Et pour finir, un calque de signature #signature, dans lequel vous
retrouverez la signature du/des créateurs de votre projet. Ce calque est le
seul ne faisant pas parti du calque #page.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Imbrication des éléments dans le flux&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;http://blogs.medialibs.com/public/s.bonaventure/.fluxhtml_m.jpg&quot; alt=&quot;positionnement dans le flux&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;La mise en forme (CSS)&lt;/h2&gt;
&lt;p&gt;Utiliser des feuilles de style ne fait pas tout, encore faut-il bien les
utiliser. Tout d'abord, n'utilisez pas une unique feuille de style mais
plusieurs feuilles de style. Ceci vous permettra d'économiser un temps non
négligeable lors de vos intégrations, car plutôt que de naviguer dans une seule
feuille de style qui fait des milliers de lignes, vous n'aurez qu'à
sélectionner la bonne feuille de style pour trouver tout de suite ce que vous
désirez.&lt;/p&gt;
&lt;p&gt;Pour permettre de s'y retrouver encore plus facilement, indenter ses
feuilles de style est un bon moyen de regrouper toutes les déclarations qui
servent à mettre en page un élément :&lt;/p&gt;
&lt;pre&gt;
#menu{}
     #menu ul{}
          #menu ul li{}
          #menu ul li.toto{}
          #menu ul#toto li{}
                  #menu ul li a{}
                  #menu ul li a:hover{}
                  #menu ul li a:visited{}
                  #menu ul li.active a{}
&lt;/pre&gt;
&lt;p&gt;Supprimez toutes les marges par défaut *{margin:0;padding:0;}. On trouvera
cette déclaration dans la feuille de style de base (celle qui importera toutes
les autres). Cela servira à annuler les styles que toutes les balises HTML ont
par défaut. Désormais grâce à cet élément, plus besoin de se poser la question
si les éléments auxquels on veut appliquer des styles héritent d'une propriété
qui a été écrite ou bien du style par défaut que possèdent toutes les balises
HTML (notamment pour les listes des menu). Ceci va également éviter de mettre
les marges internes et externes à zéro. Enfin, nous devrons penser aux espaces
entre les paragraphes par exemple, plutôt que de se laisser porter par les
styles HTML par défaut.&lt;/p&gt;
&lt;p&gt;Attention particulière afin de contourner le problème du &amp;quot;&lt;a href=&quot;http://openweb.eu.org/articles/dimensions_boites_css/&quot; hreflang=&quot;fr&quot;&gt;box
model&lt;/a&gt;&amp;quot; : ne pas mélanger, et des propriétés width, et du padding. Il
est préférable d'appliquer le padding, si besoin, à un calque enfant. Par
exemple :&lt;/p&gt;
&lt;pre&gt;
#box{
width:250px;
}
#box div{
padding:15px;
}
&lt;/pre&gt;
&lt;p&gt;Concernant le style de la balise body, inutile de vous rappeler qu'il est
toujours important de déclarer ses polices de caractères de façon relative
(&lt;a href=&quot;http://css.alsacreations.com/Tutoriels-et-articles-divers/gerer-la-taille-du-texte-avec-les-em&quot; hreflang=&quot;fr&quot;&gt;si besoin est, alsacreations a un très bon tutoriel&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Il est important de dédier une feuille de style qui va permettre d'installer
uniquement l'ergonomie du site, celle-ci ne sera pas parasitée par la mise en
place d'autres éléments. La zone #banner sera fixe en hauteur pour pouvoir
placer tout ce qui se trouvera dedans de façon absolue, et aussi appliquer de
jolis fonds en CSS. Ensuite on va retrouver le calque #conteneur qui prend la
totalité de la largeur de son parent (#wrapper), et auquel on attribut un
float:left; pour que les éléments qui le suivent #leftbar et #rigthbar
reviennent vers leur gauche. Ces deux derniers éléments ont des largeurs
d'appliqués avec des marges négatives sur la gauche afin de venir se placer au
dessus de #conteneur. Attention dans le cas d'une design liquide (qui s'adapte
à la largeur de l'écran), la largeur de la colonne de gauche se doit d'être à
-100%. Mais dans le cas d'une design restreint il faudra spécifier pour
internet explorer une marge négative de la largeur de l'élément conteneur.
Logiquement le -100% devrait suffire, car 100% de 770px par exemple, ça fait
770px ! Et bien de temps à autres, Internet Explorer ne comprend pas, il
faudra donc spécifier des largeurs en pixels dans les cadres de designs qui ne
s'adaptent pas aux écrans. Ensuite, nous avons un élément avec un style de type
clear:left;, afin que l'élément conteneur (#wrapper) puisse savoir où il se
termine. Mais pourquoi utiliser une structure aussi compliquée avec toutes ces
marges négatives ? En fait, le but de cette structure, est d'utiliser le
moins possibles d'éléments avec des clear:both;, tellement problématiques sous
Internet Explorer...&lt;/p&gt;
&lt;p&gt;Afin d'optimiser le poids de ses feuilles de styles, utilisons des
propriétés raccourcies. Par exemple, pour appliquer un fond en CSS, il existe
toutes une série de propriétés qui peuvent être remplacées par une
seule :&lt;/p&gt;
&lt;pre&gt;
#element{
background-color:red;
background-image:url(/images/monimage.jpg);
background-repeat:repeat-y;
background-attachment:scroll;
background-position:top left;
}
&lt;/pre&gt;
&lt;p&gt;équivaut à&lt;/p&gt;
&lt;pre&gt;
#element{
background:red url(/images/monimage.jpg) repeat-y scroll top left;
}
&lt;/pre&gt;
&lt;p&gt;On peut faire ça avec les propriétés de font, padding; margin, border,
list-style, outline et background bien sûr.&lt;/p&gt;
&lt;p&gt;Pour l'insertion des images, dans une logique de sémantique et
d'accessibilité, les images qui seront inclues en feuille de style sont
uniquement les images de décoration. Dès qu'une image apporte du sens à votre
page web, dès qu'il y a du texte dessus, il est préférable de l'inclure en
XHTML.&lt;/p&gt;
&lt;p&gt;Quelque chose de plus didactique (&lt;a href=&quot;http://css.alsacreations.com/Faire-une-mise-en-page-sans-tableaux/design-css&quot; hreflang=&quot;fr&quot;&gt;à la alsacréations, si si&lt;/a&gt;) sera réalisé dans les prochaines
semaines afin de mieux comprendre comment est réalisé le style par défaut.&lt;/p&gt;</content:encoded>
    
    

    <comments>http://blogs.medialibs.com/sb.php/post/2007/01/22/les-templates-e-majine-evoluent#comment-form</comments>
    <wfw:comment>http://blogs.medialibs.com/sb.php/post/2007/01/22/les-templates-e-majine-evoluent#comment-form</wfw:comment>
    <wfw:commentRss>http://blogs.medialibs.com/sb.php/feed/rss2/comments/89</wfw:commentRss>
  </item>
    
  <item>
    <title>Faire une galerie d'images avancée ailleurs que dans un article en blocs</title>
    <link>http://blogs.medialibs.com/sb.php/post/2006/12/04/faire-une-galerie-dimages-avancee-autre-part-que-dans-un-article</link>
    <guid isPermaLink="false">urn:md5:052a3efb867a7e9daf15aa00e9cb3720</guid>
    <pubDate>Mon, 04 Dec 2006 17:11:00 +0100</pubDate>
    <dc:creator>Simon Bonaventure</dc:creator>
        <category>css</category><category>dhtml</category><category>e-majine</category><category>galerie dimages</category><category>intégration</category><category>javascript</category><category>xhtml</category>    
    <description>
        Une galerie, quoi ?
Dans l'interface d'administration e-majine manage, lorsque vous créez un
article en bloc, vous avez la possibilité de faire un bloc de type
médias. Configuration de ce bloc :    </description>
    <content:encoded>    &lt;h2&gt;Une galerie, quoi ?&lt;/h2&gt;
&lt;p&gt;Dans l'interface d'administration e-majine manage, lorsque vous créez un
article en bloc, vous avez la possibilité de faire un &lt;strong&gt;bloc de type
médias&lt;/strong&gt;. Configuration de ce bloc :&lt;/p&gt;
&lt;pre&gt;
- Type : image
- Affichage: galerie d'images
- Insertion de plusieurs images composant cette galerie et enregistrement de leur ordre d'apparition
- Cocher la case &amp;quot;vignettes&amp;quot; - les vignettes des images sont affichées par défaut, en cliquant dessus les images sont affichées à leur taille réelle.
- Type de galerie : avancée
- Choix de l'alignement
&lt;/pre&gt;
&lt;h2&gt;Comment elle fonctionne ?&lt;/h2&gt;
&lt;p&gt;Beaucoup d'entre vous apprécient le fonctionnement du bloc de type média
lorsqu'il affiche une galerie d'images en mode avancé. On me pose souvent la
question sur son fonctionnement et les technologies qui sont utilisées pour
afficher cela. Certains parlent de flash, d'autres d'AJAX... En fait, il s'agit
de DHTML, qui n'est pas à proprement parler un unique langage mais une
combinaison de technologies : Javascript, CSS et XHTML. La librairie
utilisée pour faire ces galeries d'images provient du site &lt;a href=&quot;http://www.huddletogether.com/projects/lightbox2/&quot; hreflang=&quot;en&quot; title=&quot;le site de l'auteur de la galerie&quot;&gt;lightbox&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Comment intégrer une galerie avancée ailleurs dans votre site ?&lt;/h2&gt;
&lt;h3&gt;Faire appel aux fichiers externes&lt;/h3&gt;
&lt;p&gt;En suivant les recommandations du site de l'auteur, on s'aperçoit qu'il faut
tout d'abord faire appel aux fichiers javascripts permettant de réaliser les
effets de redimensionnement. Je vous conseille de déposer ces fichiers dans le
dossier prévu à cet effet : &amp;quot;Scripts&amp;quot; se trouvant à la racine de votre
FTP :&lt;/p&gt;
&lt;pre&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;/scripts/prototype.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;/scripts/scriptaculous.js?load=effects&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;/scripts/lightbox.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Ensuite, il faut faire appel à la feuille de style de cette galerie, sans
oublier de déposer dans le dossier images, à la racine du FTP, toutes les
images, elles-mêmes appelées à partir de la feuille de style :&lt;/p&gt;
&lt;pre&gt;
&amp;lt;link  rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;/modeles/fr/Modele1/css/gallery.css&amp;quot; title=&amp;quot;normal&amp;quot; /&amp;gt;
&lt;/pre&gt;
&lt;h3&gt;Définir le(s) endroit(s) où se trouvera la galerie d'images&lt;/h3&gt;
&lt;p&gt;Il est nécessaire ensuite de définir dans votre template, l'endroit où va se
trouver la galerie d'images. Pour cela, il faut encapsuler les images dans un
div qui devra porter un attribut de class que vous aurez définit.&lt;/p&gt;
&lt;pre&gt;
&amp;lt;div class=&amp;quot;gallery&amp;quot;&amp;gt;
         &amp;lt;img src=&amp;quot;/medias/thumbnail/image1.png&amp;quot; alt=&amp;quot;texte alternatif 1&amp;quot; /&amp;gt;
         &amp;lt;img src=&amp;quot;/medias/thumbnail/image2.png&amp;quot; alt=&amp;quot;texte alternatif 2&amp;quot; /&amp;gt;
         &amp;lt;img src=&amp;quot;/medias/thumbnail/image3.png&amp;quot; alt=&amp;quot;texte alternatif 3&amp;quot; /&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/pre&gt;
&lt;h3&gt;Amusons-nous avec le javascript et le DOM&lt;/h3&gt;
&lt;p&gt;Intégrons maintenant un nouveau fichier javascript ayant pour but de
rajouter, avec le DOM, pour chaque image, le lien avec les bons attributs,
permettant de faire afficher le galerie d'images. Dans ce fichier, nous allons
tout d'abord commencer par écrire une fonction pour travailler avec les
&amp;quot;classname&amp;quot;.&lt;/p&gt;
&lt;pre&gt;
function getElementsByClassName(strClass, strTag, objContElm) {
        strTag = strTag || &amp;quot;*&amp;quot;;
        objContElm = objContElm || document;
        var objColl = objContElm.getElementsByTagName(strTag);
        if (!objColl.length &amp;amp;&amp;amp;  strTag == &amp;quot;*&amp;quot; &amp;amp;&amp;amp;  objContElm.all) objColl = objContElm.all;
        var arr = new Array();
        var delim = strClass.indexOf('|') != -1  ? '|' : ' ';
        var arrClass = strClass.split(delim);
        for (var i = 0, j = objColl.length; i &amp;lt; j; i++) {
        var arrObjClass = objColl[i].className.split(' ');
        if (delim == ' ' &amp;amp;&amp;amp; arrClass.length &amp;gt; arrObjClass.length) continue;
                var c = 0;
                comparisonLoop:
                for (var k = 0, l = arrObjClass.length; k &amp;lt; l; k++) {
                        for (var m = 0, n = arrClass.length; m &amp;lt; n; m++) {
                                if (arrClass[m] == arrObjClass[k]) c++;
                                if (( delim == '|' &amp;amp;&amp;amp; c == 1) || (delim == ' ' &amp;amp;&amp;amp; c == arrClass.length)) {
                                arr.push(objColl[i]);
                                break comparisonLoop;
                                }
                        }
                }
        }
        return arr;
}
&lt;/pre&gt;
&lt;p&gt;La seconde fonction : à chaque fois que l'on va rencontrer le nom de la
class, choisi sur notre div qui englobe les images de notre galerie, la
fonction va détecter toutes les images. Pour chacune des images, il faut
rajouter un lien dans le div parent, à ce lien. L'image est à insérer à
l'intérieur et nous créons les attributs href, title et rel (qui va permettre
de créer la galerie). Je vous fait grâce du fonctionnement de tout ça.&lt;/p&gt;
&lt;pre&gt;
function createGallery(nameclass){
        var className = getElementsByClassName(nameclass, &amp;quot;div&amp;quot;, document);
        for(var i=0 ; i&amp;lt;className.length ;i++){
                var imagesGallery = className[i].getElementsByTagName(&amp;quot;img&amp;quot;);
                for(var j=0 ; j&amp;lt;imagesGallery.length ;j++){
                        var lien = document.createElement(&amp;quot;a&amp;quot;);
                        className[i].appendChild(lien);
                        lien.appendChild(imagesGallery[j]);
                        lien.setAttribute('rel', 'lightbox['+nameclass+']');
                        lien.setAttribute('href', '/media/'+imagesGallery[j].src.split(&amp;quot;/&amp;quot;)[5]);
                        lien.setAttribute('title','&amp;lt;h3&amp;gt;'+imagesGallery[j].alt+'&amp;lt;/h3&amp;gt;');
                }
        }
}
&lt;/pre&gt;
&lt;p&gt;Et enfin, une fois que tout cela est fait, il ne reste plus qu'à lancer
cette dernière fonction à la fin du chargement de la page. En n'oubliant pas de
faire appel au même nom de class, mis sur le div qui englobe nos images.&lt;/p&gt;
&lt;pre&gt;
window.onload = function(){
        var classname = &amp;quot;gallery&amp;quot;;
        if (getElementsByClassName(classname, &amp;quot;div&amp;quot;, document).length&amp;gt;=1){
                createGallery(classname)
        }
}
&lt;/pre&gt;
&lt;p&gt;Ces trois dernières fonctions se trouvent aussi dans un fichier externe, il
est nécessaire d'y faire appel comme précédemment :&lt;/p&gt;
&lt;pre&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;/scripts/Gallery.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Je laisse à disposition une archive contenant tous &lt;a href=&quot;http://blogs.medialibs.com/public/s.bonaventure/galerie_d__images_avanc_e.zip&quot; hreflang=&quot;fr&quot; title=&quot;archives contenant les javascripts, css, et images&quot;&gt;les fichiers
suscités&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A vos claviers, il ne vous reste plus qu'à insérer cela dans vos annuaires,
catalogues, articles préformatés, etc.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;PS : si dans votre site vous avez déjà intégré du javascript avec
la fonction &lt;code&gt;onload&lt;/code&gt;, il est fort probable qu'il y ait un conflit
avec deux fonctions onload. Si c'est le cas, n'hésitez pas à lire &lt;a href=&quot;http://www.babylon-design.com/site/index.php/2006/11/30/155-eviter-conflit-javascript-window-onload&quot; hreflang=&quot;fr&quot; title=&quot;babylon-design&quot;&gt;cet article&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;EDIT&lt;/strong&gt; : attention, pour la fonction createGallery à ne
pas utiliser le paramètre &amp;quot;class&amp;quot; qui est un mot réservé pour Internet
Explorer&lt;/p&gt;</content:encoded>
    
          <enclosure url="http://blogs.medialibs.com/public/s.bonaventure/galerie_d__images_avanc_e.zip"
      length="32324" type="application/zip" />
    

    <comments>http://blogs.medialibs.com/sb.php/post/2006/12/04/faire-une-galerie-dimages-avancee-autre-part-que-dans-un-article#comment-form</comments>
    <wfw:comment>http://blogs.medialibs.com/sb.php/post/2006/12/04/faire-une-galerie-dimages-avancee-autre-part-que-dans-un-article#comment-form</wfw:comment>
    <wfw:commentRss>http://blogs.medialibs.com/sb.php/feed/rss2/comments/66</wfw:commentRss>
  </item>
    
  <item>
    <title>Les hacks de css</title>
    <link>http://blogs.medialibs.com/sb.php/post/2006/12/04/Les-hacks-de-css</link>
    <guid isPermaLink="false">urn:md5:679e8e04ea39d26731babc683b15c16f</guid>
    <pubDate>Mon, 04 Dec 2006 10:23:00 +0100</pubDate>
    <dc:creator>Simon Bonaventure</dc:creator>
        <category>css</category><category>hack</category><category>ie</category><category>intégration</category>    
    <description>
        Internet Explorer 7 est sorti sous la forme d'une mise à jour récemment.
Nombre d'entre nous ont du tester ce nouveau navigateur dans sa version beta
(comme nous le
proposait Ronan avec une double    </description>
    <content:encoded>    &lt;p&gt;Internet Explorer 7 est sorti sous la forme d'une mise à jour récemment.
Nombre d'entre nous ont du tester ce nouveau navigateur dans sa version beta
(&lt;a href=&quot;http://blogs.medialibs.com/rc.php/post/2006/10/20/Il-faut-se-preparer-a-IE7&quot; hreflang=&quot;fr&quot; title=&quot;billet de Ronan sur une double installation IE6 et IE7&quot;&gt;comme nous le
proposait Ronan avec une double installation&lt;/a&gt;). IE7 fait un grand pas en
avant dans le respect des standards. Il implémente à présent une grande partie
de CSS 2 et gère notamment la transparence des PNG. IE7 reste toujours en
retard vis à vis des autres navigateurs modernes (Firefox, Opéra ou Safari pour
ne citer qu'eux), bien qu'il évolue dans le bon sens, soyons satisfait, voilà 5
ans que cela n'avait pas été le cas.&lt;/p&gt;
&lt;p&gt;Bref, lors de vos intégrations, il y a certainement quelques hack de css qui
doivent trainer quelque part, afin d'obtenir un affichage correct sur tous les
navigateurs et aussi pour Internet Explorer... Car rappelons le, IE
n'implémentait pas en complètement les standards et imposait donc les hacks de
css. Les plus célèbres étant le bidouillage du « modèle de boîte
Microsoft » ( « box model hack » ) en contradiction avec CSS2
et, jusqu'à la sortie d'IE7, la non-gestion de la transparence des images au
format PNG. Malheureusement, chez Microsoft, ils n'ont pas jugé bon de faire de
la rétro-compatibilité avec les hacks de css, donc ceux que vous pouviez
utiliser peuvent soudainement être interprétés ou non par d'autres
navigateurs...&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blogs.msdn.com/ie/archive/2006/08/22/712830.aspx&quot; hreflang=&quot;en&quot; title=&quot;nouveauté d'internet explorer (blog)&quot;&gt;Voici ce qui a changé dans
internet explorer&lt;/a&gt; , et voici quelques sites avec des nouveaux hacks pour
donner des styles différents selon les navigateurs et même les versions
d'IE :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.positioniseverything.net/articles/ie7-dehacker.html&quot; hreflang=&quot;en&quot; title=&quot;positioniseverything.net&quot;&gt;positioniseverything.net&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://romuald.textdriven.com/blog/article/hack-css-ie7&quot; hreflang=&quot;fr&quot; title=&quot;romuald.textdriven.com&quot;&gt;romuald.textdriven.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://nanobox.chipx86.com/blog/2006/04/easy-css-hacks-for-ie7.php&quot; hreflang=&quot;en&quot; title=&quot;nanobox.chipx86.com&quot;&gt;nanobox.chipx86.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded>
    
    

    <comments>http://blogs.medialibs.com/sb.php/post/2006/12/04/Les-hacks-de-css#comment-form</comments>
    <wfw:comment>http://blogs.medialibs.com/sb.php/post/2006/12/04/Les-hacks-de-css#comment-form</wfw:comment>
    <wfw:commentRss>http://blogs.medialibs.com/sb.php/feed/rss2/comments/64</wfw:commentRss>
  </item>
    
</channel>
</rss>