Aktualizacja w 2019 r
TL; DR: Dzisiaj najlepszą opcją jest ostatnia w tej odpowiedzi - flexbox. Wszystko ładnie to obsługuje i ma od lat. Idź po to i nie oglądaj się za siebie. Pozostała część tej odpowiedzi została pozostawiona z przyczyn historycznych.
Sztuką jest zrozumienie, z czego bierze się 100%. Czytanie specyfikacji CSS może ci w tym pomóc.
Krótko mówiąc - istnieje coś takiego jak „zawierający blok” - który nie jest konieczny jako element nadrzędny. Mówiąc prosto, jest to pierwszy element w hierarchii, który ma pozycję: względną lub pozycję: bezwzględną. Lub sam element ciała, jeśli nie ma nic innego. Kiedy powiesz „szerokość: 100%”, sprawdza szerokość „bloku zawierającego” i ustawia szerokość elementu na taki sam rozmiar. Jeśli było tam coś jeszcze, możesz uzyskać zawartość „bloku zawierającego”, który jest większy niż on sam (w ten sposób „przepełniony”).
Wysokość działa w ten sam sposób. Z jednym wyjątkiem. Nie można uzyskać wysokości do 100% okna przeglądarki. Elementem najwyższego poziomu, na podstawie którego można obliczyć 100%, jest element body (lub html? Niepewny), który rozciąga się na tyle, aby pomieścić jego zawartość. Określenie wysokości: 100% nie będzie miało żadnego wpływu, ponieważ nie ma „elementu nadrzędnego”, względem którego można zmierzyć 100%. Samo okno się nie liczy. ;)
Aby coś rozciągało się dokładnie w 100% w oknie, masz dwie możliwości:
- Użyj JavaScript
- Nie używaj DOCTYPE. Nie jest to dobra praktyka, ale ustawia przeglądarki w „trybie dziwactwa”, w którym można ustawić wysokość = „100%” na elementach i rozciągnie je do rozmiaru okna. Pamiętaj, że reszta Twojej strony prawdopodobnie będzie musiała zostać zmieniona, aby uwzględnić zmiany DOCTYPE.
Aktualizacja: Nie jestem pewien, czy nie pomyliłem się już, kiedy to opublikowałem, ale z pewnością jest to teraz nieaktualne. Dzisiaj możesz to zrobić w arkuszu stylów: html, body { height: 100% }
i faktycznie rozciągnie się on na całą twoją rzutnię. Nawet z DOCTYPE. min-height: 100%
może być również przydatny, w zależności od twojej sytuacji.
Nie radziłbym też nikomu tworzyć dokumentu w trybie dziwactwa , ponieważ powoduje to o wiele więcej bólów głowy niż ich rozwiązuje. Każda przeglądarka ma inny tryb dziwactwa, więc sprawienie, by twoja strona wyglądała spójnie w różnych przeglądarkach, staje się o dwa rzędy wielkości trudniejsze. Użyj DOCTYPE. Zawsze. Najlepiej ten HTML5 - <!DOCTYPE html>
. Jest łatwy do zapamiętania i działa jak urok we wszystkich przeglądarkach, nawet tych 10-letnich.
Jedynym wyjątkiem jest sytuacja, gdy musisz obsługiwać coś takiego jak IE5 lub coś takiego. Jeśli tam jesteś, to i tak jesteś sam. Te starożytne przeglądarki nie przypominają dzisiaj dzisiejszych przeglądarek, a niewiele porad, które tu podano, pomoże ci z nimi korzystać. Z drugiej strony, jeśli tam jesteś, prawdopodobnie po prostu musisz obsługiwać JEDNĄ przeglądarkę, która pozbywa się problemów ze zgodnością.
Powodzenia!
Aktualizacja 2: Hej, minęło dużo czasu! 6 lat później pojawiają się nowe opcje. Właśnie miałem dyskusję w komentarzach poniżej, oto więcej sztuczek, które działają w dzisiejszych przeglądarkach.
Opcja 1 - pozycjonowanie bezwzględne. Ładne i czyste, gdy znasz dokładną wysokość pierwszej części.
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>
Kilka uwag - w second-row
pojemnik jest potrzebna, bo bottom: 0
i right: 0
nie działa na iframe z jakiegoś powodu. Ma to coś wspólnego z byciem „zamienionym” elementem. Ale width: 100%
i height: 100%
działa dobrze. display: block
jest potrzebne, ponieważ jest toinline
element domyślnie, a białe znaki w przeciwnym razie powodują dziwne przepełnienia.
Opcja 2 - tabele. Działa, gdy nie znasz wysokości pierwszej części. Możesz użyć rzeczywistych <table>
tagów lub zrobić to w fantazyjny sposób display: table
. Ja wybiorę to drugie, ponieważ wydaje się, że jest teraz modne.
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>
Kilka uwag - overflow: auto
upewnia się, że wiersz zawsze zawiera całą jego zawartość. W przeciwnym razie elementy pływające mogą czasami się przepełnić. Theheight: 100%
W drugim rzędzie sprawia pewien, że rozszerza się jak może ściskając pierwszy wiersz tak małe, jak to się robi.
Opcja 3 - Flexbox. Najczystszy z nich wszystkich, ale z mniej niż gwiazdkową obsługą przeglądarki. IE10 będzie potrzebował -ms-
prefiksów dla właściwości flexbox i cokolwiek mniej nie będzie go w ogóle obsługiwał.
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>
Niektóre uwagi - dzieje się overflow: hidden
tak, ponieważ iframe nadal generuje pewien rodzaj przepełnienia, nawet display: block
w tym przypadku. Nie jest widoczny w widoku pełnoekranowym ani w edytorze fragmentów, ale małe okno podglądu ma dodatkowy pasek przewijania. Nie mam pojęcia, co to jest, iframe są dziwne.
Używamy JavaScript, aby rozwiązać ten problem; tutaj jest źródło.
Uwaga:
ifm
to identyfikator iframepageY()
został stworzony przez Johna Resiga (autora jQuery)źródło
Innym sposobem na to byłoby użycie
position: fixed;
węzła nadrzędnego.Jeśli się nie mylę,
position: fixed;
przywiązuje element do rzutni, a zatem, gdy podasz ten węzełwidth: 100%;
iheight: 100%;
właściwości, obejmie on cały ekran. Od tego momentu możesz umieszczać<iframe>
w nim znacznik i rozciągać go na pozostałą przestrzeń (zarówno na szerokość, jak i na wysokość) za pomocą prostejwidth: 100%; height: 100%;
instrukcji CSS.Przykładowy kod
źródło
position: fixed
element iframe.Oto kilka nowoczesnych podejść:
Podejście 1 - Kombinacja jednostek względnych rzutni /
calc()
.Wyrażenie
calc(100vh - 30px)
reprezentuje pozostałą wysokość. Gdzie100vh
jest wysokość przeglądarki, a użyciecalc()
skutecznie wypiera wysokość drugiego elementu.Przykład tutaj
Wsparcie dla
calc()
tutaj ; obsługa jednostek względnych rzutni tutaj .Podejście 2 - podejście Flexbox
Przykład tutaj
Ustaw
display
wspólny element nadrzędny naflex
wraz zflex-direction: column
(zakładając, że chcesz, aby elementy układały się jeden na drugim). Następnie ustaw elementflex-grow: 1
potomnyiframe
, aby wypełnił pozostałą przestrzeń.Ponieważ to podejście ma mniejsze wsparcie 1 , sugeruję skorzystanie z wyżej wymienionego podejścia.
1 Chociaż wydaje się, że działa w Chrome / FF, nie działa w IE (pierwsza metoda działa we wszystkich obecnych przeglądarkach).
źródło
flexbox
opcję, ponieważcalc
musisz znać ilość miejsca do odliczenia odvh
. Zflexbox
prostymflex-grow:1
robi to.Możesz to zrobić
DOCTYPE
, ale musisz użyćtable
. Sprawdź to:źródło
Być może już na to odpowiedziano (kilka powyższych odpowiedzi to „poprawne” sposoby na zrobienie tego), ale pomyślałem, że po prostu dodam również moje rozwiązanie.
Nasz iFrame jest ładowany w div, dlatego potrzebowałem czegoś innego niż window.height. Widząc, że nasz projekt jest już w dużej mierze oparty na jQuery, uważam to za najbardziej eleganckie rozwiązanie:
Gdzie oczywiście „#middle” jest identyfikatorem div. Jedyną dodatkową rzeczą, którą musisz zrobić, to przywołać tę zmianę rozmiaru za każdym razem, gdy użytkownik zmieni rozmiar okna.
źródło
Oto co zrobiłem. Miałem ten sam problem i godzinami szukałem zasobów w Internecie.
Dodałem to do sekcji głównej.
Pamiętaj, że mój iframe znajduje się w środkowej komórce tabeli, która ma 3 wiersze i 1 kolumnę.
źródło
Kod MichAdel działa dla mnie, ale dokonałem drobnych modyfikacji, aby działał poprawnie.
źródło
Zgadza się, wyświetlasz ramkę iframe ze 100% wysokością względem pojemnika: ciała.
Spróbuj tego:
Oczywiście zmień wysokość drugiego diva na żądaną wysokość.
źródło
spróbuj wykonać następujące czynności:
zadziałało dla mnie
źródło
Możesz to zrobić za pomocą html / css w następujący sposób:
źródło
Nowości w HTML5: użyj calc (na wysokości)
źródło
Użyłem tabeli display:, aby naprawić podobny problem. To prawie działa, pozostawiając mały pionowy pasek przewijania. Jeśli próbujesz wypełnić tę elastyczną kolumnę czymś innym niż iframe, to działa dobrze (nie
Weź następujący kod HTML
Zmień zewnętrzny div, aby użyć display: table i upewnij się, że ma ustawioną szerokość i wysokość.
Ustaw baner jako wiersz tabeli i ustaw jego wysokość zgodnie z własnymi preferencjami:
Dodaj dodatkowy div wokół elementu iframe (lub jakiejkolwiek innej zawartości, której potrzebujesz) i ustaw go jako wiersz tabeli o wysokości ustawionej na 100% (ustawienie jego wysokości ma kluczowe znaczenie, jeśli chcesz osadzić element iframe w celu wypełnienia wysokości)
Poniżej znajduje się jsfiddle pokazujący go w pracy (bez iframe, ponieważ wydaje się, że nie działa w skrzypcach)
https://jsfiddle.net/yufceynk/1/
źródło
Myślę, że masz tutaj problem koncepcyjny. Mówiąc „Próbowałem ustawić wysokość: 100% w ramce iframe, wynik jest dość bliski, ale ramka iframe próbowała wypełnić całą stronę” , no cóż, kiedy „100%” nie było równe „całości”?
Poprosiłeś ramkę iframe o wypełnienie całej wysokości kontenera (którym jest ciało), ale niestety ma ona poziom siostry na poziomie <div> powyżej, o który prosiłeś, aby był duży na 30 pikseli. Zatem suma kontenera nadrzędnego jest teraz proszona o zmianę rozmiaru na 100% + 30px> 100%! Stąd paski przewijania.
Mam na myśli to, że chciałbyś, aby iframe zużywał to, co mogą pozostać jak ramki i komórki tabeli, tj. Wysokość = „*”. IIRC to nie istnieje.
Niestety, o ile mi wiadomo, nie ma sposobu na skuteczne mieszanie / obliczanie / odejmowanie jednostek bezwzględnych i względnych, więc myślę, że sprowadzasz się do dwóch opcji:
Absolutnie umieść div, który wyjmie go z kontenera, aby sam iframe zużył wysokość kontenera. To jednak pozostawia wiele innych problemów, ale być może dla tego, co robisz, krycie lub wyrównanie byłoby w porządku.
Alternatywnie musisz określić% div dla div i tak bardzo zmniejszyć wysokość ramki iframe. Jeśli bezwzględna wysokość jest naprawdę tak ważna, musisz zastosować ją do elementu podrzędnego div.
źródło
Po pewnym czasie wypróbowania trasy css, skończyło się na napisaniu w jQuery czegoś dość podstawowego, co spełniło moje zadanie:
Testowane w IE8, Chrome, Firefox 3.6
źródło
Będzie działać z poniższym kodem
źródło
Podobna odpowiedź @MichAdel, ale używam JQuery i bardziej elegancko.
iframe_id
jest identyfikatorem tagu iframeźródło
Możesz to zrobić, mierząc rozmiar ciała podczas zdarzeń obciążenia / zmiany rozmiaru i ustawiając wysokość na (pełna wysokość - wysokość banera).
Zauważ, że obecnie w IE8 Beta2 nie możesz tego zrobić, ponieważ to zdarzenie jest obecnie uszkodzone w IE8 Beta2.
źródło
lub możesz przejść do starej szkoły i użyć zestawu ramek :
źródło
Chociaż zgadzam się, że JS wydaje się lepszą opcją, mam nieco działające rozwiązanie CSS. Wadą tego jest to, że jeśli często dodajesz zawartość do dokumentu HTML iframe, musisz dostosować jeden procent czasu minimalnego.
Rozwiązanie:
Staraj się nie podawać żadnej ZARÓWNO dokumentów HTML,
następnie zakoduj tylko to:
Uwaga: div powinien być twoją główną sekcją.
To powinno względnie działać. iframe dokładnie oblicza 300% widocznej wysokości okna. Jeśli zawartość HTML z 2. dokumentu (w ramce iframe) ma mniejszą wysokość niż 3-krotność wysokości przeglądarki, działa. Jeśli nie musisz często dodawać treści do tego dokumentu, jest to trwałe rozwiązanie i możesz po prostu znaleźć swój własny procent potrzebny w zależności od wysokości treści.
Działa to, ponieważ zapobiega dziedziczeniu przez drugi dokument HTML (ten osadzony) wysokości nadrzędnego dokumentu HTML. Zapobiega temu, ponieważ nie określiliśmy wysokości dla obu z nich. Kiedy dajemy% dziecku, szuka ono swojego rodzica, jeśli nie, to przyjmuje wysokość treści. I tylko jeśli inne pojemniki nie mają wysokości, z tego, co próbowałem.
źródło
Atrybut „ bezproblemowy ” to nowy standard mający na celu rozwiązanie tego problemu:
http://www.w3schools.com/tags/att_iframe_seamless.asp
Przypisując ten atrybut, usuwa on ramki i paski przewijania oraz dopasowuje rozmiar iframe do jego zawartości. chociaż jest obsługiwany tylko w Chrome i najnowszym Safari
więcej na ten temat tutaj: Bezproblemowy atrybut HTML5 iFrame
źródło
Proste rozwiązanie jQuery
Użyj tego w skrypcie na stronie iframed
źródło
nie możesz ustawić wysokości elementu iframe w%, ponieważ wysokość ciała rodzica nie jest równa 100%, więc ustaw wysokość rodzica jako 100%, a następnie zastosuj wysokość elementu iframe 100%
źródło
Jeśli masz dostęp do treści iframe, która zostanie załadowana, możesz powiedzieć jej rodzicowi, aby zmienił rozmiar, ilekroć zmieni rozmiar.
Jeśli na stronie znajduje się więcej niż jeden element iframe, może być konieczne użycie identyfikatora lub innych sprytnych metod w celu ulepszenia pliku .find („iframe”) w celu wybrania poprawnej.
źródło
Myślę, że najlepszym sposobem na osiągnięcie tego scenariusza jest użycie pozycji css. ustaw pozycję względem rodzica div i pozycję: absolutnie do iframe.
w przypadku innych kwestii wypełniania i marginesów css3 calc () jest teraz bardzo zaawansowany i w większości kompatybilny również ze wszystkimi przeglądarkami.
sprawdź calc ()
źródło
Dlaczego tego nie zrobić (z niewielką korektą wyściółki / marginesów)
źródło
-0
z+'px'
na końcu. Czy to działa na urządzeniach mobilnych?