2009-07-13 1 views
30

Есть ли способ сделать некоторые правила CSS видимыми только для Opera (9.5 +)?Как сделать CSS видимым только для Opera

+2

, что является причиной, что вы хотите сделать это? как было указано несколькими людьми, это, как правило, не лучший способ решить проблемы с CSS (IE исключен), если мы понимаем, в чем заключается основная проблема, мы могли бы предложить что-то более подходящее. – roryf

+0

Работает ли это для Opera 12 ? –

+0

@roryf Я понимаю, что ваш вопрос был почти 4 года назад, но, чтобы ответить на вопрос, одна из причин этого - в случае ошибки, упомянутой здесь: http://my.opera.com/community/forums/topic. dml? id = 1436202, где некоторые версии Opera 12 смешивают шрифты, если некоторая библиотека шрифтов испорчена. Да, это редкий случай, но тот, который мой клиент случайно обнаружил. Случайные текстовые элементы оказались беспорядочными, и я не мог просто сказать ей: «О, ну, некоторым пользователям Opera придется смириться с этим». –

ответ

15

Этот хак работает на последнюю оперу:

@media all and (-webkit-min-device-pixel-ratio:10000), not all and (-webkit-min-device-pixel-ratio:0) { 
     #id {css rule} 
} 

Это не касается какого-либо другого браузера, насколько я проверял, но это может быть актуальным в течение нескольких месяцев, с вебом-технологиями бум и т.д.

+3

Использование Виталия Батонова селектора: -o-prefocus намного проще. – Komputist

+0

Я слышу, что теперь это влияет на хром> v17, а также – Kasapo

+0

Это все еще работает в Opera 12? –

1

Единственный способ, с помощью которого я могу думать, это проверить агент пользователя и ссылаться только на таблицу стилей, когда это браузер Opera. Так как пользовательский агент может быть запутан, это может быть не на 100% надежным.

0

Ни в коем случае я не рекомендовал бы.

Проверьте, есть ли у вас браузер Javascript или PHP для браузера. Однако некоторые из них могут быть настолько устаревшими, что вам нужно добавить обнаружение для Opera 9.5+.

Браузерные снифферы (для укладки), как правило, представляют собой плохую практику.

Также обратите внимание, что Opera 9.5+ предоставляет пользователям возможность маскировки своего браузера как IE, что делает любой вид нюхания бесполезным.

Редактировать: Как вы можете видеть в другом ответе, есть window.opera.version(). Я не знал, что объект window.opera содержит эту информацию. ОДНАКО, вам, вероятно, стоит посмотреть, доступен ли этот объект, когда кто-то установил Opera как IE или какой-либо другой браузер.

+0

Включает ли опция «masquerade as IE» скрытие переменной 'window.opera'? Если нет, обнаружение должно быть возможно через JavaScript, по крайней мере. –

+0

Если объект 'window.opera' - это единственное, что нужно сделать, вы не можете различать Opera 9.5+ и более ранние версии. Ответчик ссылался на Opera 9.5+ специально, поэтому я не уверен, что он ТОЛЬКО НАХОДИТСЯ около 9.5+, или если ему специально нужно настроить таргетинг на 9,5+. Изменит мой ответ. – jonwd7

+0

Конечно, понятия не имел, что есть 'window.opera.version()' ... Показывает, насколько я забочусь о Opera. :) – jonwd7

1

Вы можете использовать javascript, чтобы написать <link>, чтобы включить конкретный файл CSS.

if (navigator.userAgent.indexOf(’Opera’) != -1) { 
    document.write(””); 
} 
else { 
    document.write(””); 
} 

Для Opera 7 вы можете использовать это:

/*Visible to only Opera*/ 
@media all and (min-width: 0) { 
    /* css rules here */ 
} 

Однако, это вообще плохая практика, чтобы сделать моделирование на основе браузера обнюхивать.

+1

Я, конечно же, не хочу обманывать браузер, или любой вид JavaScript или обнаружения на стороне сервера. Мне нужно сделать некоторые правила видимыми только для оперы, чтобы отображать закругленные углы CSS на элементах с рамкой. –

+0

Другие браузеры присоединились к вечеринке Media Query, поэтому этот хак теперь устарел. – Kornel

+2

И, следовательно, это отличный пример того, почему вы должны избегать CSS-хаков. –

8

С чистого CSS хак вы можете быть не в состоянии безопасно ограничить верхнюю версию вы взлома (например, -o-prefocus может поддерживаться долго после того, как ваш хак останавливает фиксирующих вещи и начинает ломать их).

// remember to limit maximum version, because hacking all future versions 
// will eventually break the page 
if (window.opera && window.opera.version() < 10)  
{ 
    document.documentElement.className += ' opera9'; 
} 

и в CSS:

.opera9 .element-to-hack { /*declarations for opera <= 9 only*/ } 

Но пожалуйста перепроверить CSS спецификации первых, чтобы убедиться, что вы взлома на самом деле ошибка. Opera 10 имеет полную поддержку CSS2.1 и передает все тесты Acid, поэтому, если что-то не отображается правильно, возможно, это связано с другими причинами (ошибка где-то еще в коде, детали или в углу, на который вы не должны положиться, и т. Д. .)

+0

См. Комментарий Виталия Батанова: есть * чистый трюк CSS. В противном случае этот трюк, конечно, достаточно хорош. Но чистый трюк CSS должен оцениваться выше. – Komputist

+0

@ Komputist Я не согласен, часто вы хотите взломать конкретные версии браузера, потому что, когда ошибка браузера исправлена, ваш хак часто будет вызывать некоторые новые нежелательные действия. Вот почему JS взломать лучше, imho. – c69

6

Не думайте, что «обнаружите Opera».

Подумайте, «обнаружите браузеры, которые не поддерживают функцию x».Например, этот оператор JavaScript позволяет обнаружить браузеры, которые поддерживают Мос-граница радиуса:

typeof (getComputedStyle(document.body, '').MozBorderRadius)=='string' 

и это эквивалент WebKit на основе браузеров (Safari, Chrome):

typeof (getComputedStyle(document.body, '').WebKitBorderRadius)=='string' 

Введении, что вместе мы можем придумать что-то вроде

function detectBorderRadiusSupport(){ 
    var styleObj; 
    if(window.getComputedStyle){ 
     styleObj=window.getComputedStyle(document.body, ''); 
    }else{ 
     styleObj=document.body.currentStyle; 
    } 
    return typeof styleObj.BorderRadius != 'undefined' || typeof styleObj.MozBorderRadius != 'undefined' || typeof styleObj.WebKitBorderRadius != 'undefined'; 
} 

// the below must be inside code that runs when document.body exists, for example from onload/document.ready/DOMContentLoaded event or inline in body 

if(!detectBorderRadiusSupport())document.body.className+=' fakeBorderRadius'; 

CSS:

body.fakeBorderRadius .roundMyCorners{ 
    /* CSS for Opera and others to emulate rounded corners goes here, 
    typically various background-image and background-position properties */ 
} 

Оговорка: непроверенная :-p

+3

Я просто хочу добавить, что, когда браузер якобы поддерживает функцию, это не значит, что ее реализация безупречна. Поэтому в некоторых случаях вы можете вообще отключить функцию для определенного браузера. Как и «box-shadow» в Opera 10.53, все еще есть проблемы с перерисованием. В этом случае я не вижу другого способа, кроме как скрывать его от Opera. Вы? – RamboNo5

+4

Если вы можете уйти с игнорированием временной ошибки браузера, я бы посоветовал вам это сделать. Поэтому, если проблема чисто косметическая без влияния на функциональность, я бы посоветовал вам ничего не делать об этом. Даже если это делает Opera хуже для некоторых пользователей, сталкивающихся с проблемой, я думаю, что лучше избегать обходных решений и хаков, которые могут вызвать проблемы. – hallvors

+0

Я считаю, что речь идет о чистом CSS-трюке - см. Трюк Виталия Батонова, используя селектор CSS, который поддерживает Opera. – Komputist

3

Вы можете использовать Modernizr (http://www.modernizr.com/) для выявления возможностей CSS, которые вы хотите использовать - она ​​применяет имена классов к элементу тела, так что вы можете построить свой CSS соответственно.

+0

То, что, как мне кажется, является чистым трюком CSS , – Komputist

1

< ссылка HREF = "opera.css" отн = тип "таблица стилей" = "текст/опера" СМИ = "все"/>

sample here

+2

Chrome 6.0.472.59, кажется, читается из этой таблицы стилей, в то время как Opera 10.62 этого не делает. –

+0

Этот трюк недействителен - не соответствует стандартам. Плюс, что он не работает, согласно предыдущему комментатору. – Komputist

1

<link href="opera.css" rel="stylesheet" type="text/opera" media="all" />

Хотя это решение скорее взлома CSS, и нет гарантии, что оно будет поддерживаться в будущих выпусках Opera. Вы могли бы также рассмотреть возможность использования следующего решения:

@media all and (-webkit-min-device-pixel-ratio:10000),not all and (-webkit-min-device-pixel-ratio:0) {

.element{/*style for opera only*/}

}

http://bookmarks-online.net/link/1308/css-including-style-for-opera-only

3

Я написал расширение .поддержки JQuery $ для обнаружения поддержки CSS свойств.

http://gist.github.com/556448


Кроме того я написал небольшой фрагмент кода, чтобы сделать действительно мало поставщиков хаки:

// Sets browser infos as html.className 
var params = []; 
$.each($.browser, function(k, v) { 
    var pat = /^[a-z].*/i; 
    if(pat.test(k)) { params.push(k); } 
}); 
params = params.join(' '); 
$('html').addClass(params); 

Это приводит, например, в:

<html lang="de" class="webkit version safari"> 
or 
<html lang="de" class="opera version"> 

В ваших Stylesheets использовать его таким образом:

html.opera #content_lock { 
    background:rgba(0,0,0,0.33); 
} 
59

отлично подходит для Opera 10.63

noindex:-o-prefocus, .class { 
    color:#fff; 
} 
+0

Работает в Opera 11.11 тоже – Radek

+2

Отличный трюк. Только то, что я искал: Селектор CSS, который работает только в Opera. Однако вы можете упростить его следующим образом: *:-o-prefocus,body {background-color:red;} Komputist

+7

Theroy за этим трюком заключается в том, что a) браузеру необходимо игнорировать все правило CSS, если есть один селектор, который он не поддерживает. И б) поскольку этот селектор использует -офикс, только Opera должна поддерживать его - все остальные должны игнорировать его. – Komputist

0

@certainlyakey работает удивительным для меня:

@media все и (-webkit-мин-устройства пиксел соотношение: 10000), а не все, и (-webkit-мин-устройства-пиксельного -ratio: 0) { #id {css rule} }

У меня есть страница с кнопкой, и текст не будет отображаться правильно в Opera. Кнопка появляется много раз (добавьте в корзину). После применения этого исправления он отлично работал.

6

Opera12

@media (min-resolution: .001dpcm) { 
    _:-o-prefocus, .class { 
     background: red; 
    }; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^