Kann man den CSS3-Unschärfefilter mit jQuery animieren?
Dies funktioniert als statische Methode zum Anwenden von CSS-Regeln:
item.css({'filter': 'blur('+blur+')','-webkit-filter': 'blur('+blur+')','-moz-filter': 'blur('+blur+')','-o-filter': 'blur('+blur+')','-ms-filter': 'blur('+blur+')'});
wenn ich jedoch die css-Methode durch die animierte Methode ersetze, passiert nichts.
item.animate({'filter': 'blur('+blur+')','-webkit-filter': 'blur('+blur+')','-moz-filter': 'blur('+blur+')','-o-filter': 'blur('+blur+')','-ms-filter': 'blur('+blur+')'},500);
Gibt es einen Trick, den ich nicht kenne? Wie kann ich die Unschärfe eines Artikels animieren?
Sie können die Funktion .animate()
für eine Variable mit einem numerischen Wert verwenden und entsprechend animieren. In jedem Schritt wird eine Funktion aufgerufen, und dieser neue numerische Wert wird als CSS-Filter-Unschärfe-Radius-Eigenschaft zugewiesen.
$(function() {
$({blurRadius: 0}).animate({blurRadius: 10}, {
duration: 500,
easing: 'swing', // or "linear"
// use jQuery UI or Easing plugin for more options
step: function() {
console.log(this.blurRadius);
$('.item').css({
"-webkit-filter": "blur("+this.blurRadius+"px)",
"filter": "blur("+this.blurRadius+"px)"
});
}
});
});
Minor update: Die .animate()
-Funktion von jQuery wechselt möglicherweise nicht korrekt zum endgültigen Wert, wie in eine andere Antwort unten angegeben. In diesem Fall ist es immer sicherer, einen Rückruf zu verketten, der den Unschärfekreis manuell auf den beabsichtigten Endwert setzt. Ich habe die Funktionen so modularisiert, dass sie ohne zu viele Redundanzen wiederverwendet werden können:
$(function() {
// Generic function to set blur radius of $ele
var setBlur = function(ele, radius) {
$(ele).css({
"-webkit-filter": "blur("+radius+"px)",
"filter": "blur("+radius+"px)"
});
},
// Generic function to tween blur radius
tweenBlur = function(ele, startRadius, endRadius) {
$({blurRadius: startRadius}).animate({blurRadius: endRadius}, {
duration: 500,
easing: 'swing', // or "linear"
// use jQuery UI or Easing plugin for more options
step: function() {
setBlur(ele, this.blurRadius);
},
callback: function() {
// Final callback to set the target blur radius
// jQuery might not reach the end value
setBlur(ele, endRadius);
}
});
};
// Start tweening
tweenBlur('.item', 0, 10);
});
Sie können diesen aktualisierten Code in Aktion unten im angefügten Code-Snippet anzeigen.
Es ist wichtig sich das zu merken Feuerfuchs (FF ≥35 und höher unterstützt unpräfixe CSS-Filter ), IE und Opera hat keine Unterstützung für CSS3-Filter , daher müssen keine -moz-
, -ms-
oder -o-
verwendet werden. Präfixe :)
Siehe Geige: http://jsfiddle.net/teddyrised/c72Eb/ (vor dem Update)
Das aktuellste Beispiel finden Sie unten im Code-Snippet:
$(function() {
// Generic function to set blur radius of $ele
var setBlur = function(ele, radius) {
$(ele).css({
"-webkit-filter": "blur("+radius+"px)",
"filter": "blur("+radius+"px)"
});
},
// Generic function to tween blur radius
tweenBlur = function(ele, startRadius, endRadius) {
$({blurRadius: startRadius}).animate({blurRadius: endRadius}, {
duration: 500,
easing: 'swing', // or "linear"
// use jQuery UI or Easing plugin for more options
step: function() {
setBlur(ele, this.blurRadius);
},
complete: function() {
// Final callback to set the target blur radius
// jQuery might not reach the end value
setBlur(ele, endRadius);
}
});
};
// Start tweening towards blurred image
window.setTimeout(function() {
tweenBlur('.item', 0, 10);
}, 1000);
// Reverse tweening after 3 seconds
window.setTimeout(function() {
tweenBlur('.item', 10, 0);
}, 3000);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="item">
<p>Sample text that will be blurred.</p>
<img src="http://placehold.it/500x500" />
</div>
Eine Google-Suchabfrage gab mir dieses Ergebnis Sie möchten vielleicht einen Blick darauf werfen. Ich schlage vor, nur eine Klasse in Ihrem JS umzuschalten und den Rest in Ihrem CSS zu behandeln, zum Beispiel:
var $item = $('.item'); // or any selector you want to use
$item.addClass('item--blur');
Behandeln Sie den Rest in Ihrem CSS:
.item {
transition: all 0.25s ease-out;
}
.item--blur {
// all your filters
}
Ich habe Terrys Antwort ausprobiert, die gut funktioniert hat, bis ich versucht habe, den Vorgang umzukehren, um das Entfernen des Unschärfeeffekts zu animieren. Anstatt mit einer Unschärfe von 0 zu enden, endete der Prozess mit einer Unschärfe von 0,0815133px. Die meisten Browser schienen das auf null abzurunden, aber iOS tat dies nicht und hinterließ eine deutliche Unschärfe auf der Seite. Nach der animierten Änderung durch manuelles Setzen der Unschärfe auf Null wurde Folgendes behoben:
$('.item').css({
"-webkit-filter": "blur(0)",
"filter": "blur(0)"
});