Animate blur filter

前端 未结 4 2088
感动是毒
感动是毒 2020-12-15 07:08

Is it possible to animate the CSS3 blur filter using jQuery?

This works as a static way of applying CSS rules :

item.css({\'filter\': \'blur(\'+blur         


        
相关标签:
4条回答
  • 2020-12-15 07:23

    You can use the .animate() function on a variable that is of numerical value, and animate accordingly - call a function during each step and assign that new numerical value as a CSS filter blur radius property :)

    $(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: jQuery's .animate() might not tween to the final value correctly, as noted in another answer below. In this case, it is always safer to chain a callback that manually sets the blur radius to the intended final value. I have modularised the functions so that it can be reused without too much redundancies:

    $(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);
    });
    

    You can see this updated code in action in the attached code snippet below.


    It is important to note that Firefox (FF ≥35 and above supports unprefix CSS filters), IE and Opera has no support for CSS3 filters, so there is no need to use -moz-, -ms- or -o- prefixes :)

    See fiddle: http://jsfiddle.net/teddyrised/c72Eb/ (prior to update)

    See code snippet below for the most up-to-date example:

    $(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>

    0 讨论(0)
  • 2020-12-15 07:24

    One Google Search query gave me this result you might wanna take a look at. What I suggest to do is only toggle a class in your JS and handle the rest in your CSS, for instance:

    var $item = $('.item'); // or any selector you want to use
    $item.addClass('item--blur');
    

    Handle the rest in your CSS:

    .item {
        transition: all 0.25s ease-out;
    }
    .item--blur {
        // all your filters
    }
    
    0 讨论(0)
  • 2020-12-15 07:40

    I tried Terry's answer, which worked great until I tried reversing the process to animate the removal of the blur effect. Instead of ending with a blur of 0, the process ended with a blur of 0.0815133px. Most browsers seemed to round this down to zero, but iOS didn't and left a noticeable blur on the page. Following the animated change by manually setting the blur to zero fixed this:

    $('.item').css({
      "-webkit-filter": "blur(0)",
      "filter": "blur(0)"
    });
    
    0 讨论(0)
  • 2020-12-15 07:46

    try this simple solution:

    function sleep(ms) {
        return new Promise(resolve => setTimeout(resolve, ms));
    }
    async function applyBlurFilter() {
        for (var i = 1 ; i <= 100; i++) {
            $('h1').css({ "filter": "blur(" + i/10 + "px)" });
            await sleep(40); //4 seconds (40 * 100 / 10)
        }
    }
    
    $(document).ready(function(){
      applyBlurFilter();
    });
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <h1>
      This Text is going to be blured. 
    </h1>

    0 讨论(0)
提交回复
热议问题