Ne cibler que Firefox avec CSS
utilisation de 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. quelle serait la meilleure façon de cibler uniquement Firefox avec vos règles CSS et pas un seul autre navigateur? C'est-à-dire, non seulement Internet Explorer devrait ignorer les règles de Firefox seulement, mais aussi WebKit et Opera devrait.
Note: je cherche une solution "propre". Utiliser un navigateur JavaScript sniffer pour ajouter une classe' firefox ' à mon HTML ne se qualifie pas comme propre à mon avis. Je voudrais plutôt voir quelque chose qui dépend des capacités du navigateur, un peu comme les commentaires conditionnels ne sont que "spéciaux" pour IE...
10 réponses
OK, je l'ai trouvé. Il s'agit probablement de la solution la plus propre et la plus facile là-bas et ne repose pas sur JavaScript étant activé.
@-moz-document url-prefix() {
h1 {
color: red;
}
}
<h1>This should be red in FF</h1>
il est basé sur une autre extension CSS spécifique à Mozilla. Il y a une liste complète de ces extensions CSS ici: Mozilla CSS Extensions .
Voici comment s'attaquer à 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]-->
tout d'Abord, un avertissement. Je ne défends pas vraiment la solution que je présente ci-dessous. Le seul CSS spécifique au navigateur que j'écris est pour IE (surtout IE6), bien que je souhaite que ce ne soit pas le cas.
maintenant, la solution. Vous lui avez demandé d'être élégant donc je ne sais pas comment il est élégant, mais il va certainement cibler les plates-formes Gecko seulement.
le truc ne fonctionne que lorsque JavaScript est activé et utilise des fixations Mozilla ( XBL ), qui sont largement utilisés en interne dans Firefox et tous les autres produits à base de Gecko. Pour une comparaison, c'est comme la propriété CSS de comportement dans IE, mais beaucoup plus puissant.
trois fichiers sont impliqués dans ma solution:
- ff.html: le fichier de style
- ff.xml: le fichier contenant les liaisons gecko
- ff.css: Firefox spécifique style
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 bon. Il serait préférable qu'au lieu d'ajouter un nouvel élément de lien, il ajoute que classe "firefox" sur l'élément de corps. Et c'est possible, juste en remplaçant les js ci-dessus avec le texte suivant:
this.className += " firefox";
La solution est inspiré par de Dean Edwards' moz-comportements .
voici quelques hacks de navigateur pour cibler seulement le navigateur Firefox,
utilisant des vérins de sélection.
_:-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);
Media Query Hacks
ça va marcher, Firefox 3.6 et plus tard
@media screen and (-moz-images-in-menus:0) {}
si vous avez besoin de plus d'information,s'il vous plaît visitez browserhacks
L'utilisation de règles spécifiques au moteur assure un ciblage efficace du navigateur.
<style type="text/css">
//Other browsers
color : black;
//Webkit (Chrome, Safari)
@media screen and (-webkit-min-device-pixel-ratio:0) {
color:green;
}
//Firefox
@media screen and (-moz-images-in-menus:0) {
color:orange;
}
</style>
//Internet Explorer
<!--[if IE]>
<style type='text/css'>
color:blue;
</style>
<![endif]-->
une variante de votre idée est d'avoir un server-side USER-AGENT detector
qui permettra de déterminer quelle feuille de style à attacher à la page. De cette façon, vous pouvez avoir un firefox.css, ie.css, opera.css, etc
.
vous pouvez accomplir une chose similaire dans Javascript lui-même, bien que vous ne pouvez pas le considérer comme propre.
j'ai fait une chose similaire en ayant un default.css
qui inclut all common styles and then specific style sheets
sont ajoutés pour outrepasser, ou améliorer les valeurs par défaut.
la seule façon de le faire est par divers hacks CSS, ce qui rendra votre page beaucoup plus susceptible d'échouer sur les prochaines mises à jour de navigateur. S'il y a quoi que ce soit, il sera moins sûr que d'utiliser un sniffer js-browser.
maintenant que Firefox Quantum 57 est sorti avec des améliorations substantielles - et potentiellement cassantes-à Gecko collectivement connu sous le nom de Stylo ou Quantum CSS, vous pouvez vous trouver dans une situation où vous devez distinguer entre les versions anciennes de Firefox et Firefox Quantum.
de ma réponse ici :
vous pouvez utiliser
@supports
avec une expressioncalc(0s)
en conjonction avec@-moz-document
tester pour Stylo-Gecko ne supporte pas les valeurs de temps dans les expressionscalc()
mais Stylo fait:@-moz-document url-prefix() { @supports (animation: calc(0s)) { /* Stylo */ } }
voici une preuve de concept:
body::before { content: 'Not Fx'; } @-moz-document url-prefix() { body::before { content: 'Fx legacy'; } @supports (animation: calc(0s)) { body::before { content: 'Fx Quantum'; } } }
cibler les anciennes versions de Firefox est un peu délicat - si vous êtes seulement intéressé par les versions qui prennent en charge
@supports
, qui est Fx 22 et plus,@supports not (animation: calc(0s))
est tout ce dont vous avez besoin:@-moz-document url-prefix() { @supports not (animation: calc(0s)) { /* Gecko */ } }
... mais si vous avez besoin de supporter des versions encore plus anciennes, vous aurez besoin de faire usage de la cascade , comme démontré dans la validation de principe ci-dessus.