Si l'on teste la propriété border sur un select pour modifier la couleur d'une liste déroulante de formulaire :
on se rend vite compte que cela ne fonctionne pas sur quasiment tous les navigateurs.
Voulant tout de même obtenir ce résultat, j'ai cherché comment contourner le problème.
On positionne un élément en absolu qui viendra se placer sur la liste. Les bordures de cet élément viendront cacher celles de la liste.
Sur internet explorer il n'est tout simplement pas possible de placer un élément au dessus d'une liste et sous firefox la liste n'est alors plus utilisable, on ne peut plus la dérouler.
On oublie.
Première possibilité : utiliser la propriété clip : cela fonctionne sous firefox mais pas sous ie.
Seconde possibilité: donner des marges de -1px ou -2px : cela fonctionne sous ie mais pas sous firefox.
A partir de ces deux techniques, en les testant sous différents navigateurs, on se rend compte que l'on arrive quasiment à chaque fois à masquer les bordures.
Chaque navigateur interprète au moins une des deux méthodes. Il faudra alors utiliser des déclaration de styles de type html>body .classe pour forcer les navigateurs à interpréter le code voulu.
Les bordures ont donc disparu, il faudra maintenant un second élément conteneur de la liste dont la couleur de fond viendra prendre la place des bordures.
On place donc un élément, conteneur de la liste et plus grand que celle-ci.
Sous firefox, tout est bon, on obtient le résultat voulu.
Sous ie, il faudrait ajouter un padding au conteneur pour qu'il dépasse des marges négatives. Cependant, si l'élément est plus grand que la liste, les bordures supprimées réapparaissent. On obtient donc une double bordure.
On ne peut pas non plus positionner la liste en absolu sous ie car les marges de -1px ne sont alors plus prises en compte.
Essayons maintenant avec un élément non pas conteneur mais déclaré avant ou après la liste. En lui donnant une position absolue, on peut ainsi le mettre sous le select.
Le code html sera alors :<div class="conteneur">
<div> </div>
<select>
<option>choisir</option>
</select>
</div>
Il faut ensuite appliquer quelques modifications pour corriger les différences d'interprétation de dimensions pour internet explorer. On devra également placer les deux éléments dans un bloc conteneur en position relative.
Code css :select {
color:#999999;
width:200px;
height:22px;
border:0;
margin:-2px;
voice-family: ""}"";
voice-family:inherit;
margin:-1px;
}
html>body select {
position:absolute;
clip: rect(2px, 188px, 21px, 2px);
margin:0;
padding:0;
width:189px;
}
.conteneur div {
position:absolute;
margin-top:-1px;
margin-left:-1px;
background-color:#FF0000;
width:200px;
height:20px;
voice-family: ""}"";
voice-family:inherit;
height:22px;
width:201px;
}
html>body div.conteneur div {
margin:1px 0 0 1px;
height:21px;
width:188px;
}
.conteneur {
position:relative;
}
Au final on arrive aux résultats suivants sous différents navigateurs :

Internet Explorer 5.0 sous Win XP

Internet Explorer 5.5 sous Win XP

Internet Explorer 6 sous Win XP

Opéra 7.54 sous Win XP

Opéra 8 sous Win XP

Netscape 6 sous Win XP

Netscape 7.02 sous Win XP

Netscape 8 sous Win XP

Firefox 1.0.1 sous Win XP

OmniWeb sous Mac OSX

Safari 1.2.4 sous Mac OSX

Internet Explorer sous Mac OSX
Il s'agit là d'un exercice permettant de voir si le rendu était possible. Maintenant, la solution trouvée est assez lourde et pourra certainement poser d'autres problèmes selon les navigateurs. Au final, si l'on veut vraiment personnaliser son formulaire, il est peut être plus simple d'utiliser flash.
Effectivement, si le client tient absolument à obtenir un rendu graphique comme il le désire, on peut très bien passer par Flash. Merci en tout cas pour ce travail de recherche
Très bon article. Mais je suis plus secptique pour le flash... Mais bon.
Une solution basé sur une liste (UL ou OL) avec un peu de JavaScript peut sans doute permettre de faire des choses interressantes
ya pas plus court ! je veux dire un code pas très long sans utilisation de div ?
je suis beaucoup moins sceptique au niveau de flash, mais là c'est clair qu'il n'est pas à utiliser pour le cas unique...
si on veut créer une interface cliente en flash, il faut que ce soit une bien plus grande partie du navigateur... de toute façon cela paraît impensable pour une liste... comment prévoir la taille du swf ? selon la longueur de la liste, et cela va donc prendre de la place qui ne sera plus utilisable, à moins de tout faire en flash
donc c'est soit tout flash soit pas flash
fadjer >> il y a peut être plus court effectivement, je ne sais pas
les bordures de listes sont très difficiles à manier en css, j'ai ici cherché une méthode pour pallier le problème mais il peut en exister d'autres
Utiliser flash... quelle idée ! Non sérieusement vivement que cette posibilité soit implémentée, css 3.0 ?
Flash c'est parfait pour modifier le rendu graphique, c'est bien le sujet de l'article là non ?
Je croyais que la stardisation via le css devait permettre d'élargir le public internaute en essayant de normaliser le web et donc permettre un acces plus facile aux informations. Donc Flash...
VOIR CE SITE /
http://www.easy-designs.net/articles/replaceSelect/
Salut,
Je pense que cette solution ne fonctionne pas sous firefox 1.5.0.4
Commentaires momentanément fermés. Merci de votre compréhension.