Play Gif on Mouseover and Pause Gif on mouse out without replacing images?

前端 未结 2 1908
感情败类
感情败类 2021-01-05 13:51

I\'m trying to look for an example of code that allows the user to animate a gif on mouseover and pause when mouse out. I\'ve seen many tutorials talking about this but I wa

2条回答
  •  隐瞒了意图╮
    2021-01-05 14:26

    So, I thought about it for a bit... You could do something cool like this:

    First, break your gif into multiple images, then animate them with css keyframes.

    #faux-gif {
        position: absolute;
        top: 0; left: 0; right: 0; bottom: 0;
        margin: auto;
        background-image: url(http://i.imgur.com/E2ee6fI.gif);
        background-repeat: no-repeat;
        background-attachment: fixed;
        background-position: center;
        width: 300px;
        height: 300px;
        /* animation: giffy 0.5s infinite linear; */
        /* no fade between frames */
        animation: giffy 0.5s infinite steps(1);
    }
    
    #faux-gif:hover {
        animation-play-state:paused;
    }
    
    @keyframes giffy {
        0%   { background-image: url('http://i.imgur.com/E2ee6fI.gif'); } 
        15%  { background-image: url('http://i.imgur.com/JIi0uul.gif'); }
        30%  { background-image: url('http://i.imgur.com/owNGnNN.gif');}
        45%  { background-image: url('http://i.imgur.com/2Ii6XOz.gif'); }
        60%  { background-image: url('http://i.imgur.com/ZmQBrQ5.gif'); }
        75%  { background-image: url('http://i.imgur.com/iAsfHyY.gif'); }
        90%  { background-image: url('http://i.imgur.com/AJwRblj.gif'); }
        100% { background-image: url('http://i.imgur.com/fx5wUNY.gif'); }
    }
    

    DEMO

    JavaScript Version... Not tested very thoroughly, but this would be the basic idea.

    window.onload = function() {
    
        function FauxGif(element, frames, speed) {
            this.currentFrame = 0,
            this.domElement   = element,
            this.frames       = frames || null,
            this.speed        = speed  || 200;
            this.interval;
            this.init();
        }
    
        FauxGif.prototype = {
            init: function() {
                // set the first one to the first image
                console.log(this.frames[0])
                this.domElement.style.backgroundImage = "url(" + this.frames[0] + ")";
            },
            pause: function() {
                clearInterval(this.interval);
            },
            resume: function() {
                var that = this;
    
                that.interval = setInterval(function(){
                    that.currentFrame < that.frames.length - 1 ? that.currentFrame++ : that.currentFrame = 0;
                    that.domElement.style.backgroundImage = "url(" + that.frames[that.currentFrame] + ")";
                }, this.speed);
            }
        }
    
        var frames = [
                        'http://i.imgur.com/E2ee6fI.gif',
                        'http://i.imgur.com/JIi0uul.gif',
                        'http://i.imgur.com/owNGnNN.gif',
                        'http://i.imgur.com/2Ii6XOz.gif',
                    'http://i.imgur.com/ZmQBrQ5.gif',
                    'http://i.imgur.com/iAsfHyY.gif',
                    'http://i.imgur.com/AJwRblj.gif',
                    'http://i.imgur.com/fx5wUNY.gif'
                ]
    
    var elem = document.querySelector('#faux-gif'),
        gif  = new FauxGif(elem, frames);
    
    
    elem.addEventListener('mouseenter', function(){
        gif.resume()
    });
    
    elem.addEventListener('mouseleave', function() {
        gif.pause();
    });
    }
    

    DEMO

提交回复
热议问题