Min. Yükseklikte ebeveynin içindeki çocuk:% 100 miras almıyor


167

Div kapsayıcısını ayarlayarak bir sayfanın en az yüksekliğini kaplayacak şekilde yapmanın bir yolunu buldum min-height: 100%;. Ancak, iç içe bir div ekleyip ayarladığımda height: 100%;, kabın yüksekliğine uzanmaz. Bunu düzeltmenin bir yolu var mı?

html, body {
  height: 100%;
  margin: 0;
}

#containment {
  min-height: 100%;
  background: pink;
}

#containment-shadow-left {
  height: 100%;
  background: aqua;
}
<div id="containment">
  <div id="containment-shadow-left">
    Hello World!
  </div>
</div>


27
Modern gün çözümü: kabı vermek display:flexve flex-direction:columnve çocuk vermek flex:1.
jackocnr

3
@jackocnr Bir hata nedeniyle herhangi bir IE'de çalışmaz , Edge'de düzeltildi.
Etiketler

Yanıtlar:


146

Bu, bildirilen bir webkit (krom / safari) hatasıdır, en az yüksekliğe sahip ebeveynlerin çocukları height özelliğini devralamaz: https://bugs.webkit.org/show_bug.cgi?id=26559

Görünüşe göre Firefox da etkileniyor (şu anda IE'de test edilemiyor)

Olası geçici çözüm:

  • konum ekle: #containment'e göre
  • konum ekle: # çevreleme-gölge-sola mutlak

Hata, iç elemanın mutlak konumlandırmaya sahip olduğunu göstermez.

Bkz. Http://jsfiddle.net/xrebB/

10 Nisan 2014'te Düzenle

Şu anda gerçekten ana konteynırlara min-heightve konteynerin yüksekliğini miras alan alt öğelere ihtiyacım olan bir proje üzerinde çalıştığım için biraz daha araştırma yaptım.

Birincisi: Artık mevcut tarayıcı davranışının gerçekten bir hata olup olmadığından emin değilim. CSS2.1 özellikleri şunları söylüyor:

Yüzde, üretilen kutunun içerdiği bloğun yüksekliğine göre hesaplanır. Kapsayıcı bloğun yüksekliği açıkça belirtilmezse (yani içerik yüksekliğine bağlıdır) ve bu öğe tam olarak konumlandırılmazsa, değer 'otomatik' olarak hesaplanır.

Konteynırımın üzerine bir minimum yükseklik koyarsam , yüksekliğini açıkça belirtmiyorum - bu yüzden elemanım bir autoyükseklik almalı . Webkit ve diğer tüm tarayıcılar da aynen bunu yapıyor.

İkincisi, bulduğum geçici çözüm:

Konteyner öğemi onunla display:tablebirlikte ayarlarsam, height:inherittam olarak min-height% 100 veririm gibi davranır . Ve - daha da önemlisi - alt öğeyi buna ayarlarsam display:table-cell, konteyner öğesinin yüksekliğini mükemmel bir şekilde devralır -% 100 veya daha fazla olsun.

Tam CSS:

html, body {
  height: 100%;
  margin: 0;
}

#container {
  background: green;
  display: table;
  height: inherit;
  width: 100%;
}

#content {
  background: red;
  display: table-cell;
}

İşaretleme:

<div id="container">
  <div id="content">
      <p>content</p>
  </div>
</div>

Bkz. Http://jsfiddle.net/xrebB/54/ .


27
Dostum, bu hala sabit değil: S
Mārtiņš Briedis

Evet, değil - birkaç yama var, ancak Chrome 29'dan itibaren hala beklenen davranışı göstermiyor. Ancak, Firefox 23, IE 10, Safari 5 veya Opera 12'de de çalışmaz. En azından tüm tarayıcılar aynı fikirde ...
Paul d'Aoust

3
Min- / max-height'in açık olmadığı sonucuna varmak için specin garip bir okuması ... ve garip olarak yanlış demek istiyorum. Bütün paragrafı okumak, bağlamda, bu yorum yanlıştır. Bağlam içinde "içeren bloğun yüksekliği" neden height özelliğinden anlamsal olarak farklıdır. Bunun yerine, ifade " içeren bloğun height özelliği " ise, yorumunuz mantıklı olur (ve spesifikasyonda bir hata olur).
WraithKenny

1
2019. Bu hatanın 10 yıllık yıldönümünü kaçırdık. Esnek çözüm benim için çalıştı stackoverflow.com/questions/8468066/…
Ilya Chernov

6
Kilitlenme dönemindeyim
Kilitlenme David Callanan

174

height: 1pxÜst konteynere ekleyin . Chrome, FF, Safari'de çalışır.


8
% 100 ayarı yüksekliği ile elde edilemedi şey elde:% 100 OP istemeyiz Bunu yapmak etkili bir min-yükseklik geçersiz kılma ediyoruz, sorunu çözmezse
şekillendirici

16
@sticker eklenmesi height: 1px;min yüksekliğini geçersiz kılmaz. Tam tersi. Buradaki en iyi çözüm ... demo: jsbin.com/mosaboyo/1/edit
jjenzz

2
Niçin height: 1px;işe yaradığını görmek için buna bakın stackoverflow.com/questions/2341821/height100-vs-min-height100
Ben Alavi

31
@jjenzz Ben styler almak için çalışıyordu düşünüyorum, bu sorun, bu genişleme özelliği korumak değil olmasıdır min-height. Örneğin, yeterli metin varsa taşacaktır. Bkz. Jsbin.com/vuyapitizo/1
binaryfunt

3
Paul'ün aşağıdaki yorumundan alıntı: "Ancak kabın büyümesine izin vermiyor, bu da minimum yüksekliği kullanma amacını bozuyor." stackoverflow.com/questions/8468066/…
Leo Lei

103

Bunu hiçbir yerde görmediğim için paylaşacağımı düşündüm ve benim çözümümü düzeltmek için kullandım.

ÇÖZÜM :min-height: inherit;

Min yüksekliği belirtilen bir ebeveyni vardı ve bu boyda olması için bir çocuğa ihtiyacım vardı.

.parent {
  min-height: 300px;
  background-color: rgba(255,255,0,0.5); //yellow
}

.child {
  min-height: inherit;
  background-color: rgba(0,255,0,0.5); //blue
}

p {
  padding: 20px;
  color: red;
  font-family: sans-serif;
  font-weight: bold;
  text-align: center;
}
<div class="parent">
  <div class="child">
    <p>Yellow + Blue = Green :)</p>
  </div>
</div>

Bu şekilde çocuk min-boyunun% 100'ü kadar yükseklik görevi görür.

Umarım bazı insanlar bunu faydalı bulur :)


9
Kısmen çalışır, ancak çocuk yalnızca min-height. Ebeveynlerin boyu arttığında, çocuk genişlemez.
OguzGelal

1
Hayatımı kurtardın
casamia

6
Yalnızca minimum yükseklik yüzde değil, AFAICS olduğunda çalışır.
Benjamin

4
Ebeveynin vh değeri varsa da iyi çalışır! TEŞEKKÜRLER!
user1658080

1
Her durum için uygun değildir ancak bazen çok yardımcı olur. Teşekkürler!
Blackbam

15

Bu @jackocnr tarafından bir yorumda eklendi ama ben kaçırdım. Modern tarayıcılar için bunun en iyi yaklaşım olduğunu düşünüyorum.

Çok küçükse iç elemanın tüm kabı doldurmasını sağlar, ancak çok büyükse kabın yüksekliğini arttırır.

#containment {
  min-height: 100%;
  display: flex;
  flex-direction: column;
}

#containment-shadow-left {
  flex: 1;
}

1
flexbox geniş uyumlu olduğu için bu en iyisidir.
Jose Carlos Ramírez Vásquez

8

Kushagra gour çözümü (en azından Chrome ve IE) çalışır ve kullanmak zorunda kalmadan orijinal sorunu çözer display: table;ve display: table-cell;. Dalma makinesine bakın: http://plnkr.co/edit/ULEgY1FDCsk8yiRTfOWU

min-height: 100%; height: 1px;Dış div üzerinde ayarlama , gerçek yüksekliğinin gerektiği gibi en az% 100 olmasına neden olur. Ayrıca iç div'in yüksekliği doğru şekilde miras almasını sağlar.


23
Ancak, kabın büyümesine izin vermez, bu da minimum yüksekliği kullanma amacını yener.
Sal

Ebeveynin minimum yüksekliğini ve yüksekliğini de doldurmak için bir sargıya ihtiyacım vardı. Benim için işe yarayan, miras almak için minimum yüksekliği ve yüksekliği% 100'e ayarlamaktı.
Bay Duhart

6

Mevcut cevaplara ek olarak, vhkullanılacak görüş alanı birimleri de bulunmaktadır. Aşağıdaki basit snippet. Elbette calc(), örneğin min-height: calc(100vh - 200px);sayfa üstbilgisi ve altbilgisi 200pxbirlikte yüksekliğe sahip olduğunda da birlikte kullanılabilir.

body {
  margin: 0;
}

.child {
  min-height: 100vh;
  background: pink;
}
<div class="parent">
  <div class="child"></div>
</div>


3

Bunun tarayıcılarda bir hata olduğuna inanmıyorum. Hepsi aynı şekilde davranır - yani, açık yükseklikleri belirtmeyi bıraktığınızda, minimum yükseklik temelde bir "son adım" dır.

Görünüşe göre CSS 2.1 spesifikasyonunun önerdiği gibi: http://www.w3.org/TR/CSS2/visudet.html#the-height-property

Yüzde, üretilen kutunun içerdiği bloğun yüksekliğine göre hesaplanır. Kapsayıcı bloğun yüksekliği açıkça belirtilmezse (yani içerik yüksekliğine bağlıdır) ve bu öğe tam olarak konumlandırılmazsa, değer 'otomatik' olarak hesaplanır.

Bu nedenle, min-heightebeveynin açık bir özelliği olmadığı içinheight özellik ayarlanmadığından, varsayılan olarak otomatiktir.

display: table-cellHedeflenen kitlenizin tarayıcıları için bu mümkünse veya flexbox gibi daha yeni stiller kullanmanın bazı yolları vardır . Belirli durumlarda, kesinlikle konumlandırılmamış% 100 yükseklik sağlayan topve bottomkesinlikle konumlandırılmış bir iç elemandaki ve özelliklerini kullanarak bunu değiştirebilirsiniz.


3

display: flex;Burada önerilmiş olmasına rağmen , display: grid;şimdi yaygın olarak desteklendiğini kullanmayı düşünün . Varsayılan olarak, bir ızgaranın tek alt öğesi üst öğesini tamamen dolduracaktır.

html, body {
  height: 100%;
  margin: 0;
  padding: 0; /* Don't forget Safari */
}

#containment {
  display: grid;
  min-height: 100%;
  background: pink;
}

#containment-shadow-left {
  background: aqua;
}


2

Google çalışanları için:

Bu jquery-geçici çözümü #containment'in otomatik olarak bir yükseklik almasını sağlar (yükseklik: otomatik olarak), ardından gerçek yüksekliği piksel değeri olarak atar.

<script type="text/javascript">
<!--
    $(function () {

        // workaround for webkit-bug http://stackoverflow.com/a/8468131/348841

        var rz = function () {
            $('#containment')
            .css('height', 'auto')
            .css('height', $('#containment').height() + 'px');
        };

        $(window).resize(function () {
            rz();
        });

        rz();

    })
-->
</script>

Güzel bir çözüm, yüksekliği 'otomatik' olarak ayarlamadan, öğenin minimum yüksekliğini ayarlayabilirsiniz. Benim için çalıştı.
Salvatore Zappalà

2

Günümüzde bunu başarmanın en iyi yolu kullanmaktır display: flex;. Ancak IE11'i desteklemeye çalışırken bir sorunla karşılaşabilirsiniz. Göre https://caniuse.com flexbox'a kullanarak:

IE 11, minimum yükseklik kullanıldığında öğeleri dikey olarak doğru hizalamaz

Internet Explorer uyumlu çözüm

Çözüm display: table;ebeveynin ve display: table-row;çocuğun her ikisinin de height: 100%;yerine kullanılabilir.min-height: 100%; .

Çözümlerin çoğu burada kullanmak sıralanan display: table, table-rowve / veya table-cell, fakat onlar aynı davranışı çoğaltmak yok min-height: 100%;olan:

  • Ebeveynin hesaplanan yüksekliğini miras almak ( height mülkünü );
  • Ebeveynin yüksekliğini aşmasına izin verin min-height;

Bu çözümü kullanırken, davranış aynıdır ve min-heighthataya neden olan özelliğe gerek yoktur.

açıklama

Çalışmasının nedeni, çoğu öğeden farklı olarak, display: tablevetable-row her zaman içerikleri kadar uzun olacaktır. Bu, heightmallarının benzer şekilde davranmasını sağlar min-height.

Uygulamada çözüm

html, body {
  height: 100px;
  margin: 0;
}

#containment {
  display: table;
  height: 100%;
  background: pink;
  width: 100%;
}

#containment-shadow-left {
  display: table-row;
  height: 100%;
  background: aqua;
}

#content {
  padding: 15px;
}

#demo {
  display: none;
  background-color: red;
  height: 200px;
}

#demo-checkbox:checked ~ #demo {
  display: block;
}
<div id="containment">
  <div id="containment-shadow-left">
    <div id="content">
      <input id="demo-checkbox" type="checkbox">
      <label for="demo-checkbox">Click here for overflow demo</label>
      <div id="demo">This is taller than #containment</div>
    </div>
  </div>
</div>


1

Kolay olan ve sadece kolay olmayan bir CSS veya ekstra işaretleme / hacky çözümünden kaçınmak için kullanılabilecek başka bir JS çözümü.

function minHeight(elm, percent) {
  var windowHeight = isNaN(window.innerHeight) ? 
                     window.clientHeight : window.innerHeight;
  var height = windowHeight * percent / 100;
  elm.style.minHeight = height + 'px';
}

W / jQuery:

function minHeight($elm, percent) {
  var windowHeight = $(window).height();
  var height = windowHeight * percent / 100;
  $elm.css('min-height', height + 'px');
}

Açısal yönerge:

myModule.directive('minHeight', ['$window', function($window) {
  return {
    restrict: 'A',
    link: function(scope, elm, attrs) {
      var windowHeight = isNaN($window.innerHeight) ? 
               $window.clientHeight : $window.innerHeight;
      var height = windowHeight * attrs.minHeight / 100;
      elm.css('min-height', height + 'px');
    }
  };
}]);

Bu şekilde kullanılacak:

<div>
  <!-- height auto here -->
  <div min-height="100">
    <!-- This guy is at least 100% of window height but grows if needed -->
  </div>
</div>

Direktif çözümü için teşekkürler. Ben bunu kullanarak sona erdi ama pencere yüksekliği min olmasını istemiyordu; bunun yerine kodu bu şekilde değiştirdim, böylece üst min-yüksekliği devralmak istedim: var height = elm.parent () [0] .offsetHeight;
Sal

1

Bu genellikle benim için işe yarar:


.parent {
  min-height: 100px;
  background-color: green;
  display: flex;
}
.child {
  height: inherit;
  width: 100%;
  background-color: red;
}
<!DOCTYPE html>
<html>
  <body>
    <div class="parent">
      <div class="child">
      </div>
    </div>
  </body>
</html>

0

Sadece bu konuyu tamamlamak için, Sabit konum kullanarak burada keşfedilmemiş bir çözüm buldum .

Taşma Yok

html, body, .wrapper, .parent, .child {
  position: fixed;
  top: 0; 
  bottom: 0;
  left: 0;
  right: 0;
  margin: 0;
  padding: 0;
  height: 100%;
}

.child {
  overflow: auto;
  background: gray;
}

.height-50 {
  height: 50%;
  width: 5em;
  margin: 10px auto;
  background: cyan;
}
<div class="wrapper">
  <div class="parent">
    <div class="child">
      
      <div class="height-50"></div>
      
    </div>
  </div>
</div>

Taşma ile

html, body, .wrapper, .parent, .child {
  position: fixed;
  top: 0; 
  bottom: 0;
  left: 0;
  right: 0;
  margin: 0;
  padding: 0;
  height: 100%;
}

.child {
  overflow: auto;
  background: gray;
}

.height-150 {
  height: 150%;
  width: 5em;
  margin: 10px auto;
  background: cyan;
}
<div class="wrapper">
  <div class="parent">
    <div class="child">
      
      <div class="height-150"></div>
      
    </div>
  </div>
</div>


-2

Yüzdeye dayalı yükseklik ve ebeveynlerin çocuk boyuna göre hala büyürken bu benim için işe yarar. Firefox, Chrome ve Safari'de iyi çalışır.

.parent {
  position: relative;
  min-height: 100%;
}

.child {
  min-height: 100vh;
}
<div class="parent">
    <div class="child"></div>
  </div>


-3

bizim için denedikten sonra! chrome, görüntüleme değerini satır içi bloğa ayarlarken alt öğenin% 100 yükseklikte olmasını istediğimi anlar. btw float ayarı buna neden olur.

display:inline-block

Güncelleme

bu çalışmıyor. çözüm, üst düğüm ofset yüksekliğini elde etmek ve javascript ile sayfanın ve sayfasında kullanmaktır.

<script>
    SomedivElement = document.getElementById('mydiv');
    SomedivElement.style.height = String(nvleft.parentNode.offsetHeight) + 'px';    
</script>
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.