Prima di tutto, un disclaimer. Non sostengo davvero per la soluzione che presento di seguito. L'unico CSS specifico per browser che scrivo è per IE (in particolare IE6), anche se vorrei che non fosse così.
Ora, la soluzione. Hai chiesto che fosse elegante, quindi non so quanto sia elegante, ma sicuramente prenderà di mira solo le piattaforme Gecko.
Il trucco funziona solo quando JavaScript è abilitato e utilizza i collegamenti Mozilla ( XBL ), che sono ampiamente utilizzati internamente in Firefox e in tutti gli altri prodotti basati su Gecko. Per un confronto, questo è come la proprietà CSS del comportamento in IE, ma molto più potente.
Tre file sono coinvolti nella mia soluzione:
- ff.html: il file in stile
- ff.xml: il file che contiene gli attacchi Gecko
- ff.css: stile specifico di 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;
}
Aggiornamento:
la soluzione sopra non è così buona. Sarebbe meglio se invece di aggiungere un nuovo elemento LINK aggiungesse quella classe "firefox" sull'elemento BODY. Ed è possibile, semplicemente sostituendo il JS sopra con il seguente:
this.className += " firefox";
La soluzione è ispirata ai comportamenti moz di Dean Edwards .