Pracuję nad aplikacją internetową, w której chcę, aby zawartość wypełniała wysokość całego ekranu.
Strona ma nagłówek, który zawiera logo i informacje o koncie. Może to być dowolna wysokość. Chcę, aby div treści wypełnił resztę strony na dole.
Mam nagłówek div
i treść div
. W tej chwili używam tabeli do takiego układu:
CSS i HTML
#page {
height: 100%; width: 100%
}
#tdcontent {
height: 100%;
}
#content {
overflow: auto; /* or overflow: hidden; */
}
<table id="page">
<tr>
<td id="tdheader">
<div id="header">...</div>
</td>
</tr>
<tr>
<td id="tdcontent">
<div id="content">...</div>
</td>
</tr>
</table>
Pełna wysokość strony jest wypełniona i nie jest wymagane przewijanie.
Dla czegokolwiek w div treści, ustawienie top: 0;
umieści go bezpośrednio pod nagłówkiem. Czasami zawartość będzie prawdziwym stołem, którego wysokość będzie ustawiona na 100%. Włożenie do header
środka content
nie pozwoli na to.
Czy istnieje sposób na osiągnięcie tego samego efektu bez użycia table
?
Aktualizacja:
Elementy wewnątrz zawartości div
będą miały również ustawione wartości procentowe. Więc coś w 100% w środku div
wypełni go do dołu. Podobnie jak dwa elementy na 50%.
Aktualizacja 2:
Na przykład, jeśli nagłówek zajmuje 20% wysokości ekranu, tabela określona na 50% wewnątrz #content
zajmuje 40% powierzchni ekranu. Do tej pory zawijanie całej rzeczy w stół jest jedyną rzeczą, która działa.
źródło
display:table
i powiązanych właściwości, zobacz tę odpowiedź na bardzo podobne pytanie.Odpowiedzi:
Aktualizacja 2015: podejście flexbox
Istnieją dwie inne odpowiedzi krótko wspominające o flexboksie ; było to jednak ponad dwa lata temu i nie podają żadnych przykładów. Specyfikacja Flexboksu zdecydowanie się teraz ustabilizowała.
Wszystkie główne przeglądarki i IE11 + obsługują Flexbox. W przeglądarce IE 10 lub starszej można użyć podkładki FlexieJS.
Aby sprawdzić bieżące wsparcie, możesz także zobaczyć tutaj: http://caniuse.com/#feat=flexbox
Przykład roboczy
Dzięki Flexbox możesz łatwo przełączać się między dowolnymi wierszami lub kolumnami o stałych wymiarach, wymiarach wielkości treści lub wymiarach pozostałej przestrzeni. W moim przykładzie ustawiłem przyciąganie nagłówka do jego zawartości (zgodnie z pytaniem PO), dodałem stopkę, aby pokazać, jak dodać region o stałej wysokości, a następnie ustawić obszar zawartości, aby wypełnić pozostałą przestrzeń.
W powyższym CSS właściwość flex skraca właściwości flex-grow , flex-shrink i flex- base, aby ustalić elastyczność elementów flex. Mozilla ma dobre wprowadzenie do modelu elastycznych pudełek .
źródło
flex: 0 1 30px;
atrybutbox .row
jest nadpisany w każdym divie?overflow-y: auto
do.row.content
osiągnąć to, czego potrzebujesz jednak.Naprawdę nie ma solidnego sposobu na przeglądarkę w CSS. Zakładając, że twój układ ma złożoność, musisz użyć JavaScript, aby ustawić wysokość elementu. Istotą tego, co musisz zrobić, jest:
Po uzyskaniu tej wartości i ustawieniu wysokości elementu należy dołączyć procedury obsługi zdarzeń do okna zarówno onload, jak i onresize, aby można było uruchomić funkcję zmiany rozmiaru.
Ponadto, zakładając, że treść może być większa niż obszar wyświetlania, musisz ustawić przepełnienie-y, aby przewijać.
źródło
Oryginalny post został sprzed ponad 3 lat. Wydaje mi się, że wiele osób, które przychodzą do tego postu, jak ja, szuka rozwiązania w stylu aplikacji, powiedzmy, że naprawiono nagłówek, stopkę i treść o pełnej wysokości zajmującą resztę ekranu. Jeśli tak, ten post może pomóc, działa na IE7 + itp.
http://blog.stevensanderson.com/2011/10/05/full-height-app-layouts-a-css-trick-to-make-it-easier/
A oto kilka fragmentów tego postu:
źródło
display: table
do ciała, wydaje się, że przepełnia ciało. Więc robienieheight: 100%
tego nie daje właściwej wysokości..col
nie jest używane, prawda?Zamiast używać tabel w znacznikach, możesz użyć tabel CSS.
Narzut
(Odpowiedni) CSS
FIDDLE1 i FIDDLE2
Niektóre zalety tej metody to:
1) Mniej znaczników
2) Znaczniki są bardziej semantyczne niż tabele, ponieważ nie są to dane tabelaryczne.
3) Obsługa przeglądarek jest bardzo dobra : IE8 +, Wszystkie nowoczesne przeglądarki i urządzenia mobilne ( caniuse )
Dla kompletności, oto równoważne elementy HTML do właściwości css dla modelu tabeli CSS
źródło
html, body { height: 100%, width: 100% }
wydawało się kluczowe w moich testach.relative
pozycjonowanie natable-row
elemencie, więc przyjmuje wysokość ascendentu z pierwszej pozycji, który nie jest elementem tabeli.Podejście tylko CSS (jeśli wysokość jest znana / ustalona)
Jeśli chcesz, aby środkowy element rozciągał się na całej stronie w pionie, możesz użyć tego,
calc()
co zostało wprowadzone w CSS3.Zakładając, że mamy stałą wysokość
header
ifooter
elementy i chcemy, abysection
znacznik zajmował całą dostępną wysokość w pionie ...Próbny
Zakładany znacznik i twój CSS powinny być
Więc tutaj robię, sumując wysokość elementów i odejmując od
100%
używaniacalc()
funkcji.Tylko upewnij się, że używasz
height: 100%;
elementów nadrzędnych.źródło
Używany:
height: calc(100vh - 110px);
kod:
źródło
Proste rozwiązanie z wykorzystaniem Flexbox:
Próbka Codepen
Alternatywne rozwiązanie z div wyśrodkowanym w div treści
źródło
A może po prostu użyjesz tego,
vh
co oznaczaview height
w CSS ...Spójrz na fragment kodu, który dla ciebie utworzyłem, i uruchom go:
Zobacz także zdjęcie, które dla ciebie stworzyłem:
źródło
CSS3 Prosty sposób
wszystkie główne przeglądarki obecnie go obsługują, więc śmiało, jeśli nie musisz obsługiwać starych przeglądarek.
źródło
Można to zrobić wyłącznie za
CSS
pomocąvh
:i
HTML
Sprawdziłem to, to działa na wszystkich głównych przeglądarek:
Chrome
,IE
, iFireFox
źródło
vh
ivw
jednostki wcześniej. Więcej informacji: snook.ca/archives/html_and_css/vm-vh-unitsheight: 100%
on#content
spowodował, że jego wysokość była zgodna z wysokością, całkowicie#page
ignorując#tdcontent
wzrost. Przy dużej zawartości pasek przewijania wykracza poza dolną część strony.Żadne z opublikowanych rozwiązań nie działa, gdy potrzebny jest dolny div do przewijania, gdy zawartość jest zbyt wysoka. Oto rozwiązanie, które działa w takim przypadku:
Oryginalne źródło: Napełnianie pozostałej wysokości pojemnika podczas obsługi przelewu w CSS
Podgląd na żywo JSFiddle
źródło
body-content-wrapper
, a wydaje się, że wszystko działa dobrze bez podwójnego opakowania (bez żadnychtable-cell
s). Czy jest jakiś problem z robieniem tego w ten sposób?.body
wysokość kończy się na tej samej wysokości co ustawiona.container
. Pionowy pasek przewijania wciąż znajduje się we właściwym miejscu, ale.container
kończy się rozciąganiem większym niż chcemy. Gdy jest pełny ekran, dolna część.body
jest poza dolną częścią ekranu.Ja również szukałem odpowiedzi na to pytanie. Jeśli masz szczęście, że możesz celować w IE8 i nowsze wersje, możesz użyć
display:table
powiązanych wartości, aby uzyskać reguły renderowania tabel z elementami na poziomie bloku, w tym div.Jeśli masz więcej szczęścia, a użytkownicy korzystają z przeglądarek najwyższego poziomu (na przykład, jeśli jest to aplikacja intranetowa na komputerach, którymi kontrolujesz, tak jak w moim najnowszym projekcie), możesz użyć nowego układu elastycznego pudełka w CSS3!
źródło
To, co zadziałało dla mnie (z divem w innym divie i zakładam, że we wszystkich innych okolicznościach) to ustawienie dolnego wypełnienia na 100%. To znaczy, dodaj to do swojego css / stylesheet:
źródło
HTML 5
CSS
Powyższe rozwiązanie wykorzystuje jednostki rzutni i Flexbox , a zatem jest IE10 +, pod warunkiem, że używasz starej składni dla IE10.
Codepen do zabawy: link do codepen
Lub ten, dla tych, którzy potrzebują przewijania głównego kontenera w przypadku przepełnienia zawartości: link do codepen
źródło
Jest teraz mnóstwo odpowiedzi, ale znalazłem zastosowanie
height: 100vh;
do pracy z elementem div, który musi wypełnić całą dostępną przestrzeń pionową.W ten sposób nie muszę bawić się wyświetlaniem ani pozycjonowaniem. Przydało się to przy użyciu Bootstrap do stworzenia deski rozdzielczej, w której miałem pasek boczny i główny. Chciałem, aby główna rozciągnęła się i wypełniła całą pionową przestrzeń, aby móc zastosować kolor tła.
Obsługuje IE9 i nowsze: kliknij, aby zobaczyć łącze
źródło
We wszystkich rozsądnych przeglądarkach możesz umieścić div „nagłówka” przed treścią, jako rodzeństwo, i ten sam CSS będzie działał. Jednak IE7- nie interpretuje poprawnie wysokości, jeśli liczba zmiennoprzecinkowa wynosi w tym przypadku 100%, więc nagłówek musi być w treści, jak wyżej. Przepełnienie: auto spowoduje podwójne paski przewijania w IE (który zawsze ma widoczny pasek przewijania widocznego, ale wyłączony), ale bez niego zawartość zostanie przycięta, jeśli się przepełni.
źródło
div
... tj.top: 0;
Umieści coś pod nagłówkiem. Ponownie zmodyfikuję moje pytanie, ponieważ odpowiedziałeś doskonale i wciąż nie to, czego chcę! Po prostu ukryję przepełnienie, ponieważ zawartość musi się zmieścić.Jeśli możesz sobie poradzić z brakiem obsługi starych przeglądarek (tj. MSIE 9 lub starszych), możesz to zrobić za pomocą modułu elastycznego układu pól, który jest już W3C CR. Ten moduł pozwala również na inne fajne sztuczki, takie jak zmiana kolejności treści.
Niestety, MSIE 9 lub nowsze nie obsługują tego i musisz użyć prefiksu dostawcy dla właściwości CSS dla każdej przeglądarki innej niż Firefox. Mamy nadzieję, że wkrótce inni dostawcy również upuszczą prefiks.
Innym wyborem byłby układ siatki CSS, ale ma jeszcze mniejszą obsługę ze stabilnych wersji przeglądarek. W praktyce tylko MSIE 10 to obsługuje.
źródło
Zmagałem się z tym przez chwilę i skończyłem z następującymi:
Ponieważ łatwo jest ustawić zawartość DIV na tej samej wysokości co element nadrzędny, ale najwyraźniej trudno jest nadać jej wysokość nadrzędną minus wysokość nagłówka, postanowiłem ustawić zawartość div na pełną wysokość, ale umieść ją absolutnie w lewym górnym rogu, a następnie zdefiniuj wypełnienie na górze, która ma wysokość nagłówka. W ten sposób zawartość wyświetla się starannie pod nagłówkiem i wypełnia całą pozostałą przestrzeń:
źródło
Rozwiązanie CSS Grid
Wystarczy zdefiniować właściwość
body
withdisplay:grid
igrid-template-rows
usingauto
ifr
value.Kompletny przewodnik po Grids @ CSS-Tricks.com
źródło
Dlaczego nie tak po prostu?
Dajesz html i ciało (w tej kolejności) wysokość, a następnie po prostu nadajesz swoim elementom wysokość?
Pracuje dla mnie
źródło
W rzeczywistości można użyć
display: table
do podzielenia obszaru na dwa elementy (nagłówek i treść), w których wysokość nagłówka może się różnić, a zawartość wypełnia pozostałą przestrzeń. Działa to z całą stroną, a także wtedy, gdy obszar jest po prostu zawartością innego elementu ustawionego zposition
ustawionym narelative
,absolute
lubfixed
. Będzie działał, dopóki element nadrzędny ma niezerową wysokość.Zobacz to skrzypce, a także poniższy kod:
CSS:
HTML:
źródło
rozwiązał problem dla mnie. W moim przypadku zastosowałem to do wymaganego div
źródło
Vincent, odpowiem ponownie, używając twoich nowych wymagań. Ponieważ nie zależy Ci na tym, aby treść była ukryta, jeśli jest zbyt długa, nie musisz unosić nagłówka. Po prostu umieść przelew ukryty w tagach HTML i body i ustaw
#content
wysokość na 100%. Zawartość zawsze będzie dłuższa niż obszar wyświetlania o wysokość nagłówka, ale będzie ukryta i nie spowoduje wyświetlania pasków przewijania.źródło
table
bo to działa. Dzięki za aktualizację.Spróbuj tego
źródło
Znalazłem dość proste rozwiązanie, ponieważ dla mnie było to tylko zagadnienie projektowe. Chciałem, żeby reszta strony nie była biała poniżej czerwonej stopki. Więc ustawiłem kolor tła stron na czerwony. A zawartość tła ma kolor biały. Przy wysokości zawartości ustawionej na np. 20em lub 50% prawie pusta strona nie pozostawi całej strony czerwonej.
źródło
Miałem ten sam problem, ale nie mogłem rozwiązać problemu z powyższymi Flexboxami. Stworzyłem więc własny szablon, który obejmuje:
Użyłem Flexboksów, ale w prostszy sposób, używając tylko właściwości display: flex i flex-direction: row | column :
Używam kątowej i chcę, aby rozmiary moich komponentów były równe 100% ich elementu macierzystego.
Kluczem jest ustawienie wielkości (w procentach) dla wszystkich rodziców w celu ograniczenia ich wielkości. W poniższym przykładzie wysokość myapp ma 100% rzutni.
Główny składnik ma 90% rzutni, ponieważ nagłówek i stopka mają 5%.
Mój szablon opublikowałem tutaj: https://jsfiddle.net/abreneliere/mrjh6y2e/3
HTML:
źródło
Do aplikacji mobilnej używam tylko VH i VW
Demo - https://jsfiddle.net/u763ck92/
źródło
Oddając pomysł pana Alien ...
Wydaje się, że jest to czystsze rozwiązanie niż popularny flex box dla przeglądarek obsługujących CSS3.
Wystarczy użyć minimalnej wysokości (zamiast wysokości) za pomocą funkcji calc () do bloku zawartości.
Calc () zaczyna się od 100% i odejmuje wysokości nagłówków i stopek (należy dołączyć wartości wypełnienia)
Używanie „minimalnej wysokości” zamiast „wysokości” jest szczególnie przydatne, ponieważ może pracować z zawartością renderowaną w javascript i strukturami JS, takimi jak Angular2. W przeciwnym razie obliczenia nie przesuną stopki na dół strony, gdy treść renderowana w javascript będzie widoczna.
Oto prosty przykład nagłówka i stopki wykorzystujących wysokość 50 pikseli i wypełnienie 20 pikseli w obu przypadkach.
HTML:
Css:
Oczywiście matematykę można uprościć, ale masz pomysł ...
źródło
W Bootstrap:
Style CSS:
1) Wystarczy wypełnić wysokość pozostałego miejsca na ekranie:
2) wypełnij wysokość pozostałego miejsca na ekranie i wyrównaj zawartość do środka elementu nadrzędnego:
źródło
To moja własna minimalna wersja rozwiązania Pebbl. To trwało wiecznie, aby znaleźć sposób na uruchomienie go w IE11. (Przetestowano również w Chrome, Firefox, Edge i Safari).
źródło