Цвета в оттенки серого при наведении не работает в IE11

Я использую серый для нескольких элементов на сайте. Однако, я не могу заставить его работать в IE11. Например, в скрипке ниже я использую JS для добавления grayscale и grayscale-fade классы, так что изображение исчезает из цвета в оттенки серого при наведении. Как я могу заставить это работать в IE11? Автор говорит, что плагин должен быть инициализирован для IE11 (т. е. $('article.project img').gray();), но если я добавлю эту строку, все изображения станут серыми по умолчанию с самого начала. Я просто хочу, чтобы это работало в IE11. Мочь кто-нибудь, покажите мне как?

Скрипка:http://jsfiddle.net/61jcam54/

HTML-код

<div id="content">
    <article class="project">
        <img width="375" height="375" src="http://i.imgur.com/jNkpAg6.gif" alt="image-title">
        <div class="overlay" style="margin-left: -1px; width: 367px;">
            <h3>Project Title</h3>
            <a class="post-link expand" href="http://google.com">+</a>
        </div>
    </article>
</div>

в CSS

article.project {
  float: left;
  margin: 0 1% 2%;
  max-width: 375px;
  overflow: hidden;
  position: relative;
  -moz-user-select: none;
  -ms-user-select: none;
  -webkit-user-select: none;
}

article.project img {
  display: block;
  margin: 0;
  padding: 0;
  max-width: 100%;
  height: auto;
  -webkit-transition: all 0.2s ease;
  -moz-transition: all 0.2s ease;
  -o-transition: all 0.2s ease;
  -ms-transition: all 0.2s ease;
  transition: all 0.2s ease;
}

article.project .overlay {
  background: rgba(0, 0, 0, 0.8);
  bottom: 0;
  display: block;
  left: 0;
  opacity: 0;
  overflow: hidden;
  position: absolute;
  right: 0;
  top: 0;
  z-index: 1;
  -webkit-transition: all 0.2s;
  -moz-transition: all 0.2s;
  -o-transition: all 0.2s;
  transition: all 0.2s;
}

.hover .overlay, .active .overlay, .hover-sticky .overlay {
    opacity: 1;
}

article.project .overlay h3 {
  color: #FFF;
  font-size: 17px;
  font-size: 1.7rem;
  font-family: 'Montserrat',sans-serif;
  text-transform: uppercase;
  line-height: 1.3;
  margin-top: 3.3em;
  padding: 0 1em;
  position: absolute;
  text-align: center;
  top: 50%;
  width: 100%;
}

article.project .overlay .expand {
  border: 5px solid #FFF;
  bottom: 0;
  color: #FFF;
  display: block;
  font-size: 30px;
  height: 60px;
  left: 0;
  line-height: 50px;
  margin: auto;
  position: absolute;
  right: 0;
  text-align: center;
  top: 0;
  width: 60px;
  z-index: 2;
  -webkit-border-radius: 30px;
  -moz-border-radius: 30px;
  -ms-border-radius: 30px;
  -o-border-radius: 30px;
  border-radius: 30px;
}

/* GRAYSCALE */
.grayscale, .grayscale-sticky {
    /* Firefox 10+, Firefox on Android */
    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");

    /* IE 6-9 */
    filter: gray;

    /*
    Chrome 19+,
    Safari 6+,
    Safari 6+ iOS,
    Opera 15+
    */
    -webkit-filter: grayscale(100%);
}

.grayscale.grayscale-fade {
    -webkit-transition: -webkit-filter .2s;
}

.grayscale.grayscale-off,
article:hover .grayscale.grayscale-fade {
    -webkit-filter: grayscale(0%);
    filter: none;
}

.grayscale.grayscale-replaced {
    filter: none;
    -webkit-filter: none;
}

.grayscale.grayscale-replaced > svg {
    opacity: 1;
    -webkit-transition: opacity .2s ease;
    transition: opacity .2s ease;
}

.grayscale.grayscale-replaced.grayscale-off > svg,
article:hover .grayscale.grayscale-replaced.grayscale-fade > svg {
    opacity: 0;
}

JS

$('#content').on('mouseenter', 'article.project', function(){

    $(this).addClass('hover grayscale grayscale-fade');
    $(this).find('.post-link').hide();

}).on('mouseleave', 'article.project', function(){

    $(this).removeClass('hover grayscale grayscale-fade');
    $(this).find('.post-link').show();

});

2 ответов


TL; DR

здесь обновленный пример, который работает в IE11 и все другие поддерживаемые браузеры.


Exaplaination

есть несколько вопросов...

по данным плагин, который вы используете, когда браузер не поддерживает фильтры CSS3 (как в IE10 / 11), применяется следующее:

...плагин использует Modernizr._prefixes, css-filters, Inline SVG и svg-filters функция распознает из Modernizr для определения поддержки браузером. Если браузер поддерживает встроенные фильтры SVG и SVG, но не фильтры CSS, плагин заменяет элементы элементами SVG фильтрами.

С img элемент должен быть заменен элементом SVG в IE11, скрипте плагина (с Modernizr Шив) требуется для того, чтобы он работал. В приведенном примере jsFiddle скрипт jquery.gray.min.js на самом деле даже не выполнялся в IE11, так как это было заблокирован из-за несоответствия типов mime (это предупреждение было в консоли).

чтобы обойти это, я просто скопировал / вставил скрипт в пример. Кроме того, стоит отметить, что Modernizr docs заявить, что скрипт должны выполнить до the <body> нагрузки. Это кажется актуальным в IE при использовании HTML5 Shiv:

причина, по которой мы рекомендуем разместить Modernizr в голове в два раза:заточка HTML5 (которая включает элементы HTML5 в IE) должна выполняться перед <body>, и если вы используете любой из классов CSS, которые добавляет Modernizr, вы захотите предотвратить FOUC.

теперь, когда скрипт выполняется в IE11, плагин должен быть инициализирован и img элемент должен быть заменен SVG. Согласно плагину,img элементы будут автоматически заменены, если элемент имеет класс .grayscale. Кроме того, похоже, что вы можете использовать custom .gray() метод, слишком. Поскольку ваш пример фактически не давал class .grayscale до img элемент, он не был бы инициализирован в IE11.

ниже, вы заметите, что я добавил класс .grayscale до img элемент (для инициализации его в IE11). Кроме того, класс .grayscale-off также добавляется к элементу, чтобы эффект серого был выкл изначально. В обновлен jQuery, вы увидите, что этот класс просто переключаться.

вот соответствующий обновленный HTML / CSS/jQuery:

Обновленный Пример Здесь

я также немного сократил jQuery:

$('#content').on('mouseenter mouseleave', 'article.project', function (e){
    $('.grayscale', this).toggleClass('hover grayscale-off');
    $(this).find('.post-link').toggle();
});
.grayscale.grayscale-replaced > svg {
    opacity: 0;
    -webkit-transition: opacity .2s ease;
    transition: opacity .2s ease;
}
.grayscale.grayscale-replaced.grayscale-off > svg {
    opacity: 1;
}
<div id="content">
    <article class="project">
        <img width="375" height="375" class="grayscale grayscale-off" src="http://lorempizza.com/380/240" alt="image-title" />
        <div class="overlay">
            <h3>Project Title</h3>
            <a class="post-link expand" href="...">+</a>
        </div>
    </article>
</div>

IE предпочитает SVG для добавления фильтров на изображения. Вот способ достичь этого на IE10, Firefox и Chrome:http://jsfiddle.net/azx3mxmt/3/

изображения добавляются программно следующим образом:

var container = document.getElementById("container");
var src = "https://www.gravatar.com/avatar/3ab1c56fadd51711d1d94cc18aa37d8d?s=128&d=identicon&r=PG";
for (var i=200 ; i < 2200 ; i += 100) {
    container.appendChild(animation(src, i));   
}

SVG фильтры устанавливаются следующим образом:

<svg width="128" height="128" viewBox="0 0 128 128">
  <defs>
    <filter id="filter" >
      <feColorMatrix id="gray" type="saturate" values="0.5"/>
    <filter/>
  </defs>
  <image x="0" y="0" width="128" height="128"
         filter="url(#filter)"
         xlink:href="https://www.gravatar.com/avatar/3ab1c56fadd51711d1d94cc18aa37d8d?s=128&d=identicon&r=PG"/>
</svg>

другие влияния можно достигнуть с SVG. Посмотри на это!--11-->веб-сайт.