Div osiąga 100% i rozszerza się, aby dopasować się do treści

172

Na mojej stronie mam element div z wysokością ustawioną na 100%. Wysokość ciała jest również ustawiona na 100%. Wewnętrzny div ma tło i to wszystko i różni się od tła ciała. Działa to w przypadku ustawiania wysokości div na 100% wysokości ekranu przeglądarki, ale problem polega na tym, że mam zawartość wewnątrz tego elementu div, który rozciąga się pionowo poza wysokość ekranu przeglądarki. Kiedy przewijam w dół, element div kończy się w miejscu, w którym trzeba było rozpocząć przewijanie strony, ale zawartość wykracza poza to. Jak sprawić, by element div zawsze sięgał do samego dołu, aby pasował do wewnętrznej zawartości?

Oto uproszczenie mojego CSS:

body {
    height:100%;
    background:red;
}

#some_div {
    height:100%;
    background:black;
}

Kiedy przewijam stronę, czerń się kończy, a treść spływa na czerwone tło. Wydaje się, że nie ma znaczenia, czy ustawię pozycję na #some_div na względną czy bezwzględną, problem występuje w obu przypadkach. Treść wewnątrz #some_div jest w większości pozycjonowana absolutnie i jest dynamicznie generowana z bazy danych, więc jej wysokość nie może być z góry znana.

Edycja: Oto zrzut ekranu problemu: problem div

Joey
źródło
Zadano to kilka tygodni temu. Zobaczę, czy znajdę to pytanie. Myślę, że skomentowałem to. edytuj
Wydaje
proszę o kod dla lepszego zrozumienia
sandeep
czy możesz
wysłać
23
Chcesz wszystkie moje tysiące linii kodu php, css i javascript? Opublikowałem część css, która była odpowiednia dla pytania ...
Joey
2
NECROPOST JEST GO: ustawiając właściwość przepełnienia zazwyczaj rozwiązuje problemy jak te w których zawartość wewnątrz div rozciąga obok niego ( overflow: hidden;, overflow: scroll;itp).
AlbertEngelB

Odpowiedzi:

308

Oto, co powinieneś zrobić w stylu CSS div

display: block;
overflow: auto;

I nie dotykaj height

João Pimentel Ferreira
źródło
4
Działało świetnie. Musiałem jednak dodać element height: 100%do html, bodyi element div kontenera, aby wypełniał wysokość, gdy nie było wystarczającej ilości treści.
Nico Huysamen
niesamowite rozwiązanie, ale tak naprawdę można dotknąć wysokości, jeśli celem jest coś w rodzaju responsywnej okucia okiennego
Alexis Rabago Carvajal.
Czy jest to display: block;potrzebne? Elementy DIV są już elementami blokowymi.
Max Heiber
dodaje dla mnie wewnętrzny pasek przewijania (zarówno poziomy, jak i pionowy)
Nathan H
Jeśli nadal otrzymujesz element nadrzędny nieco wyższy niż elementy podrzędne, sprawdź, czy nie ma dodatkowych spacji i / lub  usuń je. Spróbuj także wyregulować wysokość linii. Na przykład wstawiłem line-height: 0, ponieważ nie potrzebowałem tekstu, tylko po to, aby pokazać obraz.
Zorgatone
57

Ustawić heightsię autoi min-heightdo 100%. To powinno rozwiązać problem w przypadku większości przeglądarek.

body {
  position: relative;
  height: auto;
  min-height: 100% !important;
}
Matthew Sprankle
źródło
3
IMO, to odpowiada na pytanie „Jak sprawić, by element div zawsze sięgał do samego dołu, aby pasował do wewnętrznej zawartości?” lepsza niż aktualnie zaznaczona odpowiedź, która po prostu włącza przewijanie przez przepełnienie, zamiast zapewniać rozszerzanie elementu div / body, aby dopasować się do jego zawartości. +1
Jammerz858
Pracował dla mojej sprawy. Dzięki!
Tyson Nero
Warto zauważyć, że z jakiegoś powodu nie działa, jeśli heightjest 100%i min-heightjest auto- spodziewałbym się, że w tym przypadku będą one wymienne, ale wygląda na to, że tak nie jest.
PeaBrain
13

Zwykle ten problem pojawia się, gdy elementy potomne elementu nadrzędnego Div są unoszone. Oto najnowsze rozwiązanie problemu:

W swoim pliku CSS napisz następującą klasę o nazwie .clearfix wraz z pseudo selektorem : after

.clearfix:after {
content: "";
display: table;
clear: both;
}

Następnie w kodzie HTML dodaj klasę .clearfix do nadrzędnego elementu Div. Na przykład:

<div class="clearfix">
    <div></div>
    <div></div>
</div>

Powinno działać zawsze. Możesz nazwać nazwę klasy jako .group zamiast .clearfix , ponieważ uczyni to kod bardziej semantycznym. Zwróć uwagę, że nie jest konieczne dodawanie kropki ani nawet spacji w wartości Treści między podwójnym cudzysłowem „”. Ponadto przepełnienie: auto; może rozwiązać problem, ale powoduje inne problemy, takie jak wyświetlanie paska przewijania, i nie jest zalecane.

Źródło: Blog Lisy Catalano i Chrisa Coyiera

Ifti Mahmud
źródło
8

Jeśli po prostu zostawić height: 100%i używać zajmie tyle miejsca co zawartość wewnątrz . W ten sposób cały tekst pozostanie na czarnym tle.display:block;divdiv

RonnieVDPoel
źródło
Gdzie użyłeś display: block? Nie widzę tego w twoim pytaniu.
Wyścigi lekkości na orbicie
Dodałem go do #some_div po tym, jak Ronnie to zasugerował, ale to nie rozwiązało problemu.
Joey
1
Czy mógłbyś spróbować dodać float: none; do tego samego #some_div css
RonnieVDPoel
Zamiast float: none;używać clear:both;. Robi to samo, ale działa bardziej na różne przeglądarki, @RonnieVDPoel
Cannicide
6

To pytanie może być stare, ale zasługuje na aktualizację. Oto inny sposób, aby to zrobić:

#yourdiv {
    display: flex;
    width:100%;
    height:100%;
}
user9459537
źródło
1
Jeśli zamierzasz pisać na stare pytanie, zalecamy użycie aktualnych wartości (AKA bez prefiksów na fleksie).
jhpratt
Przepraszam, nie wiem, o czym mówisz.
user9459537
1
Przedrostki Flex nie były już potrzebne od dłuższego czasu.
jhpratt
A które to są?
user9459537
5

Spróbuj tego:

body { 
    min-height:100%; 
    background:red; 
} 

#some_div {
    min-height:100%; 
    background:black; 
} 

IE6 i wcześniejsze wersje nie obsługują właściwości min-height.

Myślę, że problem polega na tym, że kiedy powiesz korpusowi, że ma wysokość 100%, jego tło może być tak wysokie, jak wysokość jednego „okna roboczego” przeglądarki (obszar wyświetlania, który wyklucza paski narzędzi przeglądarki, paski stanu i paski menu oraz krawędzie okien). Jeśli zawartość jest wyższa niż jeden obszar roboczy, przekroczy wysokość przeznaczoną dla tła.

Ta właściwość minimalnej wysokości w treści powinna WYMUSZAĆ, aby tło było co najmniej tak wysokie jak jeden widoczny obszar, jeśli treść nie wypełnia całej strony w dół, ale powinna również pozwolić jej rosnąć w dół, aby objąć więcej treści wewnętrznych.

Ace Frahm
źródło
3

Stare pytanie, ale w moim przypadku znalazłem position:fixedrozwiązanie za pomocą rozwiązania. Moja sytuacja mogła być jednak trochę inna. Miałem nakładkę półprzezroczystą divz animacją ładowania, której potrzebowałem, aby była wyświetlana podczas ładowania strony. Tak więc użycie height:auto / 100%lub min-height: 100%obu wypełniło okno, ale nie obszar poza ekranem. Użycie position:fixedspowodowało, że nakładka przewijała się wraz z użytkownikiem, więc zawsze obejmowała widoczny obszar i utrzymywała moją animację wstępnego ładowania na środku ekranu.

Thomas Smart
źródło
1

Po prostu dodaj te dwie linie do swojego identyfikatora css #some_div

display: block;
overflow: auto;

Po tym otrzymasz to, czego szukasz!

singhviku
źródło
0

Nie jestem do końca pewien, czy zrozumiałem pytanie, ponieważ jest to dość prosta odpowiedź, ale proszę bardzo ... :)

Czy próbowałeś ustawić właściwość przepełnienia kontenera na visible lub auto?

#some_div {
    height:100%;
    background:black; 
    overflow: visible;
    }

Dodanie tego powinno wypchnąć czarny kontener do dowolnego rozmiaru wymaganego przez kontener dynamiczny. Wolę widoczne niż automatyczne, ponieważ wydaje się, że auto ma paski przewijania ...

jlisham
źródło
0

Nowoczesne przeglądarki obsługują jednostkę „wysokość okienka ekranu”. Spowoduje to rozszerzenie elementu div do dostępnej wysokości rzutni. Uważam, że jest to bardziej niezawodne niż jakiekolwiek inne podejście.

#some_div {
    height: 100vh;
    background: black;
}
devdrc
źródło
0

Nawet ty możesz to zrobić

display:block;
overflow:auto;
height: 100%;

Obejmuje to każdy dynamiczny element div zgodnie z zawartością. Załóżmy, że jeśli masz wspólny element div z klasą, zwiększy on wysokość każdego dynamicznego elementu div zgodnie z zawartością

ahmed sharief
źródło
0

Możesz także użyć

 display: inline-block;

mój pracował z tym

Parthan_akon
źródło
0

NAKŁADKA BEZ POZYCJI: NAPRAWIONA

Naprawdę fajnym sposobem, w jaki to wymyśliłem dla ostatniego menu, było ustawienie ciała na:

position: relative

i ustaw klasę opakowania w ten sposób:

#overlaywrapper {
    position: absolute;
    top: 0;
    width: 100%;
    height: 100%;
    background: #00000080;
    z-index: 100;
}

Oznacza to, że nie musisz ustawiać stałej pozycji i nadal możesz pozwolić na przewijanie. Użyłem tego do nakładania menu, które są NAPRAWDĘ duże.

Benjamin Vaughan
źródło
0

użyj flex

.parent{
    display: flex
}

.fit-parent{
    display: flex;
    flex-grow: 1
}
Nagibaba
źródło
0

Ok, próbowałem czegoś takiego:

ciało (normalne)

#MainDiv { 
  /* where all the content goes */
  display: table;
  overflow-y: auto;
}

To nie jest dokładny sposób, aby to zapisać, ale jeśli wyświetlisz główny div jako tabelę, rozszerza się, a następnie zaimplementowałem paski przewijania.

Alex
źródło