Rgba background с альтернативой фильтра IE: IE9 отображает оба!

Я пытаюсь использовать make div, прозрачно используя смесь свойств CSS3 rgba() и microsoft filter, как это:

div {
    width: 200px;
    height: 200px;
    /* blue, 50% alpha */
    background: rgba(0,0,255,0.5);
    /* red, 50% alpha */
    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#7FFF0000,endColorstr=#7FFF0000);
}

Как и ожидалось, браузеры, поддерживающие rgba(), будут отображать div как синий, тогда как IE 6-8 сделает его красным.

IE9, по-видимому, может обрабатывать оба (ранее я думал, что поддержка filter была удалена), а результат - div фиолетовый. Есть ли способ сделать IE9 поддержкой любого из этих свойств, но не другого? rgba(), очевидно, было бы предпочтительным.

N.B. Я использую IETester для запуска этих тестов. Если правильная сборка IE9 этого не делает, сообщите мне.

Ответ 1

Я придумал хакерское обходное решение, которое, как я думал, я поделюсь.

IE9 и выше поддерживают псевдо-селектор :not() CSS. Используя атрибут, который не существует в элементе, мы можем заставить IE9 отключить его filter gradient:

div {
    width: 200px;
    height: 200px;

    /* For FF, Chome, Opera, IE9+ */
    background: rgba(0,0,255,0.5);

    /* For IE6-9 */
    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#7FFF0000,endColorstr=#7FFF0000);
}

div:not([dummy]) {
    /* IE9 only */
    filter: progid:DXImageTransform.Microsoft.gradient(enabled='false');
}

В итоге я использовал это, потому что мой прозрачный div только один раз. Он также казался немного аккуратным, сохраняя вещи в CSS, вместо того, чтобы использовать условные комментарии в HTML.

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

Ответ 2

Если вы используете HTML5, вы можете пойти по пути использования

<!doctype html>
<!--[if lt IE 7 ]> <html lang="en" class="ie6 oldie"> <![endif]-->
<!--[if IE 7 ]>    <html lang="en" class="ie7 oldie"> <![endif]-->
<!--[if IE 8 ]>    <html lang="en" class="ie8 oldie"> <![endif]-->
<!--[if IE 9 ]>    <html lang="en" class="ie9"> <![endif]-->
<!--[if (gt IE 9)|!(IE)]><!-->
<html lang="en" class="gtie9 modern">
<!--<![endif]-->

и в вашем CSS используйте что-то вроде:

.ie9 .element {filter: none; }

Ответ 3

Это работает для меня (не полностью протестировано во всех версиях). Согласно обсуждениям в этом блоге: селектор root доступен только в IE9, и, таким образом, приведенный ниже код можно записать, чтобы удалить все настройки фильтра в IE9.

:root *
{
    filter: progid:DXImageTransform.Microsoft.gradient(enabled='false') !important;
}

Изменить:! важно, чтобы убедиться, что он работает во всех местах.

Ответ 4

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

http://www.positioniseverything.net/articles/cc-plus.html

Ответ 5

Самый простой и надежный метод фильтрации: совместимость, которую я нашел, использует код http://www.colorzilla.com/gradient-editor/ генерирует:

<!--[if gte IE 9]>
  <style type="text/css">
    .gradient {
       filter: none;
    }
  </style>
<![endif]-->

Затем вы добавляете класс gradient CSS к элементу, который в нем нуждается. И что это.

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

Помните, что Microsoft отказала условным комментариям от IE10 и выше, но вы почти никогда не нуждаетесь в них для этих версий.

Я тоже не буду доверять IETester; загрузить виртуальную машину с соответствующим IE9 из https://www.modern.ie/en-gb - бесплатно; все, что вам нужно, - это время и пространство на диске (сохраните исходную загрузку, поэтому, когда она истечет, вы можете просто переустановить.)