Rozwijanie elementu nadrzędnego <div> do wysokości jego elementów podrzędnych


308

Mam strukturę strony podobną do tej:

<body>
  <div id="parent">
    <div id="childRightCol">
      /*Content*/
    </div>
    <div id="childLeftCol">
      /*Content*/
    </div>
  </div>
</body>

Ja jak dla związku macierzystego divrozwijać się w heightkiedy wewnętrzna div„S heightwzrasta.

Edycja:
Jednym z problemów jest to, że jeśli widthzawartość potomna rozszerza się poza widthokno przeglądarki, mój obecny CSS umieszcza poziomy pasek przewijania nadrzędny div. Chciałbym, aby pasek przewijania znajdował się na poziomie strony. Obecnie mój div div jest ustawiony naoverflow: auto;

Czy możesz mi w tym pomóc CSS?


6
Czy unosisz wewnętrzne divy? Czy możesz opublikować obecny CSS?
Eric

2
@Eric - to też był mój problem - moje divy dziecka miały pływak: w lewo, kiedy go usunąłem, „rodzic” został automatycznie rozpoznany i rozciągnięty na pełną wysokość!
Michael Goltsman

Odpowiedzi:


539

Spróbuj tego dla rodzica, to zadziałało dla mnie.

overflow:auto; 

AKTUALIZACJA:

Jeszcze jedno rozwiązanie, które zadziałało:

Rodzic :

display: table;

Dziecko :

display: table-row;

67
overflow:autooznacza, że ​​przeglądarka powinna zdecydować, którą wartość zastosować. Czym tak naprawdę jest ta sztuczka overflow: overlay.
Alba Mendez,

14
@jmendeth Wartość przepełnienia zwana „nakładką” nie istnieje. To, co działa, jeśli divy potomne są zmienne, to deklarowanie overflow:hidden.
Christoph

16
Waaaait. Zrelaksować się. Jedną rzeczą jest twierdzenie, że overlaynie jest obsługiwane poza Webkit. Innym całkowicie innym jest stwierdzenie, że wcale nie istnieje. Proszę najpierw RTFM . ;)
Alba Mendez,

6
Jeśli jest tylko na Webkit, to istnieje tylko 20%: P Pozdrawiam, nigdy nie widziałem tej strony. Czy jest dobrze utrzymany i aktualizowany? Czy przysięgasz na to?
pilau

20
Alternatywną odpowiedzią jest stackoverflow.com/questions/450903/... i proponuje ustawienie display:inline-block. Który działał dla mnie świetnie.
Jens

26

dodaj clear:both. zakładając, że kolumny są zmiennoprzecinkowe. W zależności od tego, jak określony jest wzrost, rodzic może wymagać przelewu: auto;

<body>
<div id="parent">
    <div id="childRightCol">
    <div>
    <div id="childLeftCol">
    <div>
    <div id="clear" style="clear:both;"></div>
</div>
</body>

Dzięki temu uzyskuję poziomy pasek przewijania na rodzicielskim div, gdy zawartość jest szersza niż okno przeglądarki. Chciałbym, aby przewijanie w poziomie znajdowało się na całej stronie.
Steve Horn

1
Dlaczego potrzebujesz przelewu: auto ;? W moim teście jasne: oba; wystarczyło.
Paolo Bergantino,

3
Zakłada się również, że rodzic nie ma określonej wysokości.
bendewey,

To podejście działa dobrze w przeglądarce Firefox, ale nie działa w przeglądarce IE 6. Jakieś obejścia?
Steve Horn,



4

Dla tych, którzy nie mogą zrozumieć tego w instrukcjach z tej odpowiedzi tam:

Spróbuj ustawić wartość dopełniania większą niż 0 , jeśli div div dziecka ma margines górny lub margines dolny, możesz zastąpić go dopełnieniem

Na przykład jeśli masz

#childRightCol
{
    margin-top: 30px;
}
#childLeftCol
{
    margin-bottom: 20px;
}

lepiej będzie zastąpić go:

#parent
{
    padding: 30px 0px 20px 0px;
}

4

Korzystanie coś takiego automatycznego czyszczenia divjest idealny do sytuacji takiej jak ta . Następnie użyjesz klasy nadrzędnej ... jak:

<div id="parent" class="clearfix">

3

Dodaj

clear:both; 

Do css div rodzica lub dodaj div u dołu rodzica div, który wyczyści: oba;

To poprawna odpowiedź, ponieważ przepełnienie: auto; może działać w przypadku prostych układów internetowych, ale będzie bałaganować elementy, które zaczynają używać takich rzeczy, jak ujemny margines itp


2

Czy to robi co chcesz?

.childRightCol, .childLeftCol
{
    display: inline-block;
    width: 50%;
    margin: 0;
    padding: 0;
    vertical-align: top;
}


1

Zrobiłem, że div nadrzędny rozszerza się wokół zawartości div div, ponieważ div div jako pojedynczą kolumnę, która nie ma żadnego atrybutu pozycjonowania, takiego jak wartość bezwzględna.

Przykład:

#wrap {width:400px;padding:10px 200px 10px 200px;position:relative;margin:0px auto;}
#maincolumn {width:400px;}

Oparty na tym, że div kolumny głównej jest najgłębszym div div dziecka #wrap, określa głębokość div div #wrap, a wypełnienie 200 pikseli po obu stronach tworzy dwie duże puste kolumny, w których możesz umieścić absolutnie pozycjonowane divy, jak chcesz. Można nawet zmienić górną i dolną część wypełnienia, aby wstawić div nagłówka i div stopki, używając position: Absolut.


0

Musisz zastosować rozwiązanie clearfix na kontenerze nadrzędnym. Oto fajny artykuł wyjaśniający link do naprawy


0

Jeśli Twoje treści w #childRightCol i #childRightCol są ułożone w lewo lub w prawo, po prostu dodaj to do css:

#childRightCol:before { display: table; content: " "; }
#childRightCol:after { display: table; content: " "; clear: both; }
#childLeftCol:before { display: table; content: " "; }
#childLeftCol:after { display: table; content: " "; clear: both; }

0

Działa to zgodnie z opisem w specyfikacji - kilka odpowiedzi tutaj jest poprawnych i spójnych z następującymi:

Jeśli ma elementy potomne na poziomie bloku, wysokość to odległość między górną krawędzią skrajnego najwyższego pudełka potomnego na poziomie bloku, który nie ma zawiniętych marginesów, a dolną krawędzią najniższego pudełka potomnego na poziomie bloku który nie ma załamanych marginesów. Jeśli jednak element ma niezerowe górne dopełnienie i / lub górną ramkę lub jest elementem głównym, zawartość zaczyna się od górnej krawędzi marginesu najwyższego elementu potomnego. (Pierwszy przypadek wyraża fakt, że górne i dolne marginesy elementu zapadają się z marginesami najwyższych i najniższych dzieci, podczas gdy w drugim przypadku obecność wypełnienia / granicy zapobiega zapadaniu się górnych marginesów.) Podobnie, jeśli element ma niezerowe dolne wypełnienie i / lub dolną ramkę, a następnie zawartość kończy się na dolnej krawędzi marginesu najniższego elementu potomnego.

stąd: https://www.w3.org/TR/css3-box/#blockwidth


0

Poniższy kod działał dla mnie.

css

.parent{
    overflow: auto;
} 

HTML

<div class="parent">
    <div class="child1">
    </div>
    <div class="child2">
    </div>
    <div id="clear" style="clear:both;"></div>
</div>


0

Od czego zaczynamy

Oto niektóre podstawowe HTML i CSS. W naszym przykładzie mamy element nadrzędny z dwoma zmiennoprzecinkowymi elementami potomnymi.

/* The CSS you're starting with may look similar to this.
 * This doesn't solve our problem yet, but we'll get there shortly.
 */

.containing-div {
  background-color: #d2b48c;
  display: block;
  height: auto;
}

.floating-div {
  float: left;
  width: 50%;
}

.floating-div ul {
  display: inline-block;
  height: auto;
}
<!-- The HTML you're starting with might look similar to this -->
<div class="containing-div">
  <div class="floating-div">
    <ul>
      <li>List Item One</li>
      <li>List Item Two</li>
      <li>List Item Three</li>
      <li>List Item Four</li>
    </ul>
  </div>
  <div class="floating-div">
    <ul>
      <li>List Item Five</li>
      <li>List Item Six</li>
      <li>List Item Seven</li>
      <li>List Item Eight</li>
    </ul>
  </div>
</div>

Rozwiązanie nr 1: Przepełnienie: automatyczne

Rozwiązaniem, które działa we wszystkich nowoczesnych przeglądarkach i Internet Explorerze z powrotem do IE8, jest dodanie overflow: autodo elementu nadrzędnego. Działa to również w IE7 z dodanymi paskami przewijania.

/* Our Modified CSS.
 * This is one way we can solve our problem.
 */

.containing-div {
  background-color: #d2b48c;
  display: block;
  height: auto;
  overflow: auto;
  /*This is what we added!*/
}

.floating-div {
  float: left;
  width: 50%;
}

.floating-div ul {
  display: inline-block;
  height: auto;
}

Rozwiązanie nr 2: Float Parent Container

Innym rozwiązaniem, które działa we wszystkich nowoczesnych przeglądarkach i wraca do IE7, jest przeniesienie kontenera nadrzędnego.

Nie zawsze może to być praktyczne, ponieważ przeniesienie div rodzica może wpływać na inne części układu strony.

/* Modified CSS #2.
 * Floating parent div.
 */

.containing-div {
  background-color: #d2b48c;
  display: block;
  float: left;
  /*Added*/
  height: auto;
  width: 100%;
  /*Added*/
}

.floating-div {
  float: left;
  width: 50%;
}

.floating-div ul {
  display: inline-block;
  height: auto;
}

Metoda nr 3: Dodaj Dywan Oczyszczający Poniżej Elementów Pływających

/* 
 * CSS to Solution #3.
 */

.containing-div {
  background-color: #d2b48c;
  display: block;
  height: auto;
}

.floating-div {
  float: left;
  width: 50%;
}

.floating-div ul {
  display: inline-block;
  height: auto;
}


/*Added*/

.clear {
  clear: both;
}
<!-- Solution 3, Add a clearing div to bottom of parent element -->
<div class="containing-div">
  <div class="floating-div">
    <ul>
      <li>List Item One</li>
      <li>List Item Two</li>
      <li>List Item Three</li>
      <li>List Item Four</li>
    </ul>
  </div>
  <div class="floating-div">
    <ul>
      <li>List Item Five</li>
      <li>List Item Six</li>
      <li>List Item Seven</li>
      <li>List Item Eight</li>
    </ul>
  </div>
  <div class="clear"></div>
</div>

Metoda nr 4: Dodaj element Clearing Div do elementu nadrzędnego To rozwiązanie jest dość kuloodporne w przypadku starszych i nowszych przeglądarek.

/* 
 * CSS to Solution #4.
 */

.containing-div {
  background-color: #d2b48c;
  display: block;
  height: auto;
}

.floating-div {
  float: left;
  width: 50%;
}

.floating-div ul {
  display: inline-block;
  height: auto;
}


/*Added*/

.clearfix {
  clear: both;
}

.clearfix:after {
  clear: both;
  content: "";
  display: table;
}
<!-- Solution 4, make parent element self-clearing -->
<div class="containing-div clearfix">
  <div class="floating-div">
    <ul>
      <li>List Item One</li>
      <li>List Item Two</li>
      <li>List Item Three</li>
      <li>List Item Four</li>
    </ul>
  </div>
  <div class="floating-div">
    <ul>
      <li>List Item Five</li>
      <li>List Item Six</li>
      <li>List Item Seven</li>
      <li>List Item Eight</li>
    </ul>
  </div>
</div>

od https://www.lockedownseo.com/parent-div-100-height-child-floated-elements/


-1

Używam tego CSS do nadrzędnego i działa:

min-height:350px;
background:url(../images/inner/details_middle.gif) repeat-y 0 0 ;
padding:5px 10px;   
text-align:right;
overflow: hidden;
position: relative;
width: 100%;

2
Używasz minimalnej wysokości, więc się nie liczy;)
pilau,

-1

#parent{
  background-color:green;
  height:auto;
  width:300px;
  overflow:hidden;
}

#childRightCol{
  color:gray;
  background-color:yellow;
  margin:10px;
  padding:10px;
}
<div id="parent">
    <div id="childRightCol">
        <p>
          Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque vulputate sit amet neque ac consequat.
        </p>
    </div>
  </div>

jesteś zarządzany za pomocą overflow:hidden;właściwości w css

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.