问题 完成vimeo视频播放时反转动画


我有一个视频模块,使用闪屏和点击,显示屏幕大小667 +的全屏视频。我希望在结束视频后将其反转为动画,以便返回到初始屏幕。我不确定从哪里开始或者这是否可能。任何帮助表示赞赏!

    $(function(){

    var $parent = $('.video-hero'),
            $video = $parent.find('iframe'),
            $playButton = $(".play"),
            $itemsToFadeOut = $(".vid-cap, .ghost"),
            f = $video[0],
            url = $video.attr('src').split('?')[0],
            activeVideoClass = "video-started";

            // setup fitVids
            $parent.fitVids();

            // handle play click
            $playButton.click(function(e){

                e.preventDefault();

                // grab height of video
                var videoHeight = $video.height();

                // add class to hero when video is triggered
                $parent.addClass(activeVideoClass);

                // fade out the play button
                $(this).fadeOut("fast");

                // fade out poster image, overlay, and heading
                $itemsToFadeOut.fadeOut();

                // toggle accessibility features
                $video.attr({
                    "aria-hidden" : "false",
                    "tabindex" : "0"
                });

                // set focus to video for accessibility control
                $video.focus();

                // set height of hero based on height of video
                $parent.css("max-height",videoHeight).height(videoHeight);

                // send play command to Vimeo api
                runCommand('play');

            });

            // send play to vimeo api
            var runCommand = function(cmd){
                var data = {method : cmd};
                f.contentWindow.postMessage(JSON.stringify(data), url);
            }

            // handle resize
            $(window).resize(function(){
                var videoHeight = $video.height();
                if($(".video-started").size() === 1){
                    $parent.height(videoHeight);
                }
            });

});

记得要调整我的大小 的jsfiddle 所以你能看到我正在谈论的动画。


5079
2017-07-24 20:48


起源

检查一下 developer.vimeo.com/player/js-api - maioman
Firefox浏览器中不显示全屏。 - Sabyasachi Mishra
@SabyasachiMishra它被JSFiddle阻止在FF中,但是我们网站的域名播放得很好,感谢您的提升! - knocked loose
@maioman,我看过那里,但仍然无法识别视频结尾? - knocked loose
@ user4875251,咳咳,找到 addEventListener 在该页面上和下面是列出事件的表格,包括 finish,这似乎是你需要的。 - wOxxOm


答案:


想出来的每个人!我将逐步解释每一块代码,以供将来参考。

如果没有froogaloop cdn,我就能完成我需要做的事情 fitvids.js 这是一个工作 小提琴 我的解决方案。

我在下面的部分列出了我的所有JS,但是对于我在“视频完成后撤消我的功能”问题的答案,你只需要注意我的 事件处理程序连接到API,和 玩家状态函数。一旦我能够建立连接并读取视频结束,我就用了 addClass(); 和 removeClass(); 再加上CSS Transitions 处理我的交换  和 准备好(完成后) 状态。

我尽可能多地记录和解释,希望这可以帮助将来的某个人!

命名我的Vars

这里不多提,这只是初步的,要注意的主要是 var url 这是我写它的唯一方法,允许我使用Vimeo api的听众。

var parent = $('.video-hero'), 
                 f = $('iframe'),
                 $playButton = $(".play"),
                 $itemsToFadeOut = $(".vid-cap, .ghost, .play"),
                 $video = f[0],
                 url = f.attr('src').split('?')[0],
                 activeVideoClass = "video-started", //Class for when video is playing
           standardClass = "standard"; //Class for when video is finished/before play

事件监听器/处理程序

我的听众只是等待来自api /播放器的关于视频是否是的消息 readypausedfinished 要么 playING。

听众

// Listen for messages from the player
if (window.addEventListener){
    window.addEventListener('message', onMessageReceived, false);
}
else {
    window.attachEvent('onmessage', onMessageReceived, false);
}

我的处理程序很好......当我的函数被触发时处理。我的函数位于下面,这只是让我选择从API发送的状态(case)以及如何对它做出反应。

处理器

// Handle messages received from the player
function onMessageReceived(e) {
    var data = JSON.parse(e.data);

    switch (data.event) {
        //Ready case is before play / after finish
            case 'ready':
            onReady();
            break;

        case 'pause':
            onPause();
            break;

        case 'finish':
            onFinish();
            break;
    }
}

连接到Vimeo API

本节与我的html手挽手沟通 play 按钮和vimeo的api /播放器,允许我运行,暂停和停止视频

// send play to vimeo api
            var runCommand = function(cmd){
                var data = {method : cmd};
                f[0].contentWindow.postMessage(JSON.stringify(data), url);
            }


// Helper function for sending a message to the player
function post(action, value) {
    var data = { method: action };

    if (value) {
        data.value = value;
    }

    f[0].contentWindow.postMessage(JSON.stringify(data), url);
}

玩家状态函数

根据玩家所处的状态或情况会发生什么

function onReady() {
    post('addEventListener', 'finish');

}

  function onPause() {
    console.log('paused');
}

function onFinish() {
  // add class to hero when video is triggered
                parent.removeClass(activeVideoClass);
parent.addClass(standardClass);
                // fade out the play button
                $(this).fadeIn("slow");
                // fade out poster image, overlay, and heading
                $itemsToFadeOut.fadeIn();

}

10
2017-07-27 18:42





要检测视频的结尾并运行JS代码,您可能需要使用Froogaloop库:

https://developer.vimeo.com/player/js-api#universal-with-froogaloop

然后你可以这样做:

var player = $f(iframe[0]);

player.addEvent('ready', function() {
    player.addEvent('finish', function() {
        // Animation...
    });
});

不同的事件在这里: https://developer.vimeo.com/player/js-api#events

我在最近建立的网站上执行此操作,以关闭视频结束/结束时的模态窗口: http://billy.fm/

随意检查那里的JS代码(未经授权的版本): http://billy.fm/wp-content/themes/billy/js/main.js

希望我有更多时间来帮助你,但这应该让你走上正轨。


3
2017-07-27 14:24



我已经有了这个,但是我无法跟踪它的完成情况。 - knocked loose
我尝试使用它并得到了一个 'iframe is undefined 错误所以我把它转换成了 var player = $f('iframe'); 清除了错误但在视频完成时仍然没有发出警报。 :/ - knocked loose
一旦我第二天有足够的时间,我会尝试进一步更新。祝你好运。 - Michael Giovanni Pumo
我终于弄清楚如何让它读取视频已经结束,现在我只需要反转我的动画。 - knocked loose