Échelle et repositionnement iframe comme arrière-plan-taille: couverture

html, body {
  height: 100%;
  margin: 0;
  padding: 0;
}
.sized {
  height: 100%;
  position: relative;
  background: #eee;
  overflow:hidden;
  padding:0;
}
.sized iframe {
  position:absolute;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
}
@media (min-width: 320px) {
  height: 200%;
  top: -50%;
}
@media (min-width: 640px) {
  height: 180%;
  top: -40%;
}
<div class="sized">
  <iframe src="https://player.vimeo.com/video/135335257?autoplay=false" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>
</div>

<h3>Original video</h3>
<iframe src="https://player.vimeo.com/video/135335257?autoplay=false" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>

comme j'obtiens un cookie même erreur d'origine dans le résultat des snippets, voici un miroir:

https://jsfiddle.net/07Lffw5x/2/embedded/result/

[edit] peut-être cette est une meilleure démo, si vous comparez à celle-ci , il n'y a pas beaucoup de différence... pourquoi? [/modifier]

j'essaie de reproduire un fond-couverture de taille pour une iframe.

Le truc, c'est qu'il semble redimensionner la vidéo, pour les grandes tailles seulement,

Question,

la redimensionne prennent effet sur chaque point d'arrêt? ou vimeo joueur peut redimensionner par elle-même?

31
demandé sur Toni Michel Caubet 2015-10-31 15:18:28

2 réponses

similaire à la réponse D'Alvaro Menendez, le crédit doit aller à cette réponse stackoverflow.com/a/29997746/3400962 par Qwertman. Je suis allé aussi loin que l'utilisation du "pourcentage de remplissage" tour, mais cette réponse de l'utilisation Intelligente des unités de viewport est cruciale pour ce travail.

la clé de la mise en œuvre de ce comportement est d'assurer deux choses:

  1. que le iframe maintient toujours le même rapport d'aspect que son contenu vidéo 16: 9. Cela permettra d'assurer qu'aucun noir "padding" est présent autour de l'extérieur de la vidéo
  2. que le iframe remplit toujours le height ou width selon la taille du viewport

une façon de maintenir le rapport d'aspect d'un élément est d'utiliser le "pourcentage de rembourrage "astuce qui tire avantage du fait que top et bottom padding utilise le width de l'élément comme base pour leur valeur. En utilisant la formule B / (A / 100) = C% nous pouvons calculer le pourcentage requis pour le rembourrage. Étant donné que la vidéo a un ratio de 16 : 9 cela se traduit par 9 / (16 / 100) = 56.25.

le seul problème est que dans votre cas le calcul est nécessaire à la fois pour l'axe horizontal et l'axe vertical (comme nous ne savons pas quelles dimensions le viewport sera) et cette astuce ne fonctionnera pas avec left et right padding pour obtenir le rapport d'aspect par rapport au height .

html, body {
    height: 100%;
    margin: 0;
    padding: 0;
}
.container {
    background: #eee;
    height: 100%;
    overflow: hidden;
    padding: 0;
    position: relative;
}
.inner {
    left: 50%;
    min-height: 43.75%;
    padding-top: 56.25%;
    position:absolute;
    top: 50%;
    transform: translate(-50%, -50%);
    width: 100%;
}
.container iframe {
    bottom: 0;
    height: 100%;
    left: 0;
    position:absolute;
    right: 0;
    top: 0;
    width: 100%;
}
<div class="container">
    <div class="inner">
        <iframe src="https://player.vimeo.com/video/135335257?autoplay=false" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>
    </div>
</div>

https://jsfiddle.net/w45nwprn/ (Extrait de ne pas montrer la vidéo, veuillez consulter le violon)

heureusement, dans votre cas, vous voulez que la vidéo s'adapte à l'écran entier afin unités de viewport peut être utilisé pour calculer le rapport d'aspect au lieu de pourcentages. Cela permet d'utiliser pour calculer le width dans rapport à la height et vica versa:

  • left: 50%; , top: 50%; et transform: translate(-50%, -50%); sont nécessaires pour centrer le iframe dans .container
  • min-height: 100%; et min-width: 100%; sont nécessaires pour s'assurer que le height et width ne sont jamais plus petit que celui de .container
  • height: 56.25vw; définira le height par rapport au width du viewport. C'est calculé en faisant 9 / (16 / 100) = 56.25
  • width: 177.77777778vh; définira le width par rapport au height du viewport. Cela est calculé en faisant 16 / (9 / 100) = 177.77777778

parce que les height et width ne peuvent jamais être en dessous de 100% mais doivent rester dans le bon rapport d'aspect la vidéo couvrira toujours l'ensemble du viewport.

html, body {
    height: 100%;
    margin: 0;
    padding: 0;
}
.container {
    background: #eee;
    height: 100%;
    overflow: hidden;
    padding: 0;
    position: relative;
}
iframe {
    box-sizing: border-box;
    height: 56.25vw;
    left: 50%;
    min-height: 100%;
    min-width: 100%;
    transform: translate(-50%, -50%);
    position: absolute;
    top: 50%;
    width: 177.77777778vh;
}
<div class="container">
    <iframe src="https://player.vimeo.com/video/135335257?autoplay=false" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>
</div>

https://jsfiddle.net/qk00ehdr/ (Extrait de ne pas montrer la vidéo, veuillez consulter le violon)

les unités de Viewport sont largement supportées , aussi longtemps que vous ne ciblez pas les vieux navigateurs cette méthode devrait fonctionner.

30
répondu Hidden Hobbes 2015-11-09 20:43:47

Ok. Le mérite n'est pas à moi car j'ai obtenu le jquery ici

je me suis souvenu de cette question comme je l'ai utilisé sur un de mes anciens projets et je voulais vérifier si elle fonctionnerait la même chose avec un iframe. Il n'.

essentiellement avec cette css:

.container {
    position: absolute;
    top: 0;
    overflow: hidden;
}

et ce jquery:

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('iframe').attr('width'));
    vid_h_orig = parseInt(jQuery('iframe').attr('height'));

    jQuery(window).resize(function () { resizeToCover(); });
    jQuery(window).trigger('resize');
});

function resizeToCover() {

    // set the video viewport to the window size
    jQuery('.container').width(jQuery(window).width());
    jQuery('.container').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('iframe').width(scale * vid_w_orig);
    jQuery('iframe').height(scale * vid_h_orig);
    // and center it by scrolling the video viewport
    jQuery('.container').scrollLeft((jQuery('iframe').width() - jQuery(window).width()) / 2);
    jQuery('.container').scrollTop((jQuery('iframe').height() - jQuery(window).height()) / 2);
};

, Vous obtenez ceci: JSFIDDLE

(je sais que vous avez été à la recherche pour un pur css solution, je ne pense pas que c'est possible, mais j'ai peut-être tort, mais j'ai posté cette réponse, car elle pourrait aider d'autres gens avec le même problème)

7
répondu Alvaro Menéndez 2017-05-23 12:10:32