Bir iç <div> öğesini üst <div> alt kısmına nasıl gönderebilirim?


184

Aşağıdaki başka bir div resmi ve kodu içindeki div. Çünkü div div'in metin ve görüntüleri olacaktır. Ve kırmızı div, ana div'in son öğesi olacaktır.

alternatif metin

<div style="width: 200px; height: 150px; border: 1px solid black;">
    <div style="width: 100%; height: 50px; border: 1px solid red;">
    </div>
</div>

Peki üst div öğesinin kodu mantıksal olarak alt divın üstüne yerleştirilir mi? Resimler ve metin dinamik olarak eklenmiş mi? Özel soru nedir?
justkt

Yanıtlar:


219

Bu bir yol

<div style="position: relative; 
            width: 200px; 
            height: 150px; 
            border: 1px solid black;">

    <div style="position: absolute; 
                bottom: 0; 
                width: 100%; 
                height: 50px; 
                border: 1px solid red;">
    </div>
</div>

Ancak iç div kesinlikle konumlandırıldığından, dış div'deki diğer içerikle çakışan her zaman endişelenmeniz gerekir (ve her zaman sabit yükseklikler ayarlamanız gerekir).

Bunu yapabiliyorsanız, bu iç div'i dış divinizdeki son DOM nesnesi yapmak ve "temizle: her ikisi" olarak ayarlamasını sağlamak daha iyidir.


1
Açıklamanız ve IE Hack için teşekkürler (yanlış değilse ** genişliği eklediniz: IE Hack için% 100).
uzay95

1
Hayır, genişlik:% 100 orijinalinizde vardı - eklemedim.
Jon Smock

1
Değiştirdiğim bölümleri kalınlaştırmaya çalıştım, ancak Markdown kod bloklarının içine uygulanmıyor :-P
Jon Smock

:) Aslında ben semboller ile IE kesmek nasıl alamadım, bu yüzden IE Hacking olduğunu düşündüm bu :)
uzay95

Ana kapsayıcı yüzüyorsa, bu yaklaşımın işe yaramayacağını unutmayın.
klewis

85

Esnek kutu yolu.

HTML:

<div class="parent">
  <div>Images, text, buttons oh my!</div>
  <div>Bottom</div>
</div>

CSS:

.parent {
  display: flex;
  flex-direction: column;
  justify-content: space-between;
}

/*  not necessary, just to visualize it */

.parent {
  height: 500px;
  border: 1px solid black;
}


.parent div {
  border: 1px solid red;
}

resim açıklamasını buraya girin

Düzenle:

Kaynak - Flexbox Kılavuzu

Flexbox için tarayıcı desteği - Caniuse


4
OMG, tüm [programlama] hayatım boyunca neredeydin! ;) Bunun çok basit ve konumlandırma ile uğraşmamasını seviyorum ve tüm tarayıcılarda çalışmak gibi görünüyor: caniuse.com/#feat=flexbox . Modern programlama için çözüm ve kabul edilmiş cevap bu olmalıdır.
Sablefoste

1
Flexbox genellikle bugünlerde "kolay" bir yöntemdir ve (neredeyse) mükemmel tarayıcı desteği ve dokümantasyonuna sahiptir. Cevaba caniuse bağlantısını ekleme.
Franklin Tarter

80

Dış div position="relative"ve iç div yapın position="absolute"ve ayarlayın bottom="0".


8
ve width=100%de.
Kevin

6
Evet, bu işe yarıyor ancak mutlak konumlandırma "doğal düzeni" bozuyor. İç div'in yüksekliği ebeveynin yüksekliği olarak dahil edilmeyecek ve dış div daraldıkça, dış div'deki diğer şeylerle çakışabilir.
Ayush Gupta

15

İşte bir element akışını etkilemeyen başka bir saf CSS hilesi.

#parent {
  min-height: 100vh; /* set height as you need */
  display: flex;
  flex-direction: column;
  background: grey;
}
.child {
  margin-top: auto;
  background: green;
}
<div id="parent">
  <h1>Positioning with margin</h1>
  <div class="child">
    Content to the bottom
  </div>
</div>


Üst div bir yükseklik ayarlamak istemiyorsanız harika bir! Teşekkür ederim!
Johan Nordli

1
Bu benim için en iyi cevaptı
Russell Chisholm

Harika! Diğer esnek çözüm tüm içeriğimi yerinden çıkardı, bu altta koymak istediğiniz nesneyi diğerlerinden ayırıyor. Harika bir çözüm!
Alejandro Aristizábal

8

Mutlak konumlandırma isteyemezsiniz çünkü yeniden akışı bozar: bazı durumlarda daha büyük çözüm büyükbaba veya büyükanne elemanını display:table;ve ana elemanı yapmaktır display:table-cell;vertical-align:bottom;. Bunu yaptıktan sonra, alt öğeleri verebilmelisiniz display:inline-block;ve bunlar otomatik olarak ebeveynin altına doğru akacaktır.


8

Not: Bu kesinlikle mümkün olan en iyi yol değildir!

Durum : Ben sadece herhangi bir ekstra div eklemek mümkün değildi aynı thign yapmak zorunda kaldı, bu yüzden ben vardı ne ile sıkışmış ve bunun yerine innerHTML kaldırma ve neredeyse 2 render gibi javascript ile başka bir oluşturmak yerine alt (hareketli çubuk).

Çözüm: O zaman ne kadar yorgun olduğum göz önüne alındığında, böyle bir yöntemi düşünmek bile normal görünüyor, ancak çubuğun yüksekliğinin başladığı bir ana DOM öğesine sahip olduğumu biliyordum.

Javascript ile karışıklık daha başka bir ( her zaman iyi bir fikir değil ) CSS cevap kullanılır! :)

-moz-transform:rotate(180deg);
-webkit-transform:rotate(180deg);
-ms-transform:rotate(180deg);

Evet thats doğru, DOM konumlandırma yerine, üst css içinde baş aşağı döndü.

Benim senaryom için işe yarayacak! Muhtemelen başkaları için de! Alev Yok! :)


1
Bu mümkün olan en iyi yol olmayabilir ama bu oldukça harika, çok yaratıcı bir yaklaşımdır. Kendim bu sorunu bir süredir güreşiyorum, ana yapıştırma noktalarım: ayarlanmış yükseklikler yok, tamamen akıcı olmalı (neden ekran: masanın çalışmadığını açıklamak için yeterli karakter yok). Bu her şeyi güzel halletti; Bu olduğunda div içindeki görüntüler de çevrilir, bu yüzden sadece onları geri çevirmek için bu elemanların sınıfını kullandım. Belirlenmiş yükseklikleri olmadan tam olarak olması gerektiği gibi görünüyor. Biraz kibirli ama hey, bazen daha iyi bir alternatif yok. Aferin!
tganyan

4

Ebeveynin yüksekliğini biliyorsanız mutlak div ve tablolardan kaçınmanın yolu:

<div class="parent">
    <div class="child"> <a href="#">Home</a>
    </div>
</div>

CSS:

.parent {
    line-height:80px;
    border: 1px solid black;
}
.child {
    line-height:normal;
    display: inline-block;
    vertical-align:bottom;
    border: 1px solid red;
}

JsFiddle:

Misal


0
<div style="width: 200px; height: 150px; border: 1px solid black;position:relative">
    <div style="width: 100%; height: 50px; border: 1px solid red;position:absolute;bottom:0">
    </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.