Implementing jQuery's shake effect with animate

前端 未结 9 2467
迷失自我
迷失自我 2020-12-14 10:38

I\'ve been given a cut down subset of the jQuery lib one of the key features I\'m missing is the .effect functions. I do however have .animate. I w

相关标签:
9条回答
  • 2020-12-14 10:59

    This is a more clean and smooth way to do the animation.

    jQuery.fn.shake = function(shakes, distance, duration) {
        if(shakes > 0) {
            this.each(function() {
                var $el = $(this);
                var left = $el.css('left');
                $el.animate({left: "-=" + distance}, duration, function(){
                    $el.animate({left: "+=" + distance * 2}, duration, function() {
                        $el.animate({left: left}, duration, function() {
                            $el.shake(shakes-1, distance, duration); });});
                });
            });
        }
        return this;
    };
    
    0 讨论(0)
  • 2020-12-14 10:59

    This is not perfect, but functional

        // Example: $('#<% =ButtonTest.ClientID %>').myshake(3, 120, 3, false);
        jQuery.fn.myshake = function (steps, duration, amount, vertical) {
            var s = steps || 3;
            var d = duration || 120;
            var a = amount || 3;
            var v = vertical || false;
            this.css('position', 'relative');
            var cur = parseInt(this.css(v ? "top" : "left"), 10);
            if (isNaN(cur))
                cur = 0;
    
            var ds = d / s;
    
            if (v) {
                for (i = 0; i < s; i++)
                    this.animate({ "top": cur + a + "px" }, ds).animate({ "top": cur - a + "px" }, ds);
                this.animate({ "top": cur }, 20);
            }
            else {
                for (i = 0; i < s; i++)
                    this.animate({ "left": cur + a }, ds).animate({ "left": cur - a + "px" }, ds);
                this.animate({ "left": cur }, 20);
            }
    
            return this;
        }
    
    0 讨论(0)
  • 2020-12-14 11:04

    I like @phpslightly solution so much, I keep using it. So here it is updated to basic jquery plugin form which will return your element

    jQuery.fn.shake = function(interval,distance,times){
       interval = typeof interval == "undefined" ? 100 : interval;
       distance = typeof distance == "undefined" ? 10 : distance;
       times = typeof times == "undefined" ? 3 : times;
       var jTarget = $(this);
       jTarget.css('position','relative');
       for(var iter=0;iter<(times+1);iter++){
          jTarget.animate({ left: ((iter%2==0 ? distance : distance*-1))}, interval);
       }
       return jTarget.animate({ left: 0},interval);
    }
    

    You would then use it like a regular plugin:

    $("#your-element").shake(100,10,3);
    

    Or use the default values (100, 10, 3):

    $("#your-element").shake();
    
    0 讨论(0)
  • 2020-12-14 11:10

    So far I have something like this ..

    jQuery.fn.shake = function(intShakes, intDistance, intDuration) {
        this.each(function() {
            $(this).css("position","relative"); 
            for (var x=1; x<=intShakes; x++) {
            $(this).animate({left:(intDistance*-1)}, (((intDuration/intShakes)/4)))
        .animate({left:intDistance}, ((intDuration/intShakes)/2))
        .animate({left:0}, (((intDuration/intShakes)/4)));
        }
      });
    return this;
    };
    
    0 讨论(0)
  • 2020-12-14 11:11

    I wrote some time ago a few simple jquery animations:

    https://github.com/yckart/jquery-custom-animations

    /**
     * @param {number} times - The number of shakes
     * @param {number} duration - The speed amount
     * @param {string} easing - The easing method
     * @param {function} complete - A callback function
     */
    jQuery.fn.shake =
    jQuery.fn.wiggle = function (times, duration, easing, complete) {
        var self = this;
    
        if (times > 0) {
            this.animate({
                marginLeft: times-- % 2 === 0 ? -15 : 15
            }, duration, easing, function () {
                self.wiggle(times, duration, easing, complete);
            });
        } else {
            this.animate({
                marginLeft: 0
            }, duration, easing, function () {
                if (jQuery.isFunction(complete)) {
                    complete();
                }
            });
        }
        return this;
    };
    
    0 讨论(0)
  • 2020-12-14 11:12

    I don't understand all the complexity being thrown into reproducing the shake effect with solely animate. Here's my solution in just a couple lines.

    function shake(div,interval=100,distance=10,times=4){
        $(div).css('position','relative');
        for(var iter=0;iter<(times+1);iter++){
            $(div).animate({ left: ((iter%2==0 ? distance : distance*-1))}, interval);
        }//for
        $(div).animate({ left: 0},interval);
    }//shake
    

    EDIT: Updated code to return element to original position. Still believe this is the lightest and best solution to the problem.

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