194 votes

simuler la taille de fond:cover sur <video> ou <img>.

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;

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 ...

158voto

Daniel de Wit Points 98

Pour certains navigateurs, vous pouvez utiliser

object-fit: cover;

http://caniuse.com/object-fit

18 votes

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.

1 votes

C'est exactement ce que je cherchais !

3 votes

Il existe un polyfill pour les navigateurs qui ne le supportent pas (encore) : github.com/anselmh/object-fit

138voto

jsFiddle

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.

2 votes

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.

31 votes

Cette solution ne permet pas de centrer la vidéo comme le fait la couverture.

1 votes

Juste un commentaire pour éviter que les nouveaux venus ne s'arrachent les cheveux : #video_background{ devrait être #videobackground{.

44voto

seron Points 850

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>

0 votes

Pourquoi cette solution a-t-elle été rétrogradée ? À toutes fins utiles, elle semble résoudre le problème.

2 votes

C'est la meilleure solution que j'ai trouvée pour ce problème. Merci !

1 votes

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.

16voto

micred Points 637

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;
  }

0 votes

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 ?

0 votes

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 ;)

2 votes

Cela a bien fonctionné pour moi. J'ai juste changé position:fixed en absolute.

4voto

Salim Hariz Points 31

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.com

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.

Powered by:

X