Проблема в том, что когда вам нужно использовать IFrame для вставки контента на веб-сайт, то в современном веб-мире ожидается, что IFrame также будет отзывчивым. Теоретически это просто, просто помощник использует <iframe width="100%"></iframe>
или устанавливает ширину CSS, iframe { width: 100%; }
однако на практике это не так просто, но может быть.
Если iframe
содержимое полностью адаптивно и может изменять свой размер без внутренних полос прокрутки, то iOS Safari изменит размер iframe
без каких-либо реальных проблем.
Если вы рассмотрите следующий код:
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=9,10,11" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Iframe Isolation Test</title>
<style type="text/css" rel="stylesheet">
#Main {
padding: 10px;
}
</style>
</head>
<body>
<h1>Iframe Isolation Test 13.17</h1>
<div id="Main">
<iframe height="950" width="100%" src="Content.html"></iframe>
</div>
</body>
</html>
С Content.html :
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=9,10,11" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Iframe Isolation Test - Content</title>
<style type="text/css" rel="stylesheet">
#Main {
width: 100%;
background: #ccc;
}
</style>
</head>
<body>
<div id="Main">
<div id="ScrolledArea">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc malesuada purus quis commodo convallis. Fusce consectetur mauris eget purus tristique blandit. Nam nec volutpat augue. Aliquam sit amet augue vitae orci fermentum tempor sit amet gravida augue. Pellentesque convallis velit eu malesuada malesuada. Aliquam erat volutpat. Nam sollicitudin nulla nec neque viverra, non suscipit purus tincidunt. Aenean blandit nisi felis, sit amet ornare mi vestibulum ac. Praesent ultrices varius arcu quis fringilla. In vitae dui consequat, rutrum sapien ut, aliquam metus. Proin sit amet porta velit, suscipit dignissim arcu. Cras bibendum tellus eu facilisis sodales. Vestibulum posuere, magna ut iaculis consequat, tortor erat vulputate diam, ut pharetra sapien massa ut magna. Donec massa purus, pharetra sed pellentesque nec, posuere ut velit. Nam venenatis feugiat odio quis tristique.
</div>
</div>
</body>
</html>
Тогда это работает без проблем в iOS 7.1 Safari. Вы можете без проблем переключаться между альбомной и портретной ориентацией.
Однако, просто изменив Content.html CSS, добавив это:
#ScrolledArea {
width: 100%;
overflow: scroll;
white-space: nowrap;
background: #ff0000;
}
Вы получаете это:
Как вы можете видеть, даже несмотря на то, content.html содержимого полностью реагирует ( Div # ScrolledArea имеет overflow: scroll
множество) и IFRAME ширина 100% , то IFrame все еще занимает всю ширину сНа # ScrolledArea как будто переполнение даже не существует. демонстрация
В таких случаях, когда у iframe
контента есть области прокрутки, возникает вопрос, как получить iframe
отзывчивость, когда у содержимого iframe есть области горизонтальной прокрутки? Проблема здесь не в том, что Content.html не реагирует, а в том, что iOS Safari просто изменяет размер iframe, чтобы div#ScrolledArea
он был полностью виден.
white-space: nowrap
стилем?white-space: nowrap
проблема не в этом. Я просто использую его, чтобы получить максимальную ширинуdiv#ScrolledArea
. Проблема возникает, когда в содержимом IFrame есть области с горизонтальной прокруткой. Если это так, iOS Safari просто игнорирует ваши настройки ширины и показывает содержимое дыр и нарушает отзывчивость сайта.Ответы:
Решение этой проблемы на самом деле довольно простое, и есть два способа решить эту проблему. Если у вас есть контроль над Content.html, просто измените
div#ScrolledArea
ширину CSS на:По сути, идея здесь проста: вы устанавливаете значение
width
, которое меньше, чем область просмотра (в этом случае ширина iframe), а затем перезаписываете его,min-width: 100%
чтобы учесть фактическое,width: 100%
какое iOS Safari по умолчанию перезаписывает. Он*width: 100%;
существует, чтобы код оставался совместимым с IE6, но если вам не нужен IE6, вы можете его опустить. демонстрацияКак вы теперь можете видеть,
div#ScrolledArea
ширина на самом деле составляет 100%, и онoverflow: scroll;
может сделать это и скрыть переполненный контент. Если у вас есть доступ к содержимому iframe, это предпочтительнее.Однако, если у вас нет доступа к содержимому iframe (по какой-либо причине), вы можете использовать тот же метод для самого iframe. Просто используйте тот же CSS в iframe:
Однако здесь есть одно ограничение: вам нужно отключить полосы прокрутки с
scrolling="no"
помощью iframe, чтобы это работало:Если полосы прокрутки разрешены, то это больше не будет работать в iframe. Тем не менее, если вместо этого вы измените Content.html, вы можете сохранить прокрутку в iframe. демонстрация
источник
!important
кwidth
атрибуту , чтобы получить IFrame отзывчивым-веб-дизайн готов на iPhone 4 с прошивкой 7width
было установлено ранее с!important
или более высокий приоритет CSS перезаписал его. В единичных случаях в iPhone 4 iOS7 она не понадобилась.scrolling="yes"
противном случае это было невозможно исправить, чтобы исправление работало в IFRAME, вам нужно иметьscrolling="no"
только IFRAMEПроблема, похоже, в том, что Mobile Safari откажется подчиняться ширине вашего iFrame, если документ, который он содержит, шире, чем вы указали. Пример:
http://jsbin.com/hapituto/1
В браузере настольного компьютера вы увидите, что для iFrame и Div установлено значение 300 пикселей. Содержимое шире, поэтому вы можете прокручивать iFrame.
Однако в мобильном сафари вы заметите, что iFrame автоматически расширяется до ширины содержимого.
Я предполагаю, что это способ решения давних проблем с прокруткой контента на странице. В прошлом, если у вас был большой прокручиваемый iframe на сенсорном устройстве, вы бы «застряли» в iframe, поскольку это была бы прокрутка вместо самой страницы. Похоже, Apple решила, что поведение iFrame по умолчанию - «без прокрутки», и расширяет его, чтобы предотвратить это.
Одним из вариантов может быть этот обходной путь. Вместо того, чтобы предполагать, что iFrame будет прокручиваться, поместите iframe в DIV, который у вас есть, и позвольте ему прокручиваться.
пример: http://jsbin.com/zakedaja/1
Пример разметки:
В мобильном сафари теперь можно прокручивать содержимое теперь полностью развернутого iFrame с помощью содержащего его div.
Уловка: в браузере для настольных ПК это выглядит ужасно, так как теперь у вас есть двойные полосы прокрутки. Поэтому вам, возможно, придется выполнить обнаружение браузера с помощью JS, чтобы обойти это.
источник
div#ScrolledArea
(в зеленом цвете) в моем примере. Я просто неправильно читал раньше. Но iframe не должен прокручивать, только изменяя размеры самого себя, основываясь на элементе контейнера, т.е. естьwidth: 100%;
Мне нужно было кроссбраузерное решение. Требования были:
Основываясь на том, что я узнал от @Idra относительно scrolling = "no" в iOS и этой публикации о подгонке содержимого iFrame на экран в iOS, вот что у меня получилось. Надеюсь, это поможет кому-то =)
HTML
CSS
JS
источник
Проблема всех этих решений в том, что высота
iframe
никогда не меняется.Это означает, что вы не сможете центрировать элементы внутри с
iframe
помощью Javascriptposition:fixed;
, илиposition:absolute;
посколькуiframe
сам по себе никогда не прокручивается.Мое решение, подробно описанное здесь, заключается в том, чтобы обернуть все содержимое iframe внутри с
div
помощью этого CSS:Таким образом, Safari считает, что контент не имеет высоты, и позволяет вам
iframe
правильно назначить высоту . Это также позволяет вам позиционировать элементы так, как вы хотите.Здесь вы можете увидеть быструю и грязную демонстрацию.
источник
iframe
, но в моем случае это я. Ура!Эта проблема также присутствует в iOS Chrome.
Я просмотрел все решения выше, большинство из них очень хакерские.
Если вам не нужна поддержка старых браузеров, просто установите ширину iframe равной 100vw;
Примечание. Проверьте поддержку единиц просмотра https://caniuse.com/#feat=viewport-units.
источник
Я работаю с ionic2 и конфигурации системы, как показано ниже
Для меня эта проблема была решена с помощью этого кода -
для тега html iframe -
См. Css того же, что и -
Положение собственности играет жизненно важную роль здесь, в моем случае.
позиция: относительная;
Это может вам тоже помочь !!!
источник
Только CSS решение
HTML
CSS
DEMO
Еще одна демонстрация здесь с HTML-страницей в iframe
источник
У меня была проблема с шириной на панели содержимого, создавая горизонтальную полосу прокрутки для iframe. Оказалось, что изображение оказалось шире, чем ожидалось. Я смог решить эту проблему, установив для всех изображений максимальную ширину css в процентах.
источник
на самом деле у меня просто работало в ios отключение прокрутки
<iframe src="//www.youraddress.com/" scrolling="no"></iframe>
и лечение ОС с помощью скрипта.
источник
Для меня решения CSS не работали. Но программная установка ширины делает свою работу. При загрузке iframe программно установите ширину:
источник