Обновление в 2019 году
TL; DR: сегодня лучший вариант - последний в этом ответе - flexbox. Все это поддерживает хорошо и уже много лет. Сделай это и не оглядывайся назад. Остальная часть этого ответа оставлена по историческим причинам.
Хитрость заключается в том, чтобы понять, из чего взят 100%. Чтение спецификаций CSS может помочь вам в этом.
Короче говоря, существует такая вещь, как «содержащий блок», который не является обязательным для родительского элемента. Проще говоря, это первый элемент иерархии, который имеет положение: относительное или положение: абсолютное. Или сам элемент тела, если больше ничего нет. Поэтому, когда вы говорите «width: 100%», он проверяет ширину «содержащего блока» и устанавливает ширину вашего элемента равным размеру. Если там было что-то еще, то вы могли бы получить содержимое «содержащего блока», которое больше его самого (таким образом, «переполнено»).
Высота работает так же. За одним исключением. Вы не можете получить высоту до 100% окна браузера. Элементом самого верхнего уровня, на который можно рассчитать 100%, является элемент body (или html? Not sure), который растягивается настолько, чтобы вместить его содержимое. Указание высоты: 100% для него не будет иметь никакого эффекта, потому что у него нет «родительского элемента», для которого можно измерить 100%. Само окно не считается. ;)
Чтобы что-то растянуть ровно на 100%, у вас есть два варианта:
- Использовать JavaScript
- Не используйте DOCTYPE. Это не очень хорошая практика, но это переводит браузеры в «режим причуд», в котором вы можете сделать height = «100%» для элементов, и он растянет их до размера окна. Обратите внимание, что остальная часть вашей страницы, вероятно, также должна быть изменена, чтобы соответствовать изменениям DOCTYPE.
Обновление: я не уверен, не ошибся ли я уже, когда я отправил это, но это конечно устарело теперь. Сегодня вы можете сделать это в своей таблице стилей: html, body { height: 100% }
и она будет фактически распространяться на всю область просмотра. Даже с DOCTYPE. min-height: 100%
также может быть полезным, в зависимости от вашей ситуации.
И я бы не советовал никому больше делать документ в режиме причуд , потому что это вызывает гораздо больше головных болей, чем решает их. В каждом браузере есть свой причудливый режим, поэтому заставить вашу страницу выглядеть одинаково во всех браузерах на два порядка сложнее. Используйте DOCTYPE. Всегда. Желательно HTML5 один - <!DOCTYPE html>
. Это легко запомнить и работает как шарм во всех браузерах, даже 10-летних.
Единственное исключение - когда вы должны поддерживать что-то вроде IE5 или что-то еще. Если вы там, то вы все равно сами по себе. Эти древние браузеры не похожи на современные браузеры, и небольшой совет, который приведен здесь, поможет вам с ними. С другой стороны, если вы там, вероятно, вам просто нужно поддерживать ОДИН вид браузера, который избавляет от проблем совместимости.
Удачи!
Обновление 2: Эй, это было давно! Спустя 6 лет появляются новые опции. Я только что обсудил в комментариях ниже, вот еще несколько хитростей для вас, которые работают в современных браузерах.
Вариант 1 - абсолютное позиционирование. Красиво и чисто, когда вы знаете точную высоту первой части.
body, html {width: 100%; height: 100%; margin: 0; padding: 0}
.first-row {position: absolute;top: 0; left: 0; right: 0; height: 100px; background-color: lime;}
.second-row {position: absolute; top: 100px; left: 0; right: 0; bottom: 0; background-color: red }
.second-row iframe {display: block; width: 100%; height: 100%; border: none;}
<div class="first-row">
<p>Some text</p>
<p>And some more text</p>
</div>
<div class="second-row">
<iframe src="https://jsfiddle.net/about"></iframe>
</div>
Некоторые примечания - second-row
контейнер необходим , потому что bottom: 0
и right: 0
не работает на фреймов по какой - то причине. Что-то связанное с тем, чтобы быть "замененным" элементом. Но width: 100%
и height: 100%
работает просто отлично. display: block
необходим, потому что это inline
элемент по умолчанию, и в противном случае пробелы начинают создавать странные переполнения.
Вариант 2 - таблицы. Работает, когда вы не знаете высоту первой части. Вы можете использовать либо реальные <table>
теги, либо сделать это причудливым способом display: table
. Я пойду на последнее, потому что это, кажется, в моде в эти дни.
body, html {width: 100%; height: 100%; margin: 0; padding: 0}
.row-container {display: table; empty-cells: show; border-collapse: collapse; width: 100%; height: 100%;}
.first-row {display: table-row; overflow: auto; background-color: lime;}
.second-row {display: table-row; height: 100%; background-color: red; overflow: hidden }
.second-row iframe {width: 100%; height: 100%; border: none; margin: 0; padding: 0; display: block;}
<div class="row-container">
<div class="first-row">
<p>Some text</p>
<p>And some more text</p>
</div>
<div class="second-row">
<iframe src="https://jsfiddle.net/about"></iframe>
</div>
</div>
Некоторые примечания - overflow: auto
гарантирует, что строка всегда включает в себя все свое содержимое. В противном случае плавающие элементы могут иногда переполняться. height: 100%
На втором ряду убеждается он расширяется настолько , насколько это может выдавливание первого ряда , как малые , как он получает.
Вариант 3 - флексбокс. Самый чистый из них, но с менее чем звездной поддержкой браузера. IE10 понадобятся -ms-
префиксы для свойств flexbox, и ничто меньшее не будет поддерживать его вообще.
body, html {width: 100%; height: 100%; margin: 0; padding: 0}
.row-container {display: flex; width: 100%; height: 100%; flex-direction: column; background-color: blue; overflow: hidden;}
.first-row {background-color: lime; }
.second-row { flex-grow: 1; border: none; margin: 0; padding: 0; }
<div class="row-container">
<div class="first-row">
<p>Some text</p>
<p>And some more text</p>
</div>
<iframe src="https://jsfiddle.net/about" class="second-row"></iframe>
</div>
Некоторые замечания - overflow: hidden
это потому, что iframe по-прежнему генерирует какое-то переполнение даже display: block
в этом случае. Он не виден в полноэкранном режиме или в редакторе фрагментов, но небольшое окно предварительного просмотра получает дополнительную полосу прокрутки. Понятия не имею, что это такое, фреймы странные.
Мы используем JavaScript для решения этой проблемы; вот источник.
Примечание:
ifm
это идентификатор iframepageY()
был создан Джоном Резигом (автором jQuery)источник
Еще один способ сделать это - использовать
position: fixed;
родительский узел.Если я не ошибаюсь,
position: fixed;
связывает элемент с областью просмотра, поэтому, как только вы передадите этот узелwidth: 100%;
иheight: 100%;
свойства, он охватит весь экран. С этого момента вы можете поместить<iframe>
тег внутри него и распределить его по оставшемуся пространству (как по ширине, так и по высоте) с помощью простойwidth: 100%; height: 100%;
инструкции CSS.Пример кода
источник
position: fixed
в iframe.Вот несколько современных подходов:
Подход 1 - Комбинация видового экрана относительных единиц /
calc()
.Выражение
calc(100vh - 30px)
представляет оставшуюся высоту. Где100vh
высота браузера и использованиеcalc()
эффективно смещает высоту другого элемента.Пример здесь
Поддержка
calc()
здесь ; поддержка относительных единиц просмотра здесь .Подход 2 - подход Flexbox
Пример здесь
Установите
display
для общего родительского элемента значениеflex
вместе сflex-direction: column
(при условии, что вы хотите, чтобы элементы располагались друг над другом). Затем установитеflex-grow: 1
дочернийiframe
элемент, чтобы он заполнил оставшееся пространство.Поскольку этот подход имеет меньшую поддержку 1 , я бы предложил использовать вышеупомянутый подход.
1 Хотя кажется, что он работает в Chrome / FF, он не работает в IE (первый метод работает во всех современных браузерах).
источник
flexbox
вариант, потому чтоcalc
вам нужно знать количество места, чтобы вычесть изvh
. Сflexbox
помощью простогоflex-grow:1
это делает.Вы можете сделать это с
DOCTYPE
, но вы должны использоватьtable
. Проверь это:источник
Возможно, на этот вопрос уже был дан ответ (несколько приведенных выше «правильных» способов сделать это), но я подумал, что просто добавлю свое решение.
Наш iFrame загружен в div, поэтому мне нужно что-то еще, а не window.height. И, видя, что наш проект уже сильно зависит от jQuery, я считаю, что это самое элегантное решение:
Где, конечно, "#middle" - это идентификатор div. Единственное, что вам нужно сделать, это вспомнить это изменение размера всякий раз, когда пользователь изменяет размер окна.
источник
Вот что я сделал. У меня была такая же проблема, и я часами искал в Интернете ресурсы.
Я добавил это в раздел головы.
Обратите внимание, что мой iframe находится внутри средней ячейки таблицы, которая имеет 3 строки и 1 столбец.
источник
Код MichAdel работает для меня, но я внес небольшую модификацию, чтобы он работал правильно.
источник
Это верно, вы показываете iframe со 100% высотой относительно его контейнера: тела.
Попробуй это:
Конечно, измените высоту второго делителя на желаемую высоту.
источник
попробуйте следующее:
это сработало для меня
источник
Вы можете сделать это с помощью html / css следующим образом:
источник
Новое в HTML5: использовать calc (по высоте)
источник
Я использовал display: table, чтобы исправить подобную проблему. Это почти работает для этого, оставляя небольшую вертикальную полосу прокрутки. Если вы пытаетесь заполнить этот гибкий столбец чем-то, кроме iframe, он работает нормально (не
Возьми следующий HTML
Измените внешний div для использования display: table и убедитесь, что он имеет ширину и высоту.
Сделайте баннер строкой таблицы и установите его высоту в соответствии с вашими предпочтениями:
Добавьте дополнительный div вокруг вашего iframe (или любого другого необходимого вам контента) и сделайте его строкой таблицы с высотой, установленной на 100% (установка его высоты критична, если вы хотите встроить iframe для заполнения высоты)
Ниже показан jsfiddle, показывающий его на работе (без iframe, потому что в скрипте это не работает)
https://jsfiddle.net/yufceynk/1/
источник
Я думаю, что у вас есть концептуальная проблема здесь. Сказать: «Я пытался установить высоту: 100% на iframe, результат довольно близок, но iframe пытался заполнить всю страницу» , ну, когда «100%» не было равно «целому»?
Вы попросили, чтобы iframe заполнил всю высоту своего контейнера (который является телом), но, к сожалению, в <div> выше у него есть одноуровневый элемент уровня, который вы просили иметь размер 30px. Таким образом, общий объем родительского контейнера теперь запрашивается до 100% + 30px> 100%! Отсюда полосы прокрутки.
Я думаю, что вы имеете в виду , что вы хотите, чтобы iframe использовал то, что осталось, например, кадры и ячейки таблицы, то есть height = "*". IIRC этого не существует.
К сожалению, насколько мне известно, нет никакого способа эффективно смешивать / вычислять / вычитать абсолютные и относительные единицы, поэтому я думаю, что вы сведены к двум вариантам:
Абсолютно разместите ваш div, который вытащит его из контейнера, так что один iframe будет использовать его высоту контейнера. Это оставляет вас со множеством других проблем, но, возможно, для того, что вы делаете, непрозрачность или выравнивание будет в порядке.
В качестве альтернативы вам нужно указать% высоты для div и значительно уменьшить высоту iframe. Если абсолютная высота действительно так важна, вам нужно вместо этого применить ее к дочернему элементу div.
источник
Попробовав маршрут css некоторое время, я написал что-то довольно простое в jQuery, которое сделало эту работу за меня:
Протестировано в IE8, Chrome, Firefox 3.6
источник
Это будет работать с приведенным ниже кодом
источник
Аналогичный ответ @MichAdel, но я использую JQuery и более элегантно.
iframe_id
идентификатор тега iframeисточник
Вы можете сделать это, измерив размер тела при событиях загрузки / изменения размера и установив высоту (полная высота - высота баннера).
Обратите внимание, что в настоящее время в IE8 Beta2 вы не можете сделать это по размеру, так как это событие в настоящее время прерывается в IE8 Beta2.
источник
или вы можете пойти в школу и, возможно, использовать набор фреймов :
источник
Хотя я согласен, что JS кажется лучшим вариантом, у меня есть несколько работающее решение только для CSS. Недостатком этого является то, что если вам приходится часто добавлять контент в ваш HTML-документ iframe, вам придется адаптировать один процентный промежуток времени.
Решение:
Попробуйте не указывать высоту ОБА ваших HTML-документов,
тогда только код это:
примечание: div должен быть вашим основным разделом.
Это должно относительно работать. iframe точно рассчитывает 300% видимой высоты окна. Если вы HTML-содержание из 2-го документа (в iframe) меньше, чем высота вашего браузера в 3 раза, это работает. Если вам не нужно часто добавлять контент в этот документ, это постоянное решение, и вы можете просто найти свой собственный необходимый% в зависимости от высоты вашего контента.
Это работает, потому что предотвращает наследование 2-го HTML-документа (тот, который вставлен), его высота от родительского HTML-документа. Это предотвращает это, потому что мы не указали высоту для них обоих. Когда мы даем% дочернему элементу, он ищет своего родителя, если нет, он принимает его высоту содержимого. И только если другим контейнерам не дали высоты, из того, что я пробовал.
источник
Атрибут « seamless » - это новый стандарт, призванный решить эту проблему:
http://www.w3schools.com/tags/att_iframe_seamless.asp
При назначении этого атрибута он удалит границы и полосы прокрутки и изменит размер фрейма в соответствии с его размером. хотя поддерживается только в Chrome и последних версиях Safari
подробнее об этом здесь: Бесшовные атрибут HTML5 iFrame
источник
Простое решение jQuery
Используйте это в скрипте внутри страницы iframed
источник
Вы не можете установить высоту iframe в%, потому что рост вашего родителя не равен 100%, поэтому установите родительский рост равным 100%, а затем примените высоту iframe 100%.
источник
Если у вас есть доступ к содержимому iframe, который будет загружен, вы можете указать его родительскому элементу изменить размер при каждом изменении размера.
Если у вас есть более одного iframe на странице, вам может понадобиться использовать id или другие хитрые методы для улучшения .find («iframe»), чтобы вы выбрали правильный.
источник
Я думаю, что лучший способ достичь этого сценария, используя позицию CSS. установите позицию относительно вашего родительского div и позицию: абсолютную для вашего iframe.
для других дополнений и отступов в настоящее время css3 calc () очень продвинут и в основном совместим со всеми браузерами.
проверьте calc ()
источник
Почему бы не сделать это (с незначительной корректировкой для заполнения тела / полей)
источник
-0
с+'px'
в конце. Это работает на мобильном телефоне?