Bonjour à tous,

Je suis actuellement en train de réaliser une landing page.
Je souhaiterais avoir une vidéo d'intro au site en html5.
J'ai trouvé ce jQuery qui a l'air très bien :

http://syddev.com/jquery.videoBG/index.html

J'ai pu le configurer pour qu'il ne joue la vidéo qu'une seule fois.
Mais comment puis-je faire pour qu'une fois la vidéo terminée
le visiteur se retrouve sur le site (avec mes infos, menu etc).

Merci de votre aide.

ps : le code du jquery est joint à mon message si ça peut aider.



/**
 * @preserve Copyright 2011 Syd Lawrence (  www.sydlawrence.com  ).
 * Version: 0.2
 *
 * Licensed under MIT and GPLv2.
 *
 * Usage: $('body').videoBG(options);
 *
 */

(function( $ ){

	$.fn.videoBG = function( selector, options ) { 
		
		var options = {};
		if (typeof selector == "object") {
			options = $.extend({}, $.fn.videoBG.defaults, selector);
		}
		else if (!selector) {
			options = $.fn.videoBG.defaults;
		}
		else {
			return $(selector).videoBG(options);		
		}
		
		var container = $(this);
		
		// check if elements available otherwise it will cause issues
		if (!container.length)
			return;
		
		// container to be at least relative
		if (container.css('position') == 'static' || !container.css('position'))
			container.css('position','relative');
		
		// we need a width
		if (options.width == 0)
			options.width = container.width();
		
		// we need a height
		if (options.height == 0)
			options.height = container.height();	
		
		// get the wrapper
		var wrap = $.fn.videoBG.wrapper();
		wrap.height(options.height)
			.width(options.width);
		
		// if is a text replacement
		if (options.textReplacement) {
		
			// force sizes
			options.scale = true;
			
			// set sizes and forcing text out
			container.width(options.width)
				.height(options.height)
				.css('text-indent','-9999px');
		}
		else {
		
			// set the wrapper above the video
			wrap.css('z-index',options.zIndex+1);
		}
		
		// move the contents into the wrapper
		wrap.html(container.html());
		
		// get the video
		var video = $.fn.videoBG.video(options);
		
		// if we are forcing width / height
		if (options.scale) {
			
			// overlay wrapper
			wrap.height(options.height)
				.width(options.width);
			
			// video
			video.height(options.height)
				.width(options.width);
		}
		
		// add it all to the container
		container.html(wrap);
		container.append(video);
		
		return this;
	}

	// set to fullscreen
	$.fn.videoBG.setFullscreen = function($el) {
		var windowWidth = $(window).width(),
			windowHeight = $(window).height();

		$el.css('min-height',0).css('min-width',0);
		$el.parent().width(windowWidth).height(windowHeight);
		// if by width 
		if (windowWidth / windowHeight > $el.aspectRatio) {
			$el.width(windowWidth).height('auto');
			// shift the element up
			var height = $el.height();
			var shift = (height - windowHeight) / 2;
			if (shift < 0) shift = 0;
			$el.css("top",-shift);
		} else {
			$el.width('auto').height(windowHeight);			
			// shift the element left
			var width = $el.width();
			var shift = (width - windowWidth) / 2;
			if (shift < 0) shift = 0;
			$el.css("left",-shift);
			
			// this is a hack mainly due to the iphone
			if (shift === 0) {
				var t = setTimeout(function() {
					$.fn.videoBG.setFullscreen($el);
				},500);
			}
		}

		$('body > .videoBG_wrapper').width(windowWidth).height(windowHeight);
			
	}

	// get the formatted video element
	$.fn.videoBG.video = function(options) {
		
		$('html, body').scrollTop(-1);

		// video container
		var $div = $('<div/>');
		$div.addClass('videoBG')
			.css('position',options.position)
			.css('z-index',options.zIndex)
			.css('top',0)
			.css('left',0)
			.css('height',options.height)
			.css('width',options.width)
			.css('opacity',options.opacity)
			.css('overflow','hidden');
		
		// video element
		var $video = $('<video/>');
		$video.css('position','absolute')
			.css('z-index',options.zIndex)
			.attr('poster',options.poster)
			.css('top',0)
			.css('left',0)
			.css('min-width','100%')
			.css('min-height','100%');
		
		if (options.autoplay) {
			$video.attr('autoplay',options.autoplay);
		}

		// if fullscreen
		if (options.fullscreen) {
			$video.bind('canplay',function() {
				// set the aspect ratio
				$video.aspectRatio = $video.width() / $video.height();
				$.fn.videoBG.setFullscreen($video);
			})

			// listen out for screenresize
			var resizeTimeout;
			$(window).resize(function() {
				clearTimeout(resizeTimeout);
				resizeTimeout = setTimeout(function() {
					$.fn.videoBG.setFullscreen($video);
				},100);	
			});
			$.fn.videoBG.setFullscreen($video);
		}
			
		
		// video standard element
		var v = $video[0];
		
		// if meant to loop
		if (options.loop) {
			loops_left = options.loop;
		
			// cant use the loop attribute as firefox doesnt support it
			$video.bind('ended', function(){
				
				// if we have some loops to throw
				if (loops_left)
					// replay that bad boy
					v.play();
				
				// if not forever
				if (loops_left !== true)
					// one less loop
					loops_left--;
  			});
		}
		
		// when can play, play
		$video.bind('canplay', function(){
			
			if (options.autoplay)
				// replay that bad boy
				v.play();
				
		});
		
		
		// if supports video
		if ($.fn.videoBG.supportsVideo()) {

		  	// supports webm
		  	if ($.fn.videoBG.supportType('webm')){
		  		
		  		// play webm
		  		$video.attr('src',options.webm);
		  	}
		  	// supports mp4
		  	else if ($.fn.videoBG.supportType('mp4')) {	  	
		  		
		  		// play mp4
		  		$video.attr('src',options.mp4);
		  		
		  	//	$video.html('<source src="'.options.mp4.'" />');
		  		
		  	}
		  	// throw ogv at it then
		  	else {
		  		
		  		// play ogv
		  		$video.attr('src',options.ogv);
		  	}
	  	
	  	}
	  	
	  	
		
		// image for those that dont support the video	
		var $img = $('<img/>');
		$img.attr('src',options.poster)
			.css('position','absolute')
			.css('z-index',options.zIndex)
			.css('top',0)
			.css('left',0)
			.css('min-width','100%')
			.css('min-height','100%');
		
		// add the image to the video
		// if suuports video
		if ($.fn.videoBG.supportsVideo()) {
			// add the video to the wrapper
			$div.html($video);
		}
		
		// nope - whoa old skool
		else {
			
			// add the image instead
			$div.html($img);
		}
		
		// if text replacement
		if (options.textReplacement) {
	
			// force the heights and widths
			$div.css('min-height',1).css('min-width',1);
			$video.css('min-height',1).css('min-width',1);
			$img.css('min-height',1).css('min-width',1);
			
			$div.height(options.height).width(options.width);
			$video.height(options.height).width(options.width);
			$img.height(options.height).width(options.width);	
		}
		
		if ($.fn.videoBG.supportsVideo()) {
			v.play();
		}
		return $div;
	}
	
	// check if suuports video
	$.fn.videoBG.supportsVideo = function() {
		return (document.createElement('video').canPlayType);
	}
	
	// check which type is supported
	$.fn.videoBG.supportType = function(str) {
		
		// if not at all supported
		if (!$.fn.videoBG.supportsVideo())
			return false;
		
		// create video
		var v = document.createElement('video');
		
		// check which?
		switch (str) {
			case 'webm' :
				return (v.canPlayType('video/webm; codecs="vp8, vorbis"'));
				break;
			case 'mp4' :
				return (v.canPlayType('video/mp4; codecs="avc1.42E01E, mp4a.40.2"'));
				break;
			case 'ogv' :
				return (v.canPlayType('video/ogg; codecs="theora, vorbis"'));
				break;			
		}
		// nope
		return false;	
	}
	
	// get the overlay wrapper
	$.fn.videoBG.wrapper = function() {
		var $wrap = $('<div/>');
		$wrap.addClass('videoBG_wrapper')
			.css('position','absolute')
			.css('top',0)
			.css('left',0);
		return $wrap;
	}
	
	// these are the defaults
	$.fn.videoBG.defaults = {
			mp4:'',
			ogv:'',
			webm:'',
			poster:'',
			autoplay:true,
			loop:true,
			scale:false,
			position:"absolute",
			opacity:1,
			textReplacement:false,
			zIndex:0,
			width:0,
			height:0,
			fullscreen:false,
			imgFallback:true
		}

})( jQuery );



Modifié par Difrakt (25 Jul 2012 - 18:44)
En fouillant j'ai trouvé sur divers sites qu'on peut ajouter des fonctions au code.
Peut être que les fonctions ''stop'' ou ''callback'' pourraient être la solution pour revenir sur une homepage classique. Quelqu'un aurait une idée svp ?
Bonjour à toi.
Une solution serait de faire une redirection au bout d'un certain temps avec une en-tête PHP spécifique ...
L'avantage, c'est que même si Javascript est désactivé, le site reste accessible ...
Bonjour et merci beaucoup pour ta réponse.
Tu aurais une idée d'où je pourrais trouver de la documentation pour réaliser cela stp ?
Bonjour,
Ce n'est pas possible en PHP de faire une redirection après un certain temps.
Il faut soit utiliser JavaScript, soit HTML. (Je suppose que Bguigui parlait de cette solution.)

Le problème de la faire en HTML, c'est qu'il se peut que la redirection se fasse malgré le fait que l'utilisateur n'ait pas fini de regarder la vidéo.

En JavaScript, il semble exister un événement "timeupdate" qui serait enclencher durant l'évolution de la vidéo, il faudrait quand cet événement se déclenche regarder la valeur de la variable currentTime de l'objet pour agir en conséquence.
Le plus simple serait de rajouter un bouton du genre "accéder au site" car cela présente 2 avantages :

1) simple à mettre en place
2) l'utilisateur peut accéder au site à tout moment, il n'est pas obligé d'attendre la dernière seconde de la vidéo pour entrer

Enfin c'est juste une proposition ^^
Merci de vos réponses,

La solution en javascript va être un peu trop complexe pour moi !
Je vais sans doute me rabattre sur la solution du bouton,
même si c'est dommage de devoir avoir ça durant la lecture de la vidéo.
As-tu déjà fait du javascript ?

Ca ne doit pas être trop compliqué à faire je pense...
Vu que tu sembles utiliser jQuery...

Il semble même y avoir un événement "ended" pour l'objet video ! De quoi faire un code fonctionnel de trois lignes (qui pourrait être mis en une seule).

HTML :
<video>gnagnagna</video>
JavaScript :
$("video").bind("ended", function() {
    alert("C'est fini !");
});

Modifié par Gothor (26 Jul 2012 - 15:45)
Merci Gothor,

J'avais vu cet événement ''ended'' je pensais bien que ca pourrait être vers là.
Par contre mes connaissances en javascript sont très limitées.
J'utilise des plugin jQuery mais les modifier c'est une autre paire de manches.

A quoi correspond ton code ?
Serait-il possible d'avoir la même fonction mais au lieu de donner une alerte,
il y ait une redirection vers une page html ?
Et où le mettre dans le jQuery...?
Pour la redirection,
location.href = "tapage.html";

au lieu du alert.

Et pour où le mettre, à la fin de ton fichier JavaScript je suppose...
J'ai essayé ta solution Gothor mais ca ne fonctionne pas.
Je n'ai pas de redirection vers la page demandée.

Peut-être que l'on doit ajouter une fonction pour arrêter le javascript (end),
et ensuite mettre la redirection.
Je vais essayer de chercher encore.

Merci quand même.
Je dois être vraiment une truffe alors, parce que je n'arrive pas à le faire fonctionner.
Tu peux me donner le code complet du jQuery que tu utilises stp ?
Tout est dans le lien que je t'ai donné.
$(document).ready(function() {
  $("video").bind("ended", function() {
    location.href = "http://www.w3schools.com/html5/tag_video.asp";
  });
});
<video src="http://html5demo.braincracking.org/demo/media/windowsill.ogv" poster="http://html5demo.braincracking.org/demo/img/poster.png" autoplay="">
  <span class="ko">&lt;video&gt; non supportée !</span>
</video>
L'attribut loop ne doit pas être présent sur l'élément vidéo, sinon, l'événement "ended" ne se déclenche jamais.
Modifié par Gothor (27 Jul 2012 - 13:33)
Ok merci je crois que je viens de comprendre.
Je pensais que le code était à ajouter à mon jQuery de départ.
En fait là c'est un autre doc html avec une balise vidéo auquel il faut lier le javascript que tu m'as donné c'est ca ?
La balise vidéo, c'est celle dans ta page d'accueil... Et le JavaScript est à ajouter dans le fichier JavaScript que tu importes depuis cette page.