Цвет в оттенки серого при наведении не работает в 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 6

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 shiv). В приведенном вами примере jsFiddle скрипт jquery.gray.min.js фактически даже не выполнялся в IE11, так как он был заблокирован из-за несоответствия типов mime (это предупреждение было в приставка).

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

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

Теперь, когда скрипт фактически выполняется в IE11, плагин должен быть инициализирован и элемент img должен быть заменен на SVG. Согласно плагину, элементы img будут автоматически заменены, если элемент имеет класс .grayscale. Кроме того, похоже, что вы также можете использовать пользовательский метод .gray(). Поскольку ваш пример на самом деле не давал класс .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. Посмотрите на этот веб-сайт.