Bir div içindeki yüzen elemanlar, div dışında yüzer. Neden?


274

Eğer bir var ki divona belirli vermek, widthbenim durumumda bir in, içinde ve koyun unsurları imgve başka div.

Fikir, kabın içeriğinin divkabın divgerilmesine ve içeriğin arka planı olmasına neden olacağıdır. Ama bunu yaptığımda, içerdiği divyüzen olmayan nesnelere uyacak şekilde küçülüyor ve kayan nesneler ya tamamen dışarı çıkacak ya da yarısı dışarı çıkacak, yarısı içeri girecek ve büyüklerin büyüklüğü üzerinde herhangi bir etkisi olmayacak div.

Bu neden? Eksik olduğum bir şey var mı ve heightiçerdiği şeyleri uzatmak için kayan öğeleri nasıl alabilirim div?

Yanıtlar:


398

En kolayı overflow:hiddenüst div'a koymak ve bir yükseklik belirtmemek:

#parent { overflow: hidden }

Başka bir yol da ana div'i kaydırmaktır:

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

Başka bir yol net bir eleman kullanır:

<div class="parent">
   <img class="floated_child" src="..." />
   <span class="clear"></span>
</div>

CSS

span.clear { clear: left; display: block; }

17
İşe yarıyor, ama şimdi iki kat daha karışıkım: bunun bir açıklaması var mı yoksa tam da böyle mi?
DavidR

8
Evet, orada bir açıklama var ama beri unutmuş o :( Onun ne kadar öyle. overflow:hiddenKuvvetleri, yapabileceği en iyi ebeveynin alt öğelerini içerecek şekilde tarayıcı Thats bu giderir neden..
Doug Neiner

5
Bence açıklama overflow: hiddenburada: link . Ve çok teşekkürler, benim için çalıştı
Vikas Arora

6
@DavidR En kolay açıklama html / css'nin tarihli, kötü düşünülmüş ve kötü uygulanmış bir teknoloji parçası olduğudur. Aslında, bu akıl yürütme aslında bu yazıyı yaptığınızdan beri şüphesiz karşılaştığınız birçok html / css tuhaflığını açıklamaktadır.
Hafif

1
overflow: hiddenBir öğenin ana kaptan akan herhangi bir parçasını gizleyeceğini unutmayın . Benim için bu, bazı metin parçalarının okunamaz hale gelmesine neden oldu.
Top Cat

160

neden

Sorun, yüzen öğelerin akış dışı olmasıdır :

Bir öğe yüzen, tamamen konumlandırılmışsa veya kök öğe ise akış dışı olarak adlandırılır .

Bu nedenle, çevre öğelerini bir akış içi öğenin yaptığı gibi etkilemezler .

Bu, 9.5 Kayan Noktada açıklanmıştır :

Bir şamandıra akışta olmadığından, şamandıra kutusundan önce ve sonra oluşturulan konumlandırılmamış blok kutuları, şamandıra yokmuş gibi dikey olarak akar. Bununla birlikte, şamandıranın yanında oluşturulan mevcut ve sonraki satır kutuları, şamandıranın kenar boşluğu kutusuna yer açmak için gerektiği şekilde kısaltılır.

resim açıklamasını buraya girin

Bu ayrıca 10.6 Yükseklik ve kenar boşluklarının hesaplanmasında belirtilmiştir . İçin "normal" bloklar ,

Sadece normal akıştaki çocuklar dikkate alınır (yani, yüzen kutular ve kesinlikle konumlandırılmış kutular göz ardı edilir […])

resim açıklamasını buraya girin

Hacky çözümü: temizleme

Sorunu çözmenin bir yolu, bazı yüzer öğelerin tüm şamandıraların altına yerleştirilmesini zorlamaktır. Daha sonra, ebeveynin yüksekliği o elemanı sarmak için büyür (ve böylece yüzer).

Bu kullanılarak elde edilebilir özelliği :clear

Bu nitelik bir elemanın kutu (ler) kenarları olabilecek gösterir değil önceki bir hareketli kutulara komşu olacak.

resim açıklamasını buraya girin

Yani bir çözüm clear: bothşamandıraların son kardeşi gibi boş bir eleman eklemek

<div style="clear: both"></div>

Ancak, bu anlamsal değildir. Öyleyse üst öğenin sonunda bir sözde öğe oluşturun :

.clearfix::after {
  clear: both;
  display: block;
}

Bu yaklaşımın birden çok varyantı vardır, örneğin :aftereski tarayıcıları desteklemek için kullanımdan kaldırılmış tek kolon sözdizimini kullanma veya gibi diğer blok düzeyi ekranları kullanma display: table.

Çözüm: BFC kökleri

Başlangıçta tanımlanan sorunlu davranış için bir istisna vardır: bir blok öğesi bir Blok Biçimlendirme Bağlamı oluşturursa (bir BFC köküdür), kayan içeriğini de sarar.

Bağlam köklerini biçimlendirmek için 10.6.7 'Otomatik' yüksekliklerine göre ,

Elemanın alt kenar kenarı, elemanın alt içerik kenarının altında olan herhangi bir hareketli alt öğeye sahipse, yükseklik bu kenarları içerecek şekilde artırılır.

resim açıklamasını buraya girin

Ek olarak, açıklandığı gibi 9.5 Float'larda , BFC kökleri aşağıdakiler nedeniyle de yararlıdır:

Bir tablonun kenarlık kutusu, blok düzeyinde değiştirilen bir eleman veya normal akıştaki yeni bir blok formatlama bağlamı oluşturan bir eleman […], elemanın kendisi ile aynı blok formatlama bağlamındaki herhangi bir yüzer kenar boşluğu kutusuyla çakışmamalıdır. .

resim açıklamasını buraya girin

Bir blok biçimlendirme içeriği

  • Örneğin overflowdışındaki blokları engelleyinvisiblehidden

    .bfc-root {
      overflow: hidden;
      /* display: block; */
    }
  • Blok kutu olmayan kapsayıcılar: ne zaman , veya displayolarak ayarlanır .inline-blocktable-celltable-caption

    .bfc-root {
      display: inline-block;
    }
  • Kayan elemanlar: veya floatolarak ayarlandığında .leftright

    .bfc-root {
      float: left;
    }
  • Kesinlikle konumlandırılmış öğeler: veya positionolarak ayarlandığında .absolutefixed

    .bfc-root {
      position: absolute;
    }

Bunların taşan içeriği kırpmak, otomatik genişlikleri hesaplamak gibi istenmeyen yan etkileri olabileceğini unutmayın. sığacak şekilde daraltma algoritmasıyla veya akış dışı hale gelmesi . Dolayısıyla sorun, bir BFC oluşturan görünür taşmaya sahip bir akış içi blok düzeyinde öğeye sahip olmanın mümkün olmamasıdır.

Ekran L3 şu sorunları giderir:

Akış düzeni görüntü türlerini daha iyi ifade etmek ve bir öğeyi BFC kökü yapmak için açık bir anahtar oluşturmak üzere flowve iç ekran türleri oluşturuldu . (Bu, ve gibi hack'lere olan ihtiyacı ortadan kaldırmalıdır.flow-root ::after { clear: both; }overflow: hidden […])

Ne yazık ki, henüz tarayıcı desteği yok. Sonunda

.bfc-root {
  display: flow-root;
}

1
Yani yüzen kutular ana kapları tarafından tanınmıyor, bu nedenle yükseklik çöküyor, ancak kardeşleri tarafından tanınıyor, dolayısıyla düzeltme?
symlink

@symlink Evet, ana kapsayıcılar, BFC kökleri olmadıkça yüzenleri kaplayacak şekilde büyümezler. BFC kökü olmayan kardeşler bloklardan doğrudan etkilenmez (ancak çizgi kutuları). Ancak, boşluk onları önceki herhangi bir şamandıranın altına taşır.
Oriol

"BFC kökü olmayan kardeşler bloklardan doğrudan etkilenmez (ancak çizgi kutuları etkilenir)." - Bunu açıklayabilir misiniz lütfen? : Bu jsFiddle yılında anlamına mı jsfiddle.net/aggL3Lk7/2 , satır içi resim kapsamını (dolayısıyla Kaplayıcı sınır onu alt geçişleri) etkilemiyor ancak resim gösterildiği gibi (hat kutusu olan) metin etkiliyor süzülüyor metnin görüntünün altını çizmediği gerçeği?
symlink

1
@symlink Evet, kesinlikle. Kemanınızda
Oriol

1
Hemfikirim. Bu kabul edilen cevap olmalı. W3'ün bir "kesmek" kodlamak zorunda kaldığımız yolu çağırması ilginç. Birisi kötüye gitti.
DR01D



11

Eksik bir şey yok. Float, bir görüntünün (örneğin) birkaç metin paragrafının yanına oturmasını istediğiniz durum için tasarlanmıştır, böylece metin görüntünün etrafında akar. Metin kapsayıcıyı "gerdiyse" bu olmazdı. İlk paragrafınız sona erer ve ardından bir sonraki paragrafınız resmin altında başlar (muhtemelen birkaç yüz piksel aşağıda).

İşte bu yüzden sonuca ulaşıyorsunuz.


3
Bunun kayan elemanın ebeveynin yüksekliğini düzgün bir şekilde germesiyle nasıl bir ilgisi var?
Hafif

11

Bazı durumlarda, yani yalnızca aynı "satırda" öğelerin akışını sağlamak için (eğer) kullanıyorsanız float,

display: inline-block;

onun yerine

float: left;

Aksi takdirde, bir clearelemanın kullanılması CSS çalışması gereken şeyi yapmak için bir öğeye ihtiyaç duysa bile tahılla karşı karşıya kalsa bile işe yarar.


11

İşte daha modern yaklaşım:

.parent {display: flow-root;} 

Daha fazla düzeltme yok.

ps Taşma kullanma: gizli; kutu gölgesini gizler ...


Safari 11'de de çalışıyor
17:58

7

Teşekkürler LSerni benim için çözdün .

Bunu başarmak için :

+-----------------------------------------+
| +-------+                     +-------+ |
| | Text1 |                     | Text1 | |
| +-------+                     +-------+ |
|+----------------------------------------+

Bunu yapmak zorundasın :

<div style="overflow:auto">
    <div style="display:inline-block;float:left"> Text1 </div>
    <div style="display:inline-block;float:right"> Text2 </div>
</div>

4

Lucas'ın dediği gibi, tanımladığınız şey float özelliği için amaçlanan davranıştır. Birçok insanın kafasını karıştıran şey şamandıranın CSS mizanpaj modelindeki eksiklikleri telafi etmek için orijinal kullanım amacının çok ötesine itilmiş olmasıdır.

Bu mülkün nasıl çalıştığını daha iyi anlamak istiyorsanız Floatutorial'a bir göz atın .


0

Kolayca ilk önce div flex yapabilir ve haklı içeriği sağa veya sola uygulayabilir ve sorununuz çözülmüştür.

<div style="display: flex;padding-bottom: 8px;justify-content: flex-end;">
					<button style="font-weight: bold;outline: none;background-color: #2764ff;border-radius: 3px;margin-left: 12px;border: none;padding: 3px 6px;color: white;text-align: center;font-family: 'Open Sans', sans-serif;text-decoration: none;margin-right: 14px;">Sense</button>
				</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.