Ответ 1
Хорошо, я нашел его. Это, вероятно, самое чистое и простое решение, и не полагается на включенность JavaScript.
@-moz-document url-prefix() {
h1 {
color: red;
}
}
<h1>This should be red in FF</h1>
Используя условные комментарии, легко настроить таргетинг на Internet Explorer на CSS-правила, определенные браузером:
<!--[if IE 6]>
...include IE6-specific stylesheet here...
<![endif]-->
Иногда это движок Gecko (Firefox) ошибочно работает. Что лучше всего настроить только на Firefox с вашими правилами CSS, а не с одним другим браузером? То есть Internet Explorer не только должен игнорировать правила только для Firefox, но также и WebKit и Opera.
Примечание. Я ищу "чистое" решение. Использование JavaScript-браузера сниффера для добавления класса "firefox" в мой HTML не считается чистым, на мой взгляд. Я бы хотел увидеть что-то, что зависит от возможностей браузера, так как условные комментарии являются "особыми" для IE...
Хорошо, я нашел его. Это, вероятно, самое чистое и простое решение, и не полагается на включенность JavaScript.
@-moz-document url-prefix() {
h1 {
color: red;
}
}
<h1>This should be red in FF</h1>
Вот как можно использовать три разных браузера: IE, FF и 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]-->
Обновлено (из комментария @Antoine)
Вы можете использовать @supports
@supports (-moz-appearance:none) {
h1 { color:red; }
}
<h1>This should be red in FF</h1>
Прежде всего, отказ от ответственности. Я действительно не сторонник решения, представленного ниже. Единственный специфический для браузера CSS, который я пишу, для IE (особенно IE6), хотя мне жаль, что это не так.
Теперь решение. Вы попросили его быть элегантным, поэтому я не знаю, насколько он широк, но он наверняка нацелен только на платформы Gecko.
Трюк работает только при включенном JavaScript и использует привязки Mozilla (XBL), которые сильно используются внутри Firefox и все другие продукты на базе Gecko. Для сравнения это похоже на свойство CSS поведения в IE, но гораздо более мощное.
В моем решении задействованы три файла:
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;
}
Update: Вышеупомянутое решение не так хорошо. Было бы лучше, если бы вместо добавления нового LINK-элемента он добавит класс "firefox" в элемент BODY. И это возможно, просто заменив вышеуказанный JS следующим:
this.className += " firefox";
Решение вдохновлено Моз-поведением Дин Эдвардс.
Вот некоторые браузерные хаки для таргетинга только на браузер Firefox,
_:-moz-tree-row(hover), .selector {}
var isFF = !!window.sidebar;
var isFF = 'MozAppearance' in document.documentElement.style;
var isFF = !!navigator.userAgent.match(/firefox/i);
Это будет работать, Firefox 3.6 и более поздние версии
@media screen and (-moz-images-in-menus:0) {}
Если вам нужна дополнительная информация, посетите browserhacks
Использование специальных правил -engine обеспечивает эффективный таргетинг на браузер.
<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]-->
Разница в вашей идее заключается в том, чтобы иметь server-side USER-AGENT detector
который будет определять, какую таблицу стилей присоединяться к странице. Таким образом, вы можете иметь firefox.css, ie.css, opera.css, etc
. Д.
Вы можете выполнить аналогичную вещь в самом Javascript, хотя вы можете не считать ее чистой.
Я сделал аналогичную вещь, имея default.css
который включает в себя all common styles and then specific style sheets
добавляются для переопределения или улучшения значений по умолчанию.
Единственный способ сделать это - использовать различные хаки CSS, которые сделают вашу страницу более вероятной ошибкой при следующих обновлениях браузера. Во всяком случае, это будет БЕСПЛАТНО безопасно, чем использование jiff-браузера.
Теперь, когда Firefox Quantum 57 выходит за рамки существенных и потенциально возможных улучшений для Gecko, коллективно известных как Stylo или Quantum CSS, вы можете оказаться в ситуации, когда вам нужно различать устаревшие версии Firefox и Firefox Quantum.
Из моего ответа здесь:
Вы можете использовать
@supports
с выражениемcalc(0s)
в сочетании с@-moz-document
для тестирования для Stylo-Gecko не поддерживает значения времени в выраженияcalc()
но Stylo делает:@-moz-document url-prefix() { @supports (animation: calc(0s)) { /* Stylo */ } }
Здесь доказательство концепции:
body::before { content: 'Not Fx'; } @-moz-document url-prefix() { body::before { content: 'Fx legacy'; } @supports (animation: calc(0s)) { body::before { content: 'Fx Quantum'; } } }
Следующий код имеет тенденцию выдавать предупреждения стилей стиля:
@-moz-document url-prefix() {
h1 {
color: red;
}
}
Вместо использования
@-moz-document url-prefix('') {
h1 {
color: red;
}
}
Помог мне! Получил решение для предупреждения стилизованного стиля от здесь