Div (yükseklik) 'i kalan ebeveyn yüksekliğini işgal et


108

http://jsfiddle.net/S8g4E/

divİki çocuklu bir konteynerim var . İlk çocuğun belirli bir boyu vardır. İkinci çocuğu divbelirli bir yükseklik vermeden konteynerin "boş alanını" işgal etmesi için nasıl sağlayabilirim ?

Örnekte pembe div, beyaz boşluğu da kaplamalıdır.


Bu soruya benzer: div'in kalan yüksekliği kaplaması nasıl sağlanır?

Ama mutlak pozisyon vermek istemiyorum .


İkinci çocuğa% 100 boy vermeyi de denedim ama işe yaramıyor: jsfiddle.net/S8g4E/1
Alvaro

Yanıtlar:


156

#downÇocuğu kalan alanı dolduracak şekilde genişletmek, #containerelde etmek istediğiniz tarayıcı desteğine ve #uptanımlı bir yüksekliğe sahip olup olmadığına bağlı olarak çeşitli şekillerde gerçekleştirilebilir .

Örnekler

Kafes

CSS'nin griddüzeni, Flexbox modeli kadar basit olmasa da, başka bir seçenek daha sunar. Ancak, yalnızca kapsayıcı öğesinin stilini gerektirir:

.container { display: grid; grid-template-rows: 100px }

grid-template-rowsSabit bir 100 piksel yüksekliği olarak ilk satırı tanımlar ve sıralar otomatik olarak geri kalan boşluğun doldurulması için streç kalır.

IE11'in -ms-önekler gerektirdiğinden oldukça eminim , bu yüzden desteklemek istediğiniz tarayıcılardaki işlevselliği doğruladığınızdan emin olun.

Flexbox

CSS3'ün Esnek Kutu Yerleşimi Modülü ( flexbox) artık iyi desteklenmektedir ve uygulanması çok kolay olabilir. Esnek olduğu için, #upbelirli bir yüksekliğe sahip olmadığında bile çalışır .

#container { display: flex; flex-direction: column; }
#down { flex-grow: 1; }

Bazı flexbox özellikleri için IE10 & IE11 desteğinin hatalı olabileceğini ve IE9 veya altının hiç destek olmadığını unutmamak önemlidir.

Hesaplanan Yükseklik

Alvaro'nun cevabında belirttiği gibi bir başka kolay çözüm de CSS3calc işlevsel birimini kullanmaktır , ancak bu, ilk çocuğun boyunun bilinen bir değer olmasını gerektirir:

#up { height: 100px; }
#down { height: calc( 100% - 100px ); }

Tek önemli istisnalar <= IE8 veya Safari 5 (destek yok) ve IE9 (kısmi destek) olmakla birlikte oldukça yaygın bir şekilde desteklenmektedir. Diğer bazı sorunlar arasında dönüşüm veya kutu gölgesi ile birlikte calc kullanımı yer alır , bu nedenle sizi ilgilendiriyorsa birden çok tarayıcıda test ettiğinizden emin olun.

Diğer Alternatifler

Eski destek gerekiyorsa, eklemek olabilir height:100%;için #downbir uyarı ile, pembe div tam yüksekliğini yapacaktır. Kap için taşmaya neden olur, çünkü #uponu aşağı iter.

Bu nedenle, bunu overflow: hidden;düzeltmek için konteynere ekleyebilirsiniz .

Alternatif olarak, yüksekliği #upsabitse, kesinlikle kabın içinde konumlandırabilir ve bir dolgu tepesi ekleyebilirsiniz #down.

Ve yine bir başka seçenek, bir tablo ekranı kullanmak olacaktır:

#container { width: 300px; height: 300px; border: 1px solid red; display: table;}
#up { background: green; display: table-row; height: 0; }
#down { background: pink; display: table-row;}​

4
#Down'un # konteyner yüksekliğine - # yukarı yüksekliğe sahip olmasını istiyorum. Yani gizli taşma aradığım şey değil. Ve ayrıca mutlak pozisyon kullanmak istemiyorlar. Teşekkürler!
Alvaro

@Alvaro, tablo görüntülerini kullanarak başka bir seçenek ekledim. Buradaki dezavantaj uyumluluktur. PS position: relative;Pencereye değil, konteynere göre konumlandıran bir konteynerin içine tamamen yerleştirilmiş bir eleman . Yani, bu uygun bir seçenek olmalıdır.
kullanıcı

2
Masa sırası sizin için çalışıyor olmalı, kanıt için bu jsFiddle'a bakın . Pozisyon mutlak yöntemi, bu kemanla aynı sonuçları veremeyecektir, bu yüzden bunu listeden çıkarabiliriz (bu senaryoda # down ve #container aynı yüksekliğe sahip olacaktır).
kullanıcı

3
Çok soruyorsun @Alvaro. CSS bir betik dili değildir; şeyleri hesaplayamaz. Ya illüzyonlara ya da js'ye sıkışmışsınızdır.
Jezen Thomas

1
@Quantastical, yardımınız için teşekkürler, ancak son düzenlemenizde az önce gönderdiğim yanıtı kopyaladınız. Bazıları en azından bundan bahsetmek iyi olurdu.
Alvaro

24

Bu soruyu soralı neredeyse iki yıl oldu. Sahip olduğum bu sorunu çözen css calc () ile geldim ve birinin aynı sorunu yaşaması durumunda onu eklemenin güzel olacağını düşündüm. (Bu arada, mutlak konumu kullanmaya başladım).

http://jsfiddle.net/S8g4E/955/

İşte css

#up { height:80px;}
#down {
    height: calc(100% - 80px);//The upper div needs to have a fixed height, 80px in this case.
}

Ve bununla ilgili daha fazla bilgiyi burada bulabilirsiniz: http://css-tricks.com/a-couple-of-use-cases-for-calc/

Tarayıcı desteği: http://caniuse.com/#feat=calc


1
Ben de calcgeniş tarayıcı desteğinin o kadar önemli olmadığı CSS3'leri kullanıyorum (IE8 ve altı ve Safari 5 bunu desteklemiyor).
kullanıcı

3
Dinamik #upyükseklik ile benzer yapmanın bir yolu var mı?
Adam Waite

@AdamWaite, dinamik bir #up yüksekliği ile, diğer cevapta açıklanan taşma çözümünü kullanmak isteyeceksiniz.
kullanıcı

5

Cevabım yalnızca CSS kullanıyor ve overflow: hidden veya display: table-row kullanmıyor. İlk çocuğun gerçekten belirli bir boyda olmasını gerektirir, ancak sorunuzda sadece ikinci çocuğun boyunun belirtilmemesi gerektiğini belirtiyorsunuz, bu yüzden bunu kabul edilebilir bulmanız gerektiğine inanıyorum.

html

<div id="container">
    <div id="up">Text<br />Text<br />Text<br /></div>
    <div id="down">Text<br />Text<br />Text<br /></div>
</div>

css

#container { width: 300px; height: 300px; border:1px solid red;}
#up { background: green; height: 63px; float:left; width: 100% }
#down { background:pink; padding-top: 63px; height: 100%; box-sizing: border-box; }

http://jsfiddle.net/S8g4E/288/


3

Öz

Tamamen tatmin edici bir cevap bulamadım, bu yüzden kendim bulmak zorunda kaldım.

Gereksinimlerim:

  • eleman almalıdır tam olarak kalan alanı da zaman ya da içerik boyutu olan daha küçük ya da daha büyük daha kalan boşluk boyutu (ikinci durumda kaydırma çubuğu olmalıdır gösterilir );
  • çözüm, ebeveyn yüksekliği hesaplandığında ve belirtilmediğinde çalışmalıdır ;
  • calc()kalan eleman başka eleman boyutları hakkında hiçbir şey bilmemesi gerektiğinden kullanılmamalıdır ;
  • flexbox'lar gibi modern ve benzer yerleşim tekniği kullanılmalıdır.

Çözüm

  • Hesaplanan yüksekliği (varsa) ve yüksekliği belirtilen sonraki ebeveyne sahip tüm doğrudan üst öğeleri flexbox'lara dönüştürün ;
  • Belirtin flex-grow: 1için hesaplanan yükseklik (varsa) ile tüm doğrudan ebeveynler ve eleman eleman içerik boyutu küçük olduğunda hepsi kalan yer kaplar böylece;
  • Sabit yüksekliğe sahip tüm esnek öğeleri belirtin flex-shrink: 0, böylece öğe içeriği boyutu kalan alan boyutundan daha büyük olduğunda küçülmezler;
  • Belirtin overflow: hiddeniçin hesaplanan yüksekliği ile tüm doğrudan ebeveynler (varsa) devre dışı kaydırma ve taşma içerik gösteriyor korusun;
  • Belirtin overflow: autoiçin eleman içine kaydırma etkinleştirmek için.

JSFiddle (öğenin yüksekliği hesaplanmış doğrudan üst öğeleri vardır)

JSFiddle (basit durum: hesaplanmış yüksekliğe sahip doğrudan üst öğe yok)


2

demoyu kontrol edin - http://jsfiddle.net/S8g4E/6/

css kullan -

#container { width: 300px; height: 300px; border:1px solid red; display: table;}
#up { background: green; display: table-row; }
#down { background:pink; display: table-row;}

Sen eklemek gerekir height: 1pxiçin #upbu yüksekliğin en az miktarda alır emin olmak için. İşte için tarayıcı desteği var display: table: caniuse.com/css-table
thirtydot

Lütfen bana bu "daha karmaşık" örnekte bu çözüme nasıl ulaşılabileceğini gösterir misiniz? Jsfiddle.net/fyNX4 Çok teşekkür ederim
Alvaro

2

Ben yanlış anlama ediyorum sürece, sadece ekleyebilir height: 100%;ve overflow:hidden;için #down.

#down { 
    background:pink; 
    height:100%; 
    overflow:hidden;
}​

Canlı DEMO

Düzenle: Kullanmak istemediğinizden bu senaryo için overflow:hidden;kullanabilirsiniz display: table;; ancak IE 8'den önce desteklenmez. ( display: table;destek )

#container { 
    width: 300px; 
    height: 300px; 
    border:1px solid red;
    display:table;
}

#up { 
    background: green;
    display:table-row;
    height:0; 
}

#down { 
    background:pink;
    display:table-row;
}​

Canlı DEMO

Not: #downYüksekliğin #containeryükseklik eksi #upyükseklik olmasını istediğinizi söylediniz . display:table;Çözelti aynen yapar ve bu jsfiddle oldukça açıkça canlandırıyor.


1
# Down'un # konteyner yüksekliğini aşmasını istemiyorum
Alvaro

Ben sadece bunu fark ettim. overflow:hiddenEkstra içeriği gizlemek için ekleyebilirsin .
Josh Mein

1
MrSlayer'a söylediklerimi kopyalayıp yapıştıracağım: #down'un # konteyner yüksekliği - # yukarı yüksekliği olmasını istiyorum. Yani gizli taşma aradığım şey değil. Ve ayrıca mutlak pozisyon kullanmak istemiyorlar. Teşekkürler!
Alvaro

Bununla ilgili sorun, örneğinizdeki iki div'i geri döndürürseniz, yeşil div'in dışarıda olmasıdır.
Ced

Bu soruya hiç cevap vermiyor. "Kalan yüksekliğin tamamını işgal etmek için" belirtir, olay kalan tüm yüksekliği kaplasa da taşma olacaktır.
Giridhar Karnik

1

İçeriği aşağı itmek için kayan sayıları kullanabilirsiniz:

http://jsfiddle.net/S8g4E/5/

Sabit boyutlu bir kabınız var:

#container {
    width: 300px; height: 300px;
}

İçeriğin bir şamandıranın yanında akmasına izin verilir. Şamandırayı tam genişliğe ayarlamazsak:

#up {
    float: left;
    width: 100%;
}

İken #upve #downüst konumunu paylaşan, #down'nin içeriği sadece süzülüyor dibine sonra başlayabilir #up:

#down {
    height:100%;
}​

Not #upaslında üst kısmını kaplayan #down: jsfiddle.net/thirtydot/S8g4E/9
thirtydot

Evet, böyle çalışır. Ancak OP'nin yuvarlak bir sınıra veya başka bir hayal gücüne ihtiyacı yoksa #up, muhtemelen kabul edilebilir.
biziclop

Bu çözüm yakın, ancak ben # aşağıya # kap yüksekliğine - # yukarı yüksekliğe sahip olmasını istiyorum. (Çözümünüzde # aşağı yükseklik = # konteyner yüksekliği). Teşekkürler
Alvaro

1
@Alvaro: Neden böyle olması gerekiyor? Bu çözüm , yalnızca bir yanılsama olsa bile çoğu durumda doğru görünüyor .
otuzdot

Pekala, bu soru bu daha "karmaşık" örnekten basitleştirilmiş bir örnek: jsfiddle.net/fyNX4 İşe yaramaz, değil mi?
Alvaro

-3

Yanılsamalarla taklit etme konusunda rahat değilseniz, tamamen CSS ile yapılabileceğinden emin değilim. Belki Josh Mein yanıtını ve kümesi kullanmak #containeriçin overflow:hidden.

Değeri ne olursa olsun, işte bir jQuery çözümü:

var contH = $('#container').height(),
upH = $('#up').height();
$('#down').css('height' , contH - upH);

Teşekkürler Saf bir Css çözümü arıyordum.
Alvaro
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.