Comment puis-je simuler la fonctionnalité de background-size:cover
sur un élément html comme <video>
o <img>
?
J'aimerais que ça fonctionne comme
background-size: cover;
background-position: center center;
Comment puis-je simuler la fonctionnalité de background-size:cover
sur un élément html comme <video>
o <img>
?
J'aimerais que ça fonctionne comme
background-size: cover;
background-position: center center;
Il s'agit d'une déclaration très puissante qui, si les navigateurs l'adoptaient, mettrait fin à de nombreux problèmes de mise à l'échelle sur les sites web.
Il existe un polyfill pour les navigateurs qui ne le supportent pas (encore) : github.com/anselmh/object-fit
L'utilisation d'une couverture de fond est parfaite pour les images, de même que la largeur de 100 %. Ces options ne sont pas optimales pour <video>
et ces réponses sont trop compliquées. Vous n'avez pas besoin de jQuery ou de JavaScript pour réaliser un arrière-plan vidéo pleine largeur.
Gardez à l'esprit que mon code ne couvrira pas complètement l'arrière-plan avec une vidéo comme le ferait Cover, mais qu'au lieu de cela, il rendra la vidéo aussi grande qu'elle doit l'être pour maintenir le rapport d'aspect et couvrir tout l'arrière-plan. Tout excédent de vidéo débordera du bord de la page, dont les côtés dépendent de l'endroit où vous ancrez la vidéo.
La réponse est très simple.
Utilisez simplement ce code vidéo HTML5, ou quelque chose de ce genre : (test in Full Page)
html, body {
width: 100%;
height:100%;
overflow:hidden;
}
#vid{
position: absolute;
top: 50%;
left: 50%;
-webkit-transform: translateX(-50%) translateY(-50%);
transform: translateX(-50%) translateY(-50%);
min-width: 100%;
min-height: 100%;
width: auto;
height: auto;
z-index: -1000;
overflow: hidden;
}
<video id="vid" video autobuffer autoplay>
<source id="mp4" src="http://grochtdreis.de/fuer-jsfiddle/video/sintel_trailer-480.mp4" type="video/mp4">
</video>
La hauteur et la largeur minimales permettent à la vidéo de conserver le rapport hauteur/largeur de la vidéo, qui est généralement le rapport hauteur/largeur de tout navigateur normal à une résolution normale. Toute vidéo excédentaire déborde sur le côté de la page.
C'est beaucoup plus simple que les autres réponses, et cela fonctionne bien pour moi. Il suffit de définir min-width
o min-height
fait l'affaire.
Juste un commentaire pour éviter que les nouveaux venus ne s'arrachent les cheveux : #video_background{ devrait être #videobackground{.
Voici comment j'ai procédé. Un exemple fonctionnel se trouve dans ce jsFiddle .
var min_w = 300; // minimum video width allowed
var vid_w_orig; // original video dimensions
var vid_h_orig;
jQuery(function() { // runs after DOM has loaded
vid_w_orig = parseInt(jQuery('video').attr('width'));
vid_h_orig = parseInt(jQuery('video').attr('height'));
$('#debug').append("<p>DOM loaded</p>");
jQuery(window).resize(function () { resizeToCover(); });
jQuery(window).trigger('resize');
});
function resizeToCover() {
// set the video viewport to the window size
jQuery('#video-viewport').width(jQuery(window).width());
jQuery('#video-viewport').height(jQuery(window).height());
// use largest scale factor of horizontal/vertical
var scale_h = jQuery(window).width() / vid_w_orig;
var scale_v = jQuery(window).height() / vid_h_orig;
var scale = scale_h > scale_v ? scale_h : scale_v;
// don't allow scaled width < minimum video width
if (scale * vid_w_orig < min_w) {scale = min_w / vid_w_orig;};
// now scale the video
jQuery('video').width(scale * vid_w_orig);
jQuery('video').height(scale * vid_h_orig);
// and center it by scrolling the video viewport
jQuery('#video-viewport').scrollLeft((jQuery('video').width() - jQuery(window).width()) / 2);
jQuery('#video-viewport').scrollTop((jQuery('video').height() - jQuery(window).height()) / 2);
// debug output
jQuery('#debug').html("<p>win_w: " + jQuery(window).width() + "</p>");
jQuery('#debug').append("<p>win_h: " + jQuery(window).height() + "</p>");
jQuery('#debug').append("<p>viewport_w: " + jQuery('#video-viewport').width() + "</p>");
jQuery('#debug').append("<p>viewport_h: " + jQuery('#video-viewport').height() + "</p>");
jQuery('#debug').append("<p>video_w: " + jQuery('video').width() + "</p>");
jQuery('#debug').append("<p>video_h: " + jQuery('video').height() + "</p>");
jQuery('#debug').append("<p>vid_w_orig: " + vid_w_orig + "</p>");
jQuery('#debug').append("<p>vid_h_orig: " + vid_h_orig + "</p>");
jQuery('#debug').append("<p>scale: " + scale + "</p>");
};
#video-viewport {
position: absolute;
top: 0;
overflow: hidden;
z-index: -1; /* for accessing the video by click */
}
#debug {
position: absolute;
top: 0;
z-index: 100;
color: #fff;
font-size: 12pt;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="video-viewport">
<video autoplay controls preload width="640" height="360">
<source src="http://www.quirksmode.org/html5/videos/big_buck_bunny.mp4"type="video/mp4" />
<source src="http://www.quirksmode.org/html5/videos/big_buck_bunny.webm"type="video/webm" />
<source src="http://www.quirksmode.org/html5/videos/big_buck_bunny.ogv"type="video/webm" />
</video>
</div>
<div id="debug"></div>
Pourquoi cette solution a-t-elle été rétrogradée ? À toutes fins utiles, elle semble résoudre le problème.
Cela fonctionne très bien si la vidéo est grande et la fenêtre petite, mais ne fonctionnera pas pour moi si la fenêtre est plus grande que la vidéo et que la vidéo a besoin d'un upscaling. J'ai ajouté l'astuce min de @Timothy-Ryan-Carpenter ( réponse ici ) à la balise vidéo comme : video { min-width: 100%; min-height: 100%; }
et ça marche comme sur des roulettes.
Les autres réponses étaient bonnes mais elles impliquent du javascript ou ne centrent pas la vidéo horizontalement ET verticalement.
Vous pouvez utiliser cette solution CSS complète pour avoir une vidéo qui simule la propriété background-size : cover :
video {
position: fixed; // Make it full screen (fixed)
right: 0;
bottom: 0;
z-index: -1; // Put on background
min-width: 100%; // Expand video
min-height: 100%;
width: auto; // Keep aspect ratio
height: auto;
top: 50%; // Vertical center offset
left: 50%; // Horizontal center offset
-webkit-transform: translate(-50%,-50%);
-moz-transform: translate(-50%,-50%);
-ms-transform: translate(-50%,-50%);
transform: translate(-50%,-50%); // Cover effect: compensate the offset
background: url(bkg.jpg) no-repeat; // Background placeholder, not always needed
background-size: cover;
}
Cela n'a pas fonctionné pour moi. La vidéo n'a pas été mise à l'échelle en plein écran. Puis-je voir votre code html pour cet exemple ? S'agit-il simplement d'une balise vidéo dans le corps du texte ?
Une solution très intéressante. Cela n'a pas fonctionné pour moi au début mais c'est probablement quelque chose que j'ai manqué car lorsque j'ai copié et collé votre css, cela a fonctionné ! Merci ;)
CSS et un petit js peuvent faire en sorte que la vidéo couvre le fond et soit centrée horizontalement.
CSS :
video#bgvid {
position: absolute;
bottom: 0px;
left: 50%;
min-width: 100%;
min-height: 100%;
width: auto;
height: auto;
z-index: -1;
overflow: hidden;
}
JS : (lier ceci avec le redimensionnement de la fenêtre et appeler une fois séparément)
$('#bgvid').css({
marginLeft : '-' + ($('#bgvid').width()/2) + 'px'
})
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
1 votes
OK, je n'ai jamais utilisé background-size : cover ; mais j'ai regardé en ligne, donc ce que vous voulez c'est un moyen d'avoir une image/vidéo plein écran qui se redimensionne quand la fenêtre se redimensionne ?
1 votes
Oui, mais il y a des subtilités avec
cover
. Voir Taille de l'arrière-plan 101 sur lien .0 votes
OK, donc pour simplifier la largeur de 100% d'une image / vidéo et s'il y a un débordement, il est coupé ? Si c'est ce que vous voulez, je peux voir si je peux le coder, mais pour la vidéo, vous devez garder à l'esprit que vous aurez besoin d'un lecteur personnalisé parce que dans la plupart des navigateurs, les contrôles sont en bas du lecteur et ils seront coupés s'il y a un débordement ...
0 votes
Oui, ils débordent également sur les côtés opposés. Je suis conscient du problème des contrôles vidéo.
0 votes
Ok, quel est le problème d'utiliser simplement width="100%" sur une image ?
1 votes
Si la fenêtre est plus haute que l'image, elle laissera un espace vide quelque part le long de l'axe vertical, je pense. Dans ce cas, l'image devrait plutôt déborder sur les côtés et sa hauteur devrait être la même que celle de la fenêtre. Et l'inverse devrait se produire lorsque la fenêtre est plus large que l'image.
0 votes
En d'autres termes, si la hauteur de l'image est inférieure à celle du navigateur, l'image doit s'adapter au navigateur pour avoir la hauteur de ce dernier.
0 votes
Pour mémoire : ce que vous recherchez est la propriété css 'object-fit' sur un élément vidéo. Elle est mal supportée.