Цвет в оттенки серого при наведении не работает в 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 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. Посмотрите на этот веб-сайт.