Kayan alt DIV yüksekliğini ebeveynin yüksekliğine genişlet


451

Sayfa yapısı olarak var:

<div class="parent">
    <div class="child-left floatLeft">
    </div>

    <div class="child-right floatLeft">
    </div>
</div>

Şimdi, child-leftDIV daha fazla içeriğe sahip olacaktır, bu nedenle parentDIV'nin yüksekliği çocuk DIV'ye göre artar.

Fakat sorun şu ki, child-rightyükseklik artmıyor. Yüksekliğini ebeveyne eşit hale nasıl getirebilirim?


Yanıtlar:


459

İçin parenteleman, aşağıdaki özellikleri ekleyin:

.parent {
    overflow: hidden;
    position: relative;
    width: 100%;
}

sonra .child-rightbunlar için:

.child-right {
    background:green;
    height: 100%;
    width: 50%;
    position: absolute;
    right: 0;
    top: 0;
}

Burada CSS örnekleri ile daha ayrıntılı sonuçlar ve eşit yükseklik sütunları hakkında daha fazla bilgiyi burada bulabilirsiniz .


14
CSS'niz tanımlanmamış davranışla sonuçlanır - ebeveynin yüksekliği çocuk boyuna bağlıdır, ancak çocuklar ebeveyn olarak tanımlanmış bir yüzde yüksekliğine sahiptir: bu geçersizdir ve büyük olasılıkla tarayıcılar arası bir şekilde çalışmaz.
Eamon Nerbonne

1
Her şeyi yüzdüğünüzü görmüyorum - bu, sağ sütun soldan daha uzun büyürse ölçeklendirilmemenin maliyeti olarak tanımlanır (aslında OP'nin sorusundaki durum böyle değildir).
Eamon Nerbonne

4
Evet, şunu eklemeniz gerekir: dolgu tabanı: 32768px; kenar boşluğu: -32768 piksel; Çocuklara.
Michael

3
Bu, sağ sütunun soldan daha az içeriğe sahip olacağı garanti edildiği sürece çalışır, aksi takdirde kırpılır. Ayrıca işe yaramaz beyanları atlamak için cevabı düzenledim.
Christoph

3
@MatthewBlackford: kenar boşluğunun çökmesini engellediği için bir "hack". Kenar boşluğunun çökmesini 1 piksel saydam kenarlık gibi başka yollarla engelleyebilirsiniz, ancak özünde, ancak burada önemli olan, kenar boşluğunun çökmesinden kaçınmanızdır. Varsayımlarınız hatalı olduğu zaman garip düzen hataları ve beklenmedik kırpma (veya üst üste binmiş içerik) neden olduğundan bu çözüm son çare olarak kullanmaz. Kısacası: gerçekten gerekmedikçe bunu yapmak istemezsiniz .
Eamon Nerbonne

206

Bu soruna ortak bir çözüm mutlak konumlandırma veya kırpılmış şamandıralar kullanır, ancak sütunlarınız sayı + boyutta değişirse kapsamlı ayarlama gerektirmeleri ve "ana" sütununuzun her zaman en uzun olduğundan emin olmanız gerekir. Bunun yerine, üç daha sağlam çözümden birini kullanmanızı öneririm:

  1. display: flex: bugüne kadar en basit ve en iyi çözüm ve çok esnek - ama IE9 ve üstü tarafından desteklenmiyor.
  2. tableveya display: table: çok basit, çok uyumlu (hemen hemen her tarayıcıda), oldukça esnek.
  3. display: inline-block; width:50% negatif bir kenar boşluğu kesmekle: oldukça basit, ancak sütun alt sınırları biraz zor.

1. display:flex

Bu gerçekten basittir ve daha karmaşık veya daha ayrıntılı düzenlere uyum sağlamak kolaydır - ancak flexbox yalnızca IE10 veya üstü tarafından desteklenir (diğer modern tarayıcılara ek olarak).

Örnek: http://output.jsbin.com/hetunujuma/1

İlgili HTML:

<div class="parent"><div>column 1</div><div>column 2</div></div>

İlgili css:

.parent { display: -ms-flex; display: -webkit-flex; display: flex; }
.parent>div { flex:1; }

Flexbox çok daha fazla seçeneği destekliyor, ancak yukarıdaki sütunların yeterli sayıda olması yeterlidir!

2. <table>veyadisplay: table

Bunu yapmanın basit ve son derece uyumlu bir yolu kullanmaktır table- Eski IE desteğine ihtiyacınız varsa ilk önce denemenizi tavsiye ederim . Sütunlarla uğraşıyorsunuz; divs + şamandıralar bunu yapmanın en iyi yolu değildir (sadece css sınırlamalarını kesmek için iç içe div'ların birden fazla seviyesinin basit bir tablo kullanmaktan daha "anlamsız" olduğu gerçeğinden bahsetmiyorum). tableElemanı kullanmak istemiyorsanız , css'idisplay: table (IE7 ve üstü tarafından desteklenmez) düşünün .

Örnek: http://jsfiddle.net/emn13/7FFp3/

İlgili html: (ancak<table>bunun yerinebir düzkullanmayıdüşünün)

<div class="parent"><div>column 1</div><div>column 2</div></div>

İlgili css:

.parent { display: table; }
.parent > div {display: table-cell; width:50%; }
/*omit width:50% for auto-scaled column widths*/

Bu yaklaşım overflow:hiddenşamandıralarla kullanmaktan çok daha sağlamdır . Hemen hemen istediğiniz sayıda sütun ekleyebilirsiniz; isterseniz otomatik ölçeklendirme yapabilirsiniz; ve eski tarayıcılarla uyumluluğu korursunuz. Şamandıra çözümünün aksine, önceden hangi sütunun en uzun olduğunu bilmenize gerek yoktur ; yükseklik iyi ölçeklendirir.

ÖPÜCÜK: özel olarak gerekmedikçe şamandıra kesmek kullanmayın. IE7 bir sorunsa, her gün bakımı zor, daha az esnek bir hile-CSS çözümü üzerinde semantik sütunları olan düz bir tablo seçerim.

Bu arada, düzeninizin duyarlı olması gerekiyorsa (örneğin, küçük cep telefonlarında sütun yok) @media, küçük ekran genişlikleri için düz blok düzenine geri dönmek için bir sorgu kullanabilirsiniz - bu, ister <table>başka bir display: tableöğe kullanın, ister işe yarar .

3. display:inline blocknegatif marj hack ile.

Başka bir alternatif kullanmaktır display:inline block.

Örnek: http://jsbin.com/ovuqes/2/edit

İlgili html: (divetiketlerarasında boşluk olmamasıönemlidir!)

<div class="parent"><div><div>column 1</div></div><div><div>column 2</div></div></div>

İlgili css:

.parent { 
    position: relative; width: 100%; white-space: nowrap; overflow: hidden; 
}

.parent>div { 
    display:inline-block; width:50%; white-space:normal; vertical-align:top; 
}

.parent>div>div {
    padding-bottom: 32768px; margin-bottom: -32768px; 
}

Bu biraz zor ve negatif kenar boşluğu, sütunların "gerçek" tabanının gizlendiği anlamına gelir. Bu da, bu sütunların altına göre hiçbir şey konumlandıramayacağınız anlamına gelir, çünkü bu kesilir overflow: hidden. Satır içi bloklara ek olarak, şamandıralarla benzer bir etki elde edebileceğinizi unutmayın.


TL; DR : IE9 ve daha eski sürümleri yoksayabilirseniz flexbox kullanın ; aksi takdirde bir (css) tablo deneyin. Bu seçeneklerin hiçbiri sizin için işe yaramazsa, negatif kenar boşluğu kesmek vardır, ancak bunlar geliştirme sırasında kaçırılması kolay garip ekran sorunlarına neden olabilir ve bilmeniz gereken düzen sınırlamaları vardır.


1
İyi olanı, ancak bu hücreler arasındaki kenar boşluklarını kullanamayacağınızı belirtmek gerekir (ve stil oluşturmalarını istiyorsanız dolgu yardımcı olmaz).
Wordpressor

3
border-spacing:10px;tablo öğesinde kenar boşluğu benzeri boşluklar tanıtacaktır. Alternatif olarak, fazladan boşluk istediğiniz yere fazladan (boş) sütunlar ekleyebilirsiniz. Ve ayrıca tablo hücrelerinin içine dolgu ekleyebilirsiniz; ancak dolgu arka plana dahil edilir, böylece istediğiniz şey olmayabilir. Ama haklısın, normal bir marj kadar esnek değil. Ve sütunlara göre hiçbir şey konumlandıramazsınız, bu sorun olabilir.
Eamon Nerbonne

1
Yani masasız bir düzen daha iyi mi, değil mi?
dinamik

3
Şunu söylemeliyim: Bu durumda basit bir tablonun fazlasıyla yeterli olduğunu kabul ediyorum. Sorun şu ki tablo ile her düzeni göz ardı etmek için ortak bir görüş var
dinamik

3
Tablodaki sorun, ekran daha küçük bir genişliğe (duyarlı tasarım) yeniden boyutlandırıldığında, tablo hücrelerinin bir diğerinin üstüne döşenmesi yerine ezilmesidir. Dolgu tabanlı ikinci yöntem: 32768 piksel; kenar boşluğu: -32768 piksel; oldukça şaşırtıcı ve neredeyse tam olarak ihtiyacım olanı yapıyor ... bunun için teşekkürler ... sınır alt olsa bir sorun ...
Serj Sagan

23

Ebeveyn için:

display: flex;

Çocuklar için:

align-items: stretch;

Bazı önekler eklemelisiniz, caniuse kontrol edin.


2
Tavsiye etmem. IE9 hala bir şey.

Cevabınız için teşekkür ederim; iyi çalışıyor! "Bazı önekler eklemelisin, caniuse kontrol et." bu çizgi ile ne demek istiyorsun? Yeni başlayanlar için biraz daha bilgi ekleyebilir misiniz?
Md Sifatul Islam

@MdSifatulIslam Buraya gidin: caniuse.com/#feat=flexbox Desteklemeniz gereken bazı tarayıcıların özellik önekine ihtiyacı olup olmadığını görebilirsiniz.
Aiphee

18

Birçok cevap buldum, ama muhtemelen benim için en iyi çözüm

.parent { 
  overflow: hidden; 
}
.parent .floatLeft {
  # your other styles
  float: left;
  margin-bottom: -99999px;
  padding-bottom: 99999px;
}

Diğer çözümleri buradan kontrol edebilirsiniz http://css-tricks.com/fluid-width-equal-height-columns/


Bunun neden çalıştığı hakkında hiçbir fikrim yok, ama sorunumu bir cazibe gibi çözüyor. Teşekkür ederim
birleştirin

Benim için de çalışıyor. Temiz bir yol olmasa da. Teşekkürler!
Mark Anthony Uy

18
cehennem gibi hileli. Bunu bir üretim uygulaması için önermiyorum
FedericoCapaldo

bu inanılmaz haha. Bunun gerçekten işe yarayacağını düşünmedim
Tom McDonough

11

Lütfen üst div öğesini daha overflow: hidden
sonra alt div öğelerinde doldurun , alt dolgu için büyük miktarda ayarlayabilirsiniz. örneğin,
padding-bottom: 5000px
sonra margin-bottom: -5000px
ve sonra tüm alt divler ebeveynin yüksekliği olacaktır.
Tabii bu üst div (eğer diğer div dışında) içerik koymaya çalışıyorsanız işe yaramaz

.parent{
    border: 1px solid black;
    overflow: hidden;
    height: auto;
}
.child{
    float: left;
    padding-bottom: 1500px;
    margin-bottom: -1500px;
}
.child1{
    background: red;
    padding-right: 10px;    
}
.child2{
    background: green;
    padding-left: 10px;
}
<div class="parent">
    <div class="child1 child">
        One line text in child1
    </div>
    <div class="child2 child">
        Three line text in child2<br />
        Three line text in child2<br />
        Three line text in child2
    </div>
</div>

Örnek: http://jsfiddle.net/Tareqdhk/DAFEC/


biraz kirli görünüyor, ama benim için çalıştı - bu soruya tek çözüm. Bunu twitter bootstrap kullanarak denedim.
cukabeka

8

Ebeveynin yüksekliği var mı? Ebeveynlerin yüksekliğini böyle ayarlarsanız.

div.parent { height: 300px };

Sonra çocuğu bu şekilde tam yüksekliğe kadar uzatabilirsiniz.

div.child-right { height: 100% };

DÜZENLE

JavaScript kullanarak bunu nasıl yapacağınız aşağıda açıklanmıştır.


ebeveynin sabit bir yüksekliği yoktur. Çocuk-sol yüksekliğine göre genişliyor.
Veera

Ah, düşündüm, o zaman biraz JavaScript'e ihtiyacınız olacak, bir saniye içinde ekleyeceğim.
Olical

@Olical JSFiddle bağlantısı bozuk. Ya kaldırın ya da cevabı güncelleyin. Teşekkürler!
itsmysterybox

1
Js

5

CSS masa ekranı bunun için idealdir:

.parent {
  display: table;
  width: 100%;
}
.parent > div {
  display: table-cell;
}
.child-left {
  background: powderblue;
}
.child-right {
  background: papayawhip;
}
<div class="parent">
  <div class="child-left">Short</div>
  <div class="child-right">Tall<br>Tall</div>
</div>

Orijinal cevap (herhangi bir sütunun daha uzun olabileceği varsayılmıştır):

Ebeveynin boyunu çocukların boyuna ve çocukların boyunu ebeveynin boyuna bağlı yapmaya çalışıyorsunuz. Hesaplamayacak. CSS Sahte sütunlar en iyi çözümdür. Bunu yapmanın birden fazla yolu var. JavaScript kullanmayı tercih etmem.


İyi bir nokta. Çocukların boyunun, ebeveyne değil, en yüksek kardeşin yüksekliğine bağlı olup olmadığına (ebeveynin yüksekliğine göre belirlenip belirlenmediğine) ne dersiniz? Sanırım bu CSS'de yapılamaz.
mikato

Hayır, kardeşler birbirlerinin yüksekliğini etkileyemez. Ancak, display: table+ display: table-celldüzeni istenen sonucu verecektir.
Salman A

Harika güncelleme! Ancak, bunu denedim ve divs / hücreler arasında boşluk ayırmak istedim ve bunu gerçekleştirmek için tablo-hücre divs içinde iç div yapmak zorunda kaldı ve daha sonra elbette tam yüksekliğini kullanma yeteneği kaybetti çünkü iç div'ler tablo hücresi div'lar değildi - aynı problem. Bunun için bir fikrin var mı? Şimdi bir çeşit hücre boşluğu eksik.
mikato

Ah, CSS'de sınır aralığı var! stackoverflow.com/questions/339923/… Tablo benzeri divlerimin kenar boşluğu kullanarak boşluk ayırma ile iyi çalışmasını sağlayabildim. Şimdi tablo hücreleri (renkli arka plan blokları) tablo hücresi div akıllı kullanımı ile değil, ebeveynin tam yüksekliğini kullanmak için yeteneği var.
mikato

Sadece karşılaştığım bir gotcha: bunu aşağıdakilerle kullanamazsınız float: stackoverflow.com/questions/20110217/…
Joshua Pinter

4

Son zamanlarda jQuery kullanarak web sitemde yaptım. Kod, en yüksek div'in yüksekliğini hesaplar ve diğer div'leri aynı yüksekliğe ayarlar. İşte teknik:

http://www.broken-links.com/2009/01/20/very-quick-equal-height-columns-in-jquery/

Çalışacağına inanmıyorum height:100%, bu yüzden açık bir şekilde div yüksekliklerini bilmiyorsanız, saf bir CSS çözümü olduğunu düşünmüyorum.


1
Bunu en azından hazır, yeniden boyutlandırma, yön değiştirme, yazı tipi yeniden boyutlandırma üzerinde tetiklemelisiniz.
netAction

4

Bunu bir yorum bölümü için kullandım:

.parent {
    display: flex;
    float: left;
    border-top:2px solid black;
    width:635px;
    margin:10px 0px 0px 0px;
    padding:0px 20px 0px 20px;
    background-color: rgba(255,255,255,0.5);
}
    
.child-left {
	align-items: stretch;
	float: left;
	width:135px;
	padding:10px 10px 10px 0px;
	height:inherit;
	border-right:2px solid black;
}

.child-right {
	align-items: stretch;
	float: left;
	width:468px;
	padding:10px;
}
<div class="parent">
  <div class="child-left">Short</div>
  <div class="child-right">Tall<br>Tall</div>
</div>

Çocuk hakkını sağa kaydırabilirsiniz, ancak bu durumda her div'in genişliğini tam olarak hesapladım.


1
aklıma gelen ilk şey yükseklikti: neden kimsenin neden oy kullanmadığından emin değil mi
Andreas

3

Bootstrap'in farkındaysanız, 'flex' özelliğini kullanarak kolayca yapabilirsiniz.Tek yapmanız gereken css özelliklerinin altında ana div'e geçmek

.homepageSection {
  overflow: hidden;
  height: auto;
  display: flex;
  flex-flow: row;
}

.homepageSectionana div nerede . Şimdi HTML'nize child div ekleyin

<div class="abc col-md-6">
<div class="abc col-md-6">

abc benim çocuğum div. sınırdan bağımsız olarak her iki div'de yükseklik eşitliğini sadece çocuk div'a sınır vererek kontrol edebilirsiniz.


0
<div class="parent" style="height:500px;">
<div class="child-left floatLeft" style="height:100%">
</div>

<div class="child-right floatLeft" style="height:100%">
</div>
</div>

Sadece fikir vermek için satır içi stili kullandım.


-2

Bu düzgün hileyi bir staj röportajında ​​öğrendim. Orijinal soru, üç sütundaki her bir üst bileşenin yüksekliğinin, kullanılabilir tüm içeriği gösteren aynı yüksekliğe sahip olmasını nasıl sağladığınızdır. Temel olarak görünmeyen ve mümkün olan maksimum yüksekliği sağlayan bir alt bileşen oluşturun.

<div class="parent">
    <div class="assert-height invisible">
        <!-- content -->
    </div>
    <div class="shown">
        <!-- content -->
    </div>
</div>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.