Горизонтально и вертикально центрированный iframe с соотношением сторон 16: 9, который использует как можно больше свойств экрана без обрезки в любом месте

Требования

  • HTML: iframe HAS находится внутри содержащего div. См. Ниже код.
  • CSS: контейнер должен иметь ЛЮБОЙ действительный width и height с помощью единиц просмотра vw и vh. Se внизу.
  • Да, width и height HAS находятся в vw и vh.
  • Статическое изображение предварительного просмотра изображения должно быть НИКОГДА.
  • Статическое изображение предварительного просмотра видео должно НЕ иметь черные полосы выше и ниже (почтовый ящик).
  • Статическое изображение предварительного просмотра видео должно НЕ иметь черные полосы слева или справа (столбец).
  • Статическое изображение предварительного просмотра изображения должно использовать как можно больше пространства пространства внутри содержащего его div.
  • Статическое изображение предварительного просмотра видео должно ВСЕГДА сохранять соотношение сторон 16: 9.
  • Полоса прокрутки должна выглядеть НИКОГДА.
  • Статическое изображение предварительного просмотра изображения должно располагаться как по вертикали, так и по горизонтали внутри содержащего его div.
  • Отзывчивый веб-дизайн.

При изменении размера браузера или области просмотра все вышеуказанные требования должны быть выполнены.

HTML

<div class="container">
   <iframe></iframe>
</div>

CSS

.container {
   width:90vw;
   height:50vh;
}

Ответ 1

Используя JavaScript, вы можете прослушивать событие resize, которое срабатывает всякий раз, когда окно браузера меняет форму. Затем, с некоторой простой алгеброй, вы можете рассчитать размеры iframe на основе размеров контейнера. Ниже приведена демонстрация всех требований.

"use strict";

var container = document.querySelector('.container');
var frame = container.querySelector('iframe');

function resizeVideo() {
	frame.width = frame.height = 0;

	var width = container.offsetWidth;
	var height = container.offsetHeight;

	if (height * (16 / 9) <= width) {
		frame.height = height;
		frame.width = height * (16 / 9);
	} else {
		frame.width = width;
		frame.height = width * (9 / 16);
	}
}

window.addEventListener('load', resizeVideo);
window.addEventListener('resize', resizeVideo);
.container {
	width: 90vw;
	height: 50vh;

	display: table-cell;
	text-align: center;
	vertical-align: middle;
}
<div class="container">
	<iframe src="https://www.youtube.com/embed/BKhZvubRYy8" frameborder="0" allowfullscreen></iframe>
</div>

Ответ 2

То же решение, но без дополнительной разметки для поддержания отношения.

JsFiddle с теми же комментариями, которые совершенно не нужны.

<!DOCTYPE html><html lang="en"><head><meta charset="utf-8">
<title>Fully Container Centred Iframe</title>
<meta name="generator" content="PSPad editor, www.pspad.com">
<style>
.container {
    display:table-cell; /* (specs: omitted table parts, the browser will insert mandatory elements in the dom tree) */
    position:relative;
    padding:; /* optional, margins ignored */
    width:100vw; /* any value */
    height:1vh; /* will expand by the :before element */
    overflow:hidden; /* hide eventual black bars */
    background:tan; /* bg-colors just for demo testing */
    vertical-align:middle;
    text-align:center;
}
.container:before {
    display:block;
    padding-top:56%; /* keeps the 16/9 ratio for the AP */
    height:0;
    background:red;
    content:"\a0";
}
.container iframe {
    position:absolute; /* to be ratio consistent */
    top:-.5%;
    left:-.5%; /* overflow eventual black bars */
    border:0;
    width:101%; /* grow some to avoid thinner black bars */
    height:101%;
    overflow:hidden; /* for html5 browsers the html attribute is depreciated */
    background:gold;
}
</style>
</head><body>

<div class="container">
    <iframe scrolling="no" src=""></iframe>
</div>

</body></html>

Ответ 3

если вы хотите Отзывчивое использование

.container, iframe {
  width:100%;
  height:auto;
}

Ответ 4

.container {
    width:90vw;
    height:50vh;
}
.container iframe {
    width: 100%;
    height: 100%;
}

Кажется неплохо работать в этой скрипке https://jsfiddle.net/1q10L7hj/

Ответ 5

почему бы вам просто не использовать метод calc, чтобы получить ширину соотношения сторон, которую вы хотите?

HTML

<div class="container">
    <iframe src="" frameborder="0"></iframe>
</div>

SCSS

<style>

$width = 80vw;

.container {
    width: $width;
    height: calc(($width/16) * 9);
    position: relative;
}
iframe {
    position: absolute;
    width: 100%;
    height: 100%;
    top: 50%;
    left: 50%;
    -webkit-transform: translate(+50%, -50%);
    transform: translate(+50%, -50%);
}

</style>

тогда вы можете изменить его ширину в любом месте и применить любое позиционирование, которое вы хотите в div контейнера, и iframe с последующим соответствием.

Ответ 6

Я получил результат, который вам нужен, однако мне пришлось добавить дополнительный div в качестве родителя класса .container. Этот JSFiddle должен работать для пользователей на хром (версия для настольных компьютеров Windows), однако, когда я пытался использовать ту же скрипку на Edge и IE11, я обнаружил, что это создало бы нежелательный эффект почтового ящика из-за слишком большой дальности изображения.

HTML

<div id="wrapper">
  <div class="container">
      <iframe scrolling="no" src="https://www.youtube.com/embed/YL9RetC0ook" frameborder="0" allowfullscreen>
      </iframe>
  </div>
</div>

CSS

body {
  margin: 0;
}

#wrapper {
  width: 90vw;
  height: 50vh;
}

.container,iframe {
  width: 100%;
  height: 100%;
}

Я не уверен, что это работает для Firefox, поэтому, возможно, если у вас есть Firefox, вы можете попробовать его на JSFiddle. Однако для Chrome (по крайней мере) это должно быть решение, в котором вы ищете, как указано в перечисленных вами требованиях.

Ответ 7

Я думаю, что отображение табличных ячеек может решить это. Просто примените его к контейнеру, поэтому iframe - это содержимое

В соответствии со спецификациями браузер будет вставлять фиктивные элементы, где он должен правильно отображать ячейку и полностью центрировать и содержать ее содержимое, а если нужно, расти вместе с ним.

Требования: Я думаю, что некоторые из них выходят за рамки вашего вопроса, они также будут зависеть от того, что загружено в iframe, из-под контроля этого документа контейнера. Мой предложенный код прост, но я считаю, что он отвечает всем требованиям для родителя iframe и по-прежнему дружит с crossbrowser.

Запрещенные черные полосы и обязательное соотношение сторон все еще могут быть повреждены в загруженном документе. Если вы не можете контролировать загруженные файлы, последним вариантом могут быть атрибуты "srcdoc" и "бесшовные", но это исключает, например, все версии IE.

JsFiddle с некоторыми комментариями совершенно не нужно. Надеюсь, что приведенное ниже решение разрешает дело.

В любом случае, мне было весело! Благодарю!:)

<!DOCTYPE html><html lang="en"><head><meta charset="utf-8">
<title>Fully Container Centred Iframe</title>
<meta name="generator" content="PSPad editor, www.pspad.com">
<style>
.container {
    display:table-cell;
    padding:;
    width:100vw;
    height:20vh;
    background:tan;
    vertical-align:middle;
    text-align:center;
}
.container .ratio{
    display:inline-block;
    position:relative;
    padding-bottom:56%;
    width:100%;
    height:0;
    overflow:hidden;
    vertical-align:middle;
}
.container iframe {
    position:absolute;
    top:-1%;
    left:-1%;
    border:0;
    width:102%;
    height:102%;
    overflow:hidden;
    vertical-align:middle;
}
</style>
</head><body>

<div class="container">
    <div class="ratio">
        <iframe scrolling="no" src=""></iframe>
    </div>
</div>

</body></html>

Ответ 8

Я бы рекомендовал использовать прослушиватель window.resize JavaScript для решения этой проблемы. Не могу написать код сегодня, потому что у меня довольно жесткий график, но я попробую написать algo:

  • При изменении размера окна, ширине окна расчета (wW) и высоте окна (wH);
  • Определите ширину контейнера (cW) в соответствии с wW (например, cW = wW-10, чтобы получить почти всю ширину - вы можете опустить -10, если хотите);
  • Определите высоту контейнера (cH) согласно вычисленному выше cW: cH = cW * 9/16;
  • Теперь, если cH > wH (т.е. контейнер не подходит к экрану по вертикали, потому что он слишком широк), мы должны пересмотреть cW в зависимости от высоты доступного окна. В этом случае cH = wH-10 (чтобы получить почти все доступное вертикальное пространство - опять же, вы можете опустить -10, если хотите), а затем cW = wH * 16/9;
  • Теперь вы должны иметь действительные cW и cH, чтобы вы могли вставить контейнер в окно, не выходя из экрана, и вы можете применить его к контейнеру.
  • Чтобы центрировать контейнер на экране, используйте позицию: абсолютное, левое: 50%; top: 50%; в вашем CSS. Когда вы обновляете cW и cH, также обновляйте margin-left: - (cW/2); margin-top: - (cH/2);

Это концепция - вы можете импровизировать в соответствии с вашими потребностями. Надеюсь, это поможет.