Создание адаптивного фрейма


144

Я читал этот пост, посвященный стеку, под названием «Можете ли вы сделать iFrame отзывчивым?», И один из комментариев / ответов привел меня к этому jfiddle.

Но когда я попытался реализовать HTML и CSS, чтобы удовлетворить свои потребности, у меня не было таких же результатов / успеха. Я создал свою собственную скрипку JS, чтобы показать вам, как она работает не для меня. Я уверен, что это как-то связано с типом iFrame, который я использую (например, изображения продукта могут быть слишком адаптивными или что-то в этом роде?)

Моя главная проблема заключается в том, что когда мои читатели блога посещают мой блог на своем iPhone, я не хочу, чтобы все было на ширине х (100% для всего моего контента), а затем iFrame плохо себя ведет и является единственным элементом шире (и, следовательно, придерживается мимо всего другого контента - если это имеет смысл ??)

В любом случае, кто-нибудь знает, почему это не работает? Спасибо.

вот HTML и CSS МОЕГО JSFIDDLE (если вы не хотите нажимать на ссылку):

<div class="wrapper">
  <div class="h_iframe">
    <!-- a transparent image is preferable -->
    <img class="ratio" src="http://www.brightontheday.com/wp-content/uploads/2013/07/placeholder300.png" />
    <iframe frameborder='0' height='465px' width='470px' scrolling='no' src='http://currentlyobsessed.me/api/v1/get_widget?wid=30&blog=Brighton+The+Day&widgetid=38585'
      frameborder="0" allowfullscreen></iframe>
  </div>
</div>

и вот сопровождающий CSS:

.wrapper {
  width: 100%;
  height: 100%;
  margin: 0 auto;
  background: #ffffff;
}

.h_iframe {
  position: relative;
}

.h_iframe .ratio {
  display: block;
  width: 100%;
  height: auto;
}

.h_iframe iframe {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
}

6
Сам iframe («ящик») может быть отзывчивым. Но все внутри iframe - отдельная страница, и поэтому не в области вашего CSS или JS.
DA.

Вы можете использовать easyXDM для связи между страницей, на которой встроен i-frame, и документом на сервере, на который указывает iframe.
Джон Смит

1
Я предпочитаю чистый css: stackoverflow.com/a/26194041/274502
cregox

Ответы:


107

Представляю вам решение Невероятной Поющей Кошки =)

.wrapper {
    position: relative;
    padding-bottom: 56.25%; /* 16:9 */
    padding-top: 25px;
    height: 0;
}
.wrapper iframe {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
}

jsFiddle: http://jsfiddle.net/omarjuvera/8zkunqxy/2/
При перемещении панели окна вы увидите, если iframe реагирует на изменение размера


Кроме того, вы также можете использовать метод внутреннего соотношения - это просто альтернативный вариант того же решения выше (помидор, помидор)

.iframe-container {
  overflow: hidden;
  padding-top: 56.25%;
  position: relative;
} 

.iframe-container iframe {
  position: absolute;
  top: 0;
  left: 0;
  border: 0;
  width: 100%;
  height: 100%;
}

4
Смотрите также эту статью, объясняющую эту технику более подробно: smashingmagazine.com/2014/02/…
Томас Темпельманн

работает только для фреймов YouTube. Смотрите это: jsfiddle.net/1bd8qw76
csandreas1

2
Эта техника будет работать для всех iframe, уловка в том, что содержимое iframe также должно быть отзывчивым, подробнее об этом здесь: benmarshall.me/responsive-iframes
Ben Marshall

68

Попробуйте использовать этот код, чтобы сделать его отзывчивым

iframe, object, embed {
    max-width: 100%;
}

37
Вы не регулируете высоту контейнера с помощью этого кода.
Реджи

46

Я нашел решение от Дейва Руперта / Криса Койера. Тем не менее, я хотел сделать свиток доступным, поэтому придумал следующее:

// HTML

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

// CSS

.myIframe {
     position: relative;
     padding-bottom: 65.25%;
     padding-top: 30px;
     height: 0;
     overflow: auto; 
     -webkit-overflow-scrolling:touch; //<<--- THIS IS THE KEY 
     border: solid black 1px;
} 
.myIframe iframe {
     position: absolute;
     top: 0;
     left: 0;
     width: 100%;
     height: 100%;
}

2
будущие заметки для меня, если padding-bottom контента - это отношение ширины контента, 800x600 - это% 75, 800x536 - это% 67
nerkn

1
Это хорошая отправная точка для создания прокрутки в фреймах для sarafi и всех устройств. очень печально, хотя ....
Klewis

Это именно то, что мне нужно, чтобы прокрутить iframe, так как он был длиннее 5000 пикселей. Другие коды заставили длинный iFrame перекрывать нижеследующее содержимое.
Пенмас

для 16: 9 отступы должны составлять 56,25%
Сергей Скляр

17

Вы можете использовать эти приемы, упомянутые на этом сайте http://css-tricks.com/NetMag/FluidWidthVideo/Article-FluidWidthVideo.php .

Это очень полезно и легко понять. Все что нужно для создания

<div class="videoWrapper">
    <!-- Copy & Pasted from YouTube -->
    <iframe width="560" height="349" src="http://www.youtube.com/embed/n_dZNLr2cME?rel=0&hd=1" frameborder="0" allowfullscreen></iframe>
</div>

.videoWrapper {
    position: relative;
    padding-bottom: 56.25%; /* 16:9 */
    padding-top: 25px;
    height: 0;
}
.videoWrapper iframe {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
}

Вот ваша отредактированная js скрипка для демонстрации.


10

проверить это решение ... работает для меня >> https://jsfiddle.net/y49jpdns/

<html lang="en" class="no-js">
   <head>
      <meta charset="utf-8">
      <meta name="viewport" content="width=device-width,initial-scale=1.0">
      <style>
      html body {width: 100%;height: 100%;padding: 0px;margin: 0px;overflow: hidden;font-family: arial;font-size: 10px;color: #6e6e6e;background-color: #000;} #preview-frame {width: 100%;background-color: #fff;}</style>
      <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
      <script>
         var calcHeight = function() {
           $('#preview-frame').height($(window).height());
         }

         $(document).ready(function() {
           calcHeight();
         }); 

         $(window).resize(function() {
           calcHeight();
         }).load(function() {
           calcHeight();
         });
      </script>
   </head>
   <body>
      <iframe id="preview-frame" src="http://leowebguy.com/" name="preview-frame" frameborder="0" noresize="noresize">
      </iframe>
   </body>
</html>

Я обновил вашу скрипку, так как здесь и там были некоторые неправильные фрагменты. Это то же самое, и это работает так же, но не путая биты. jsfiddle.net/6NSX3/263
Techno.Shaman

IOS неправильно вычисляет высоту, она учитывает навигационную панель. Также Iframe на IOS не прокручивается.
Тине Колоини


6

DA прав. В вашей собственной скрипке, iframe действительно отзывчивый. Вы можете проверить это в firebug, проверив размер окна iframe. Но некоторые элементы внутри этого iframe не реагируют, поэтому они «торчат», когда размер окна небольшой. Например, div#products-post-wrapperширина составляет 8800 пикселей.


5

iFrames МОГУТ БЫТЬ полностью ЧУВСТВИТЕЛЬНЫМИ, сохраняя при этом их соотношение сторон с помощью небольшой техники CSS, называемой Техникой внутреннего отношения . Я написал сообщение в блоге, посвященное именно этому вопросу: https://benmarshall.me/responsive-iframes/

Эта суть является:

.intrinsic-container {
  position: relative;
  height: 0;
  overflow: hidden;
}


/* 16x9 Aspect Ratio */

.intrinsic-container-16x9 {
  padding-bottom: 56.25%;
}


/* 4x3 Aspect Ratio */

.intrinsic-container-4x3 {
  padding-bottom: 75%;
}

.intrinsic-container iframe {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
}
<div class="intrinsic-container intrinsic-container-16x9">
  <iframe src="//www.youtube.com/embed/KMYrIi_Mt8A" allowfullscreen></iframe>
</div>

БУМ, полностью отзывчивый!


3

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

Ссылка примера скрипта работает, потому что она отображает встроенную ссылку на видео YouTube, размер которой не объявлен.


Это вводит в заблуждение. Ссылка примера скрипта работает также хорошо, когда ширина и высота iframe заданы.
Philip007

14
Я разочарован, это так резко понизили. Сообщение, которое он передает, важно; что iFrames опасны, чтобы сделать отзывчивым, потому что вы находитесь на прихоти отзывчивости источника. Да, Youtube является исключением. Но его точка зрения остается в силе.
MattWithoos

3

Простой, с CSS:

iframe{
width: 100%;
max-width: 800px /*this can be anything you wish, to show, as default size*/
}

Пожалуйста, обратите внимание : но это не сделает контент внутри него отзывчивым!

2-е РЕДАКТИРОВАНИЕ: Есть два типа отзывчивых iframes, в зависимости от их внутреннего содержания:

тот , который , когда внутри фрейма содержит только на видео или в изображение или многие вертикально расположенный, для которых указанные выше две строки кода CSS почти достаточно подробно, и соотношение сторон имеет значение ...

а другой это:

тип контента для контактной / регистрационной формы , где мы должны сохранять не соотношение сторон, но чтобы предотвратить появление полосы прокрутки и содержимого, недостаточного для контейнера. На мобильном телефоне вы не видите полосу прокрутки, вы просто прокручиваете, пока не увидите содержимое (из iframe). Конечно, вы даете ему хоть какой-то вид height, чтобы заставить высоту контента адаптироваться к вертикальному пространству, встречающемуся на более узком экране - с медиа-запросами, такими как, например:

@media (max-width: 640px){
iframe{
height: 1200px /*whatever you need, to make the scrollbar hide on testing, and the content of the iframe reveal (on mobile/phone or other target devices) */
}
}
@media (max-width: 420px){
iframe{
height: 1600px /*and so on until and as needed */
}
}

1
это просто и
круто

это не поддерживает соотношение сторон при изменении размера iframe, то есть высота остается неизменной независимо от ширины.
Райана

@ Райан Я обновил свой ответ. Я частично согласен с вами, кстати.
Шандор Зуболы,

2

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

Прокрутка я вернулся, добавив scrolling="yes" код для вставки в iframe.

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


2

Удалите высоту и ширину iframe, указанные в пикселях, и используйте процент

iframe{  max-width: 100%;}

1
Но, это не делало внутренний контент отзывчивым.
Vir

1
<div class="wrap>
    <iframe src="../path"></iframe>
</div>

.wrap { 
    overflow: auto;
}

iframe, object, embed {
    min-height: 100%;
    min-width: 100%;
    overflow: auto;
}


1
Начиная

Из-за ограничений безопасности браузера вы должны будете включить файл Javascript как на «родительскую» страницу, так и на страницу, внедряемую через iframe («дочерний»).

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

Примечание: параметр «xdomain» в вызове функции makeResponsive () является необязательным.

Пример кода <!-- Activate responsiveness in the "child" page --><script src="/js/jquery.responsiveiframe.js"></script><script> var ri = responsiveIframe(); ri.allowResponsiveEmbedding();</script> <!-- Corresponding code in the "parent" page --><script src="/js/jquery.js"></script><script src="/js/jquery.responsiveiframe.js"></script><script> ;(function($){ $(function(){ $('#myIframeID').responsiveIframe({ xdomain: '*'}); }); })(jQuery);</script>

0

Со следующей разметкой:

<div class="video"><iframe src="https://www.youtube.com/embed/StTqXEQ2l-Y"></iframe></div>

Следующий CSS делает видео во всю ширину и 16: 9:

.video {
  position: relative;
  padding-bottom: 56.25%; /* 16:9 */
}

.video > .video__iframe {
    position: absolute;
    width: 100%;
    height: 100%;
    border: none;
  }
}

0

Я ищу больше об этой теме и наконец получаю хороший ответ. Вы можете попробовать , как это :

.wrapper {
width: 50%;
}
.container {
height: 0;
width: 100%;
padding-bottom: 50%;
overflow: hidden;
position: relative;
}
.container iframe {
top: 0;
left: 0;
width: 100%;
height: 100%;
position: absolute;
}
<div class="wrapper">
  <div class="container">
    <iframe src="there is path of your iframe"></iframe>
   </div>
</div>


0

Лучшее решение, позволяющее адаптировать iframe к любым экранам устройств, просто применить этот код (отлично работает с сайтами Игр):

iframe::-webkit-scrollbar{display:none}
.iframe{background:#fff;overflow:hidden}
.iframe iframe{width:100%;height:540px;border:0;display:block}
.iframe-content{position:absolute;width:100%;height:540px;overflow:auto;top:0;bottom:0;-webkit-overflow-scrolling:touch}

@media screen and (max-width:992px){.iframe iframe{height:720px}}
@media screen and (max-width:768px){.iframe iframe{height:720px}}
@media screen and (max-width:720px){.iframe iframe{height:720px}}
@media screen and (max-width:479px){.iframe iframe{height:480px}}
@media screen and (max-height:400px){.iframe iframe{height:360px}}

Если вы ищете адаптивный игровой контейнер, подходящий для всех устройств, примените этот код, который использует расширенные запросы CSS @media.


Привет, HTML-код Iframe прост, просто выглядит так:
Mizo Games

<div class = "iframe"> <iframe src = ""> </ iframe> </ div>
Mizo Games

На самом деле я использую его на своем веб-сайте: Al3abMizo Games, и вы можете попробовать его, играя в любую игру на любом устройстве, независимо от размера экрана.
Mizo Games

0

IFrame полностью реагирует на ситуации, когда соотношение сторон неизвестно, а контент в iFrame полностью отзывчив.

Ни одно из вышеперечисленных решений не сработало для меня, а именно для создания полностью адаптивного iFrame с полностью адаптивным динамическим контентом. Поддерживать любое соотношение сторон не было возможным.

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

Код:

function getWindowHeight() {
        console.log('Get Window Height Called')
        var currentWindowHeight = $(window).height()

        var iFrame = document.getElementById("myframe")
        var frameHeight = currentWindowHeight - 95

        iFrame.height = frameHeight; 

    }
//Timeout to prevent function from repeatedly firing
    var doit;
    window.onresize = function(){
      clearTimeout(doit);
      doit = setTimeout(resizedw, 100);
    };

Я также создал тайм-аут, чтобы при изменении размера функцию не вызывали миллион раз.


0
For Example :

<div class="intrinsic-container">
  <iframe src="//www.youtube.com/embed/KMYrIi_Mt8A" allowfullscreen></iframe>
</div>

CSS 

.intrinsic-container {
  position: relative;
  height: 0;
  overflow: hidden;
}

/* 16x9 Aspect Ratio */
.intrinsic-container-16x9 {
  padding-bottom: 56.25%;
}

/* 4x3 Aspect Ratio */
.intrinsic-container-4x3 {
  padding-bottom: 75%;
}

.intrinsic-container iframe {
  position: absolute;
  top:0;
  left: 0;
  width: 100%;
  height: 100%;
}

0

Проверьте этот полный код. Вы можете использовать контейнеры в процентах, как показано ниже:

<html>
<head>
<title>How to make Iframe Responsive</title>
<style>
html,body        {height:100%;}
.wrapper         {width:80%;height:100%;margin:0 auto;background:#CCC}
.h_iframe        {position:relative;}
.h_iframe .ratio {display:block;width:100%;height:auto;}
.h_iframe iframe {position:absolute;top:0;left:0;width:100%; height:100%;}
</style>
</head>
<body>
<div class="wrapper">
<div class="h_iframe">
<img class="ratio" src=""/>
<iframe src="http://www.sanwebcorner.com" frameborder="0" allowfullscreen></iframe>
</div>
<p>Please scale the "result" window to notice the effect.</p>
</div>
</body>
</html>

Проверьте эту демонстрационную страницу.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.