703 votes

Cibler uniquement Firefox avec CSS

Grâce aux commentaires conditionnels, il est facile de cibler Internet Explorer avec des règles CSS spécifiques au navigateur :

<!--[if IE 6]>
...include IE6-specific stylesheet here...
<![endif]-->

Parfois, c'est le moteur Gecko (Firefox) qui se comporte mal. Quel serait le meilleur moyen de cibler uniquement Firefox avec vos règles CSS et pas un seul autre navigateur ? En d'autres termes, non seulement Internet Explorer devrait ignorer les règles réservées à Firefox, mais également WebKit et Opera.

Note : Je suis à la recherche d'une solution "propre". Utiliser un renifleur de navigateur JavaScript pour ajouter une classe "firefox" à mon HTML n'est pas une solution propre à mon avis. J'aimerais plutôt voir quelque chose qui dépende des capacités du navigateur, un peu comme les commentaires conditionnels qui ne sont "spéciaux" que pour IE

1405voto

Ionuț G. Stan Points 62482

OK, je l'ai trouvé. C'est probablement la solution la plus simple et la plus propre qui existe et elle ne dépend pas de l'activation de JavaScript.

<!DOCTYPE html>

<html>
<head>
<style type="text/css">
@-moz-document url-prefix() {
    h1 {
        color: red;
    }
}
</style>
</head>
<body>

<h1>This should be red in FF</h1>

</body>
</html>

Il est basé sur une autre extension CSS spécifique à Mozilla. Il y a une liste complète de ces extensions CSS ici :

https://developer.mozilla.org/en/CSS_Reference/Mozilla_Extensions

84voto

waqasalieee Points 762

Voici comment aborder trois navigateurs différents : IE, FF et Chrome

    <style type='text/css'>
/*This will work for chrome */
                    #categoryBackNextButtons
                    {
                        width:490px;
                    }
/*This will work for firefox*/
                    @-moz-document url-prefix() {
                        #categoryBackNextButtons{
                        width:486px;
                    }
                    }
                </style>
                <!--[if IE]>
                <style type='text/css'>
/*This will work for IE*/
                #categoryBackNextButtons
                {
                    width:486px;
                }
                </style>
                <![endif]-->

16voto

Hbirjand Points 342

Voici quelques hacks de navigateur pour cibler uniquement le navigateur Firefox,

Utiliser des bidouillages de sélecteurs.

_:-moz-tree-row(hover), .selector {}

JavaScript Hacks

var isFF = !!window.sidebar;

var isFF = 'MozAppearance' in document.documentElement.style;

var isFF = !!navigator.userAgent.match(/firefox/i);

Astuces pour les requêtes média

Cela va fonctionner sur Firefox 3.6 et plus.

@media screen and (-moz-images-in-menus:0) {}

Si vous avez besoin de plus d'informations, veuillez visiter browserhacks

13voto

Ionuț G. Stan Points 62482

Tout d'abord, un avertissement. Je ne suis pas vraiment partisan de la solution que je présente ci-dessous. Les seules CSS spécifiques aux navigateurs que j'écris sont pour IE (en particulier IE6), même si j'aimerais que ce ne soit pas le cas.

Maintenant, la solution. Vous avez demandé qu'elle soit élégante, alors je ne sais pas à quel point elle l'est, mais elle va certainement cibler les plateformes Gecko uniquement.

L'astuce ne fonctionne que lorsque JavaScript est activé et fait appel aux liaisons Mozilla ( XBL ), qui sont largement utilisés en interne dans Firefox et tous les autres produits basés sur Gecko. À titre de comparaison, c'est comme la propriété CSS behavior dans IE, mais beaucoup plus puissante.

Trois fichiers sont impliqués dans ma solution :

  1. ff.html : le fichier à styliser
  2. ff.xml : le fichier contenant les liaisons Gecko.
  3. ff.css : Style spécifique à Firefox

ff.html

<!DOCTYPE html>

<html>
<head>
<style type="text/css">
body {
 -moz-binding: url(ff.xml#load-mozilla-css);
}
</style>
</head>
<body>

<h1>This should be red in FF</h1>

</body>
</html>

ff.xml

<?xml version="1.0"?>

<bindings xmlns="http://www.mozilla.org/xbl">
    <binding id="load-mozilla-css">
        <implementation>
            <constructor>
            <![CDATA[
                var link = document.createElement("link");
                    link.setAttribute("rel", "stylesheet");
                    link.setAttribute("type", "text/css");
                    link.setAttribute("href", "ff.css");

                document.getElementsByTagName("head")[0]
                        .appendChild(link);
            ]]>
            </constructor>
        </implementation>
    </binding>
</bindings>

ff.css

h1 {
 color: red;
}

Mise à jour : La solution ci-dessus n'est pas très bonne. Il serait préférable qu'au lieu d'ajouter un nouvel élément LINK, on ajoute que "firefox" sur l'élément BODY. Et c'est possible, il suffit de remplacer le JS ci-dessus par le suivant :

this.className += " firefox";

La solution s'inspire de moz-behaviors de Dean Edwards .

8voto

Kekoa Points 11545

Une variante de votre idée est d'avoir un détecteur USER-AGENT côté serveur qui déterminera quelle feuille de style joindre à la page. De cette façon, vous pouvez avoir un firefox.css, ie.css, opera.css, etc.

Vous pouvez accomplir une chose similaire en Javascript lui-même, même si vous ne le considérez pas comme propre.

J'ai fait la même chose en ayant un fichier default.css qui inclut tous les styles courants, puis des feuilles de style spécifiques sont ajoutées pour remplacer ou améliorer les valeurs par défaut.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X