É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?
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:
- 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 - que le
iframe
remplit toujours leheight
ouwidth
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%;
ettransform: translate(-50%, -50%);
sont nécessaires pour centrer leiframe
dans.container
-
min-height: 100%;
etmin-width: 100%;
sont nécessaires pour s'assurer que leheight
etwidth
ne sont jamais plus petit que celui de.container
-
height: 56.25vw;
définira leheight
par rapport auwidth
du viewport. C'est calculé en faisant 9 / (16 / 100) = 56.25 -
width: 177.77777778vh;
définira lewidth
par rapport auheight
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.
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)