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 une même erreur d'origine des cookies dans le résultat des extraits, voici un miroir:
https://jsfiddle.net/07Lffw5x/2/embedded/result/
[edit] Peut-être que this est une meilleure démo, si vous comparez à this , il n'y a pas beaucoup de différence ... pourquoi? [/Éditer]
J'essaie de reproduire une couverture de taille d'arrière-plan pour un iframe.
Le fait est que cela semble redimensionner la vidéo, uniquement pour les plus grandes tailles,
Question,
Les mises à l'échelle peuvent-elles prendre effet à chaque point d'arrêt? ou le joueur vimeo pourrait être redimensionné par ses propres moyens de toute façon?
Semblable à la réponse d'Alvaro Menendez, le crédit doit aller à cette réponse stackoverflow.com/a/29997746/3400962 par Qwertman. J'en suis arrivé à utiliser l'astuce "pourcentage de remplissage", mais l'utilisation intelligente de cette réponse des unités de fenêtre est cruciale pour ce travail.
La clé de la mise en œuvre de ce comportement consiste à garantir deux choses:
iframe
conserve toujours le même rapport d'aspect que son contenu vidéo 16: 9. Cela garantira qu'aucun "padding" noir n'est présent autour de l'extérieur de la vidéoiframe
remplit toujours le height
ou width
selon la taille de la fenêtreUne façon de conserver le rapport hauteur/largeur d'un élément consiste à utiliser l'astuce "pourcentage de remplissage" qui tire parti du fait que top
et bottom
padding
utilise le width
de l'élément comme base de 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 rapport de 16: 9, cela se traduit par 9/(16/100) = 56,25.
Le seul problème est que dans votre cas, le calcul est requis pour l'axe horizontal et vertical (car nous ne savons pas quelles dimensions la fenêtre sera) et cette astuce ne fonctionnera pas avec left
et right
padding
pour obtenir le rapport hauteur/largeur 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/ (L'extrait n'affiche pas de vidéo, voir violon)
Heureusement, dans votre cas, vous souhaitez que la vidéo s'adapte à l'ensemble de l'écran afin que les unités de la fenêtre puissent être utilisées pour calculer le rapport d'aspect au lieu des pourcentages. Cela permet de calculer le width
par rapport au height
et vice 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 garantir que les height
et width
ne sont jamais plus petits que ceux de .container
height: 56.25vw;
Définira le height
par rapport au width
de la fenêtre. Ceci est calculé en faisant 9/(16/100) = 56,25width: 177.77777778vh;
Définira le width
par rapport au height
de la fenêtre. Ceci est calculé en faisant 16/(9/100) = 177,77777778Parce que height
et width
ne peuvent jamais être inférieurs à 100%
Mais que le format doit rester dans le bon rapport, la vidéo couvrira toujours la totalité de la fenêtre d'affichage.
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/ (L'extrait n'affiche pas de vidéo, voir violon)
Les unités Viewport sont largement prises en charge , donc tant que vous ne ciblez pas les anciens navigateurs, cette méthode devrait fonctionner.
D'accord. Le mérite n'est PAS le mien car j'ai obtenu le jquery ici
Je me suis souvenu de cette question en l'utilisant sur l'un de mes anciens projets et je voulais vérifier si cela fonctionnerait de la même manière avec un iframe. Cela fait.
essentiellement avec ce 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 cherchiez une solution CSS pure, ce que je ne pense pas que ce soit possible mais je peux me tromper, mais j'ai posté cette réponse car elle pourrait aider d'autres personnes ayant le même problème)