Yüzen bir div ebeveyninin% 100 yüksekliğinde nasıl yapılır?


256

İşte HTML:

<div id="outer">
    <div id="inner"></div>
    Test
</div>

Ve işte CSS:

#inner {
  float: left;
  height: 100%;
}

Chrome geliştirici araçlarını inceledikten sonra, iç div 0 piksel yüksekliğe ulaşıyor.

Ana divin yüksekliğinin% 100'ü olmaya nasıl zorlayabilirim?


1
Yani dış div'deki (iç div'de değil) metnin olmasını istersiniz, ancak kayan iç div, dış div'in yüksekliği mi?
edl

Elde etmeye çalıştığınız sonuç nedir? Sanırım kafa karışıklığım, eğer iç div dış ve dış metin kadar yüksekse, iç div içindeki metnin olması ile aynı değil midir?
edl

2
@edl: Evet, öyle :) Bunu bu şekilde istememin nedeni, iç div'in arka planı olarak bir görüntüye sahip olmasıdır. Metnin yanında olması gerekir. Her ikisinin de arka plan görüntüsü olduğu için dış div içinde olması gerekir.
Nathan Osman


2
Bu sorunun cevaplarını görmek ve denemek sadece iç karartıcıydı.
EternalHour

Yanıtlar:


125

İçin #outeryüksekliğinin içeriğine göre ve var olan #innertabanı bu üzerindeki yüksekliği, kesinlikle yerleştirilmiş iki kişi oldu.

Daha fazla detay için spec bulunabilir css yükseklik özelliği , ama aslında, #innergörmezden gerekir #outereğer yüksekliği #outerbireyin yüksekliği auto, sürece #outer kesinlikle konumlandırılmıştır. Daha sonra #inneryükseklik, 0 olur sürece #inner kendisi kesinlikle konumlandırılır.

<style>
    #outer {
        position:absolute; 
        height:auto; width:200px; 
        border: 1px solid red; 
    }
    #inner {
        position:absolute; 
        height:100%; 
        width:20px; 
        border: 1px solid black; 
    }
</style>

<div id='outer'>
    <div id='inner'>
    </div>
    text
</div>

Ancak ... #innerKesinlikle konumlandırarak , bir floatayar yok sayılır, bu nedenle #inneraçıkça bir genişlik seçmeniz ve #outeristediğinizden şüphelendiğim metin sargısını takmak için dolgu eklemeniz gerekir . Örneğin, aşağıda, dolgusu +3 #outergenişliğindedir #inner. Uygun olarak (tüm nokta #inner% 100'e kadar yükseklik elde etmek olduğu için ) altına metin sarmaya gerek yoktur #inner, bu yüzden bu #inneryüzer gibi görünecektir .

<style>
    #outer2{
        padding-left: 23px;
        position:absolute; 
        height:auto; 
        width:200px; 
        border: 1px solid red; 
    }
    #inner2{
        left:0;
        position:absolute; 
        height:100%; 
        width:20px; 
        border: 1px solid black; 
   }
</style>

<div id='outer2'>
    <div id='inner2'>
    </div>
    text
</div>

Hedefinizle ilgili çok fazla yanlış varsayımlara dayandığı için önceki cevabımı sildim.


118
Hmm .. soru Floated div's hakkındaydı. Kesinlikle pozisyon divs hakkında yanıtladı
Mihkel L.

57
Asla delicesine basit şeyler elde etmek ne kadar karmaşık şaşırtıcı durdurmak asla HTML/CSS:)
Yuriy Nakonechnyy

15
Bunu kodlama genişliği olmadan yapmanın bir yolu var mı? Duyarlı kaplar için harika değil.
Jake Wilson

23
Bunun neden bu kadar kabul edildiğini ve onaylandığını bilmiyorum. Soru kayan div'larla ilgili, bu da beni aramamdan buraya getiren şeydi ve bunun yerine bu kesinlikle konumlandırılmış div'lara cevap veriyor.
Matt K

2
Yüzer bir kabı kabına dikey olarak uyacak şekilde nasıl yapılır? Artık yüzmesini sağlayarak! Haha. Güzel denemek ve aslında yararlı olarak kabul edilecek kadar yakın.
Rolf

124

Ebeveyn için:

display: flex;

Bazı önekler eklemelisiniz http://css-tricks.com/using-flexbox/

Edit: Sadece dezavantajı her zamanki gibi IE, IE9 flex desteklemiyor. http://caniuse.com/flexbox

Düzenleme 2: @toddsby belirtildiği gibi, hizalama ürün ebeveyn içindir ve varsayılan değer aslında streç . Çocuk için farklı bir değer istiyorsanız, align-self özelliği vardır.

Düzenleme 3: jsFiddle: https://jsfiddle.net/bv71tms5/2/


3
Bunun yalnızca modern tarayıcılarda çalıştığını ve daha sonra satıcı önekleri gerektirdiğini belirtmelisiniz.
kontur

12
Orijinal sorunun çocuk divının yüzmesini ve tüm pozisyonun gerektirdiği göz önüne alındığında, bu çözümün daha fazla ilgi görmediğine şaşırdım: mutlak çözümler, şamandıra kullanacağınız çoğu durumda işlere gerçekten bir anahtar atıyor. Bu çözüm, konumun yan etkilerinin olduğu harika bir çözüm sunar: mutlak bir sorun değildir ve biraz daha fazla kazmak istiyorsanız, oldukça iyi bir tarayıcılar arası uyumluluk elde etmek mümkündür.
Luke

İşte cevap bu. IE9 yeterince yakında çıkacak, iyi ve sağlam bir vuruş yaparak yardımcı olabilir. Bu çözüm çok güzel, basit ve kolay ... Alternatif çözümleri birlikte hackledim. ;)
jrista

2
Flexbox için en son spesifikasyona göre: bkz. W3.org/TR/css-flexbox-1/#align-items-property . align-items: stretch;varsayılan değer olduğundan gerekli değildir. Ayrıca çocuk üzerinde değil ebeveyn üzerinde tanımlanmalıdır.
toddsby

1
Cevapta keman eklendi. @Tigran
Aiphee

77

Aslında, üst öğe konumlandırıldığı sürece çocuğun yüksekliğini% 100 olarak ayarlayabilirsiniz. Yani, ebeveynin kesinlikle konumlandırılmasını istemiyorsanız. Açıklayayım:

<style>
    #outer2 {
        padding-left: 23px;
        position: relative; 
        height:auto; 
        width:200px; 
        border: 1px solid red; 
    }
    #inner2 {
        left:0;
        position:absolute; 
        height:100%; 
        width:20px; 
        border: 1px solid black; 
    }
</style>

<div id='outer2'>
    <div id='inner2'>
    </div>
</div>

14
Harika, bu Chadwick'in position:absolute(bir sitenin stillerini etkileyebilecek) gereksiniminden daha az sınırlayıcı
henry

3
Sadece ben olabilirim, ancak kenar çubuğu içerikten daha büyükse sorun yaşıyorum. Ana kapsayıcıda arka plan rengi duracak, ancak kenar çubuğu içeriği üst öğenin dışına taşacak.
Howdy_McGee

Bu çok daha esnek bir çözümdür ve birkaç kayan alt öğeniz olsa bile, ofsetlerini kesinlikle konumlandırmak için kabul edilebilir bir dezavantaj gibi görünüyor. +1
kontur

Teşekkürler çok fazla. Özel çözümümü SO: stackoverflow.com/a/31749164/84661 adresindeki başka bir soruya yanıt olarak gönderdim .
Brian Haak

24

Internet Explorer'ın IE8'den önceki sürümlerini desteklemeniz gerekmediği sürece, bunu display: table-cellgerçekleştirmek için kullanabilirsiniz :

HTML:

<div class="outer">
    <div class="inner">
        <p>Menu or Whatever</p>
    </div>
    <div class="inner">
        <p>Page contents...</p>
    </div>
</div>

CSS:

.inner {
    display: table-cell;
}

Bu, .innersınıftaki her öğeyi üst öğesinin tam yüksekliğini işgal etmeye zorlar .


Bu işe yarayacak olsa da, bir tane belirtseniz bile bir kenar boşluğu göstermeyecektir. Bu nedenle, bir kenar boşluğu atamak istiyorsanız bu çözüm başarısız olacaktır. Dolguyu geçici çözüm olarak atayabilirsiniz, ancak kenar boşluğuna (& dolguya değil) ihtiyacınız varsa bunu nasıl çözersiniz?
Devner

13
Burada bir şey mi eksik? Sorunuz kayan bir elemanın yüksekliğinin% 100 olmasını istiyor. Yüzdürüldüğünde, display: table-cell;eleman artık kabının yüksekliğini doldurmuyor mu? Bir şey eksik olmalıyım, çünkü bu sizin kendi sorunuz ...?
user56reinstatemonica8

16

Bir örnek yaptımSorununuzu çözen .

Bir sarıcı yapmalı, yüzdürmeli, sonra div'inizi mutlak olarak konumlandırmalı ve% 100 yükseklik vermelisiniz.

HTML

<div class="container">
    <div class="left">"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." </div>
  <div class="right-wrapper">
    <div class="right">"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." </div>
  </div>
  <div class="clear">&nbsp;</div>
</div>

CSS:

.container {
    width: 100%;
    position:relative;
}
.left {
    width: 50%;
    background-color: rgba(0, 0, 255, 0.6);
    float: left;
}
.right-wrapper {
    width: 48%;
    float: left;
}
.right {
    height: 100%;
    position: absolute;
}

Açıklama: .right div kesinlikle konumlandırılmıştır. Bu, genişliği ve yüksekliği, üst ve sol konumlarının, birinci ebeveyn div temel alınarak tamamen veya yalnızca genişlik veya yükseklik özellikleri CSS'de açıkça belirtilmişse göreceli olarak konumlandırılarak hesaplanacağı anlamına gelir; açıklık beyan edilmezse, bu özellikler ana kapsayıcıya (.right-wrapper) göre hesaplanır.

Bu nedenle, DIV'nin% 100 yüksekliği .container son yüksekliğine göre hesaplanacak ve .right konumunun son konumu ana konteynere göre hesaplanacaktır.


1
Bu hangi durumlar için sağlam bir çözümdür garanti olduğunu .rightsütunun içeriği daha kısadır .leftsütunun içeriği. Örneğin, bunu .leftsütunun değişken boyutlarda içeriğe sahip olduğu bir bileşende kullanıyorsanız ve sağ sütunda ayrıntı sayfasına bir ok gösteriliyorsa, bu çözüm iyi çalışır. Bunun için +1
Zachary Kniebel

15

İşte bunu başarmanın daha basit bir yolu:

  1. Üç öğenin kapsayıcı (#outer) ekranını ayarlayın: tablo
  2. Ve öğeleri kendileri (#inner) görüntüsünü ayarlayın: tablo hücresi
  3. Yüzenleri çıkarın.
  4. Başarı.
#outer{
    display: table;
}
#inner {
    display: table-cell;
    float: none;
}

Floated div'daki @Itay sayesinde % 100 yükseklik


8

Biraz jQuery kullanmaya hazırsanız, cevap basit!

$(function() {
    $('.parent').find('.child').css('height', $('.parent').innerHeight());
});

Bu, tek bir elemanı üst öğesinin% 100 yüksekliğinde bir tarafa yüzmek için iyi çalışır, normalde etrafına sarılacak diğer yüzen elemanlar bir tarafa tutulur.

Umarım bu jQuery hayranlarına yardımcı olur.


18
Bu mizanpaj problemine javascript atmak aşırıya kaçmış gibi görünüyor.
kontur

1
IE'de geliştirmek zorunda olan biri olarak: TEŞEKKÜR EDERİZ!
Kale

1
Biraz abartı belki, ama bu güzel bir cevap, teşekkürler!
Martin

1
Tüm konumlandırma problemlerinin JS olmadan çözülmesi gerektiğine katılıyorum.
michaeluskov

1
JS AND jQuery
ViliusL

3

Bu, eşit yüksekliğe sahip ızgara sistemi için bir kod örneğidir.

#outer{
width: 100%;
margin-top: 1rem;
display: flex;
height:auto;
}

Dış div için CSS yukarıda

#inner{
width: 20%;
float: left;
border: 1px solid;
}

Yukarıda iç div

Umarım bu sana yardımcı olur


1

Bu bana yardımcı oldu.

#outer {
    position:relative;
}
#inner {
    position:absolute;
    top:0;
    left:0px;
    right:0px;
    height:100%;
}

Sağa ve sola değiştir: tercih edilen #inner genişliğini ayarlamak için.


1

Aynı yüksekliğe sahip birden fazla alt öğeye ihtiyacınız olduğunda benzer bir durum flexbox ile çözülebilir:

https://css-tricks.com/using-flexbox/

Set display: flex;ebeveyn için ve flex: 1;alt öğeleri için, hepsi aynı yüksekliğe sahip olacaktır.


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.