Изображение в градациях серого с помощью CSS в Safari 5.x

Я пытаюсь показать некоторые изображения на странице, где они должны отображаться в оттенках серого, за исключением случаев, когда при наведении мыши они плавно переходят в цвет. Я заставил его хорошо работать в IE, Chrome и Firefox, но он не работает в Safari 5.x. Проблема в Safari для Mac и Safari для Windows. Вот код, который у меня есть до сих пор:

filter: url('desaturate.svg#greyscale'); 
filter: gray;
-webkit-filter: grayscale(1);

Первая строка загружает внешний фильтр .svg (я не встраиваю его в правило url("data:..., потому что хочу избежать ошибка в старых версиях Firefox).

Вторая строка предназначена для IE и работает так же хорошо, как filter:progid:DXImageTransform.Microsoft.BasicImage(grayScale=1);.

Последняя строка о webkit должна работать в Safari 6 и выше, а также в Chrome.

Существует ли правило CSS для отображения изображений в оттенках серого в Safari 5.x? Или, если это невозможно, может ли кто-нибудь порекомендовать решение javascript, предпочтительно такое, которое будет обрабатывать анимацию в градациях серого и обратно? Я хотел бы избежать взлома на стороне сервера с изображениями в градациях серого, потому что это испортит мой HTML, а затем мне придется выполнить какое-то неприятное определение браузера, чтобы условно отображать HTML.

Спасибо

Изменить:

Поскольку это оказался «важный вопрос», пожалуйста, не публикуйте здесь больше ответов, которые работают только в Safari 6 и более поздних версиях, или ответов, содержащих файл .svg в URL-адресе данных. В то время, когда я писал OP, для меня было важно поддерживать некоторые версии Safari и Firefox, которые сегодня считаются очень устаревшими, но, тем не менее, это был мой первоначальный вопрос.

Мне хорошо известно, что в современных браузерах фильтрация оттенков серого легко выполняется с помощью нескольких строк кода CSS, но графический дизайнер использовал Safari 5.x, а клиент использовал Firefox 3.x. в то время я делал этот проект. Решение, которое сработало для меня, было предложено Giona, то есть использовать Modernizr для проверки CSS-фильтрации, а если он не поддерживается, вернуться к javascript.

Если бы я делал то же самое сегодня, я бы сказал обоим, чтобы они обновили свои браузеры!


person alexg    schedule 02.10.2012    source источник


Ответы (4)


Как вы можете видеть на caniuse.com , в настоящее время фильтры CSS3 поддерживаются очень немногими браузерами.

Есть много резервных вариантов JavaScript/jQuery, если вы погуглите «плагин javascript в градациях серого». Вот некоторые:

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

Я пробовал jQuery Black And White давным-давно, и это доставило мне много проблем с изображениями с относительным/абсолютным позиционированием, поэтому может быть, избежать этого.


Включив эту сборку Modernizr на свои страницы, вы можете настроить браузер, не поддерживающий фильтры, через Javascript:

if(!Modernizr.css_filters){
    /* javascript fallback here */
}

или CSS:

.no-css_filters .element {
    /* css fallback here */
}

Да, и не забывайте, что dowebsites нужно смотреть точно так же во всех браузерах?

person Giona    schedule 02.10.2012
comment
Эй, чувак, спасибо за ссылки. Позже я посмотрю на них и посмотрю, какой из них поможет мне, и я отчитаюсь здесь. Hoverizr выглядит многообещающе. Кроме того, мне нравится идея использовать для этого Modernizr, так что спасибо и за это. Что касается вашего последнего пункта, я согласен, но попробуйте рассказать об этом моему клиенту и графическому дизайнеру. вздох - person alexg; 02.10.2012
comment
Эхехех я знаю, клиенты и маньяки фотошопа не могут понять. Modernizr — один из самых полезных инструментов для веб-дизайнеров. Вы также можете легко добавлять собственные тесты! Хорошее кодирование @alexg - person Giona; 02.10.2012
comment
Наконец-то я созрел для этого. Оказывается, я использовал Grayscale.js. Ваша вторая и третья ссылки — это один и тот же проект, и в нем была ошибка, из-за которой предполагалось (строка 82 в исходном коде), что изображения — это ‹img src=›, а мои — фоновые изображения. Кроме того, правильная ссылка для сборки modernizr: modernizr.com/download/ потому что вам также нужны _prefixes для проверки фильтров css. Теперь он должен работать в Safari 3.1 и выше, согласно caniuse.com/canvas. У меня не работала анимация, но я думаю, что она в порядке. - person alexg; 05.10.2012
comment
Если кому-то интересно, я использовал Safari 5.0.3 для Windows, чтобы протестировать его. - person alexg; 05.10.2012
comment
примечание: подключаемый модуль jQuery GreyScale не работает в Chrome 24 из-за проблем междоменной безопасности. - person Raptor; 05.02.2013
comment
Для тех у кого тоже были ошибки, это не Modernizr.css_filters, а скорее Modernizr.cssfilters. Также обратите внимание, что вам может потребоваться либо загрузить пользовательскую сборку с обнаружением фильтра CSS, либо загрузить тест, расположенный по адресу feature-detects/css-filters.js в репозитории. - person user1429980; 26.04.2013
comment
Для тех, кто ищет, как использовать эти методы с картами Google, взгляните на Google Maps JavaScript API v3 - Styled maps. - person zveljkovic; 20.03.2015

На самом деле все очень просто:

Я попытался использовать запасной вариант javascript, но это действительно не имело смысла, и это было очень медленно на больших изображениях. Это имело гораздо больше смысла. Обратите внимание, что для grayscale появился новый синтаксис, и мне пришлось вручную редактировать получившийся минимизированный CSS из LESS.

Вот мой миксин:

.filter (...) {
    -webkit-filter: @arguments;
    -moz-filter: @arguments;
    -ms-filter: @arguments;
    -o-filter: @arguments;
    filter: @arguments;
}

И мой класс:

.grayscale-hover, .home-image {
    filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#grayscale"); /* Firefox 10+, Firefox on Android see http://jsfiddle.net/KDtAX/487/*/
    .filter(grayscale(1) blur(1px));
    filter: gray; /* IE6-9 */
    -webkit-backface-visibility: hidden; /* Fix for transition flickering */
    &:hover {
        .filter(none);
        filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'grayscale\'><feColorMatrix type=\'matrix\' values=\'1 0 0 0 0, 0 1 0 0 0, 0 0 1 0 0, 0 0 0 1 0\'/></filter></svg>#grayscale");
    }
}

Работает и протестировано в IE 6+, Firefox, Chrome.

person user1429980    schedule 26.04.2013
comment
Эй, спасибо. +1 за тщательную работу, но работает ли он в Safari 5.1, как я спрашивал в своем ОП? У меня сейчас нет доступа к этому браузеру. И, как я уже упоминал в OP, встраивание фильтра svg с использованием URL-адреса data: не работает в некоторых старых версиях FF (например, 4.0.1). - person alexg; 26.04.2013

Это что-то вроде этого:

.grayscale {    
   filter: url(css/grayscale.svg#greyscale);    
   -webkit-filter: grayscale(1);    
   -moz-filter: grayscale(100%);    
   -ms-filter: grayscale(100%);    
   -o-filter: grayscale(100%);    
} 

Вам также необходимо загрузить файл svg.

person Molnar Raul    schedule 09.03.2013
comment
Добро пожаловать в Stack Overflow! Спасибо, что опубликовали свой ответ! Обязательно внимательно прочитайте Часто задаваемые вопросы о саморекламе. Также обратите внимание, что требуется публиковать заявление об отказе от ответственности каждый раз, когда вы ссылаетесь на свой собственный сайт/продукт. Я удаляю вашу ссылку, чтобы никто не пометил это как спам. - person Andrew Barber; 11.03.2013

Это отлично сработало для меня:


img { float:left;
filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'grayscale\' filterRes=\'800\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#grayscale"); /* Firefox 10+ */
    filter: gray; /* IE6-9 */
    -webkit-filter: grayscale(100%); /* Chrome 19+ & Safari 6+ */
    -webkit-backface-visibility: hidden; /* Fix for transition flickering */
    -webkit-transition: all 1.5s ease;
       -moz-transition: all 1.5s ease;
        -ms-transition: all 1.5s ease;
         -o-transition: all 1.5s ease;
            transition: all 1.5s ease;
            z-index: 40 !important;
             display:block;

 }

img:hover { 
  filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'grayscale\' filterRes=\'800\'><feColorMatrix type=\'matrix\' values=\'1 0 0 0 0, 0 1 0 0 0, 0 0 1 0 0, 0 0 0 1 0\'/></filter></svg>#grayscale");
    -webkit-filter: grayscale(0%);}

Однако в Safari изображения выглядят действительно переэкспонированными (но они в оттенках серого). И переход не поддерживается Firefox.

person Rikard Isacsson    schedule 21.05.2013