Yüzer elemanlar içeriyorsa neden bir konteyner elemanının yüksekliği artmaz?


210

Boy ve şamandıranın nasıl çalıştığını sormak istiyorum. İçinde bir div ve içinde içerik olan bir div var. Yüksekliği iç div'in içeriğine bağlı olarak değişebilir, ancak iç div'm dış divından taşacak gibi görünüyor. Bunu yapmanın uygun yolu ne olurdu?

 <html>
    <body>
        <div style="margin:0 auto;width: 960px; min-height: 100px; background-color:orange">
    	    <div style="width:500px; height:200px; background-color:black; float:right"></div>
        </div>
    </body>
</html>



güzel ve çok iyi teşekkürler!
Bassam Alugili

Yanıtlar:


581

Yüzen elemanlar kap elemanının yüksekliğine eklenmez ve bu nedenle bunları temizlemezseniz kap yüksekliği artmaz ...

Size görsel olarak göstereceğim:

resim açıklamasını buraya girin

resim açıklamasını buraya girin

resim açıklamasını buraya girin

Daha Fazla Açıklama:

<div>
  <div style="float: left;"></div>
  <div style="width: 15px;"></div> <!-- This will shift 
                                        besides the top div. Why? Because of the top div 
                                        is floated left, making the 
                                        rest of the space blank -->

  <div style="clear: both;"></div> 
  <!-- Now in order to prevent the next div from floating beside the top ones, 
       we use `clear: both;`. This is like a wall, so now none of the div's 
       will be floated after this point. The container height will now also include the 
       height of these floated divs -->
  <div></div>
</div>

overflow: hidden;Konteyner öğeleri de ekleyebilirsiniz , ancak clear: both;bunun yerine kullanmanızı öneririz .

Ayrıca, bir öğeyi kendiliğinden temizlemek isterseniz

.self_clear:after {
  content: "";
  clear: both;
  display: table;
}

CSS Float Nasıl Çalışır?

Şamandıra tam olarak nedir ve ne işe yarar?

  • floatMülkiyet çoğu başlayanlar tarafından yanlış anlaşılır. Peki, tam olarak ne yapar float? Başlangıçta, floatözellik kayan leftya da görüntülerin etrafındaki metin akışına sokuldu right. @Madara Uchicha'nın başka bir açıklaması .

    Peki, floatkutuları yan yana yerleştirmek için özelliği kullanmak yanlış mı? Cevap hayırdır ; floatkutuları yan yana ayarlamak için özelliği kullanırsanız sorun yoktur .

  • Bir inlineveya blockseviye elemanını yüzmek, elemanın eleman gibi davranmasını sağlar inline-block.

    gösteri

  • Bir öğeyi yüzer ise leftveya right, widthelemanın sürece, içerik işlediğini ile sınırlı olacaktır widthaçıkça tanımlanır ...

  • floatBir element olamaz center. Bu, yeni başlayanlar ile her zaman gördüğüm en büyük sorun float: center;, bu floatözellik için geçerli bir değer değil . floatGenellikle için kullanılır floatçok için / taşı içeriği sola ya da çok için sağa . Sadece vardır dört için geçerli değerler floatmülkiyet yani left, right, none(varsayılan) ve inherit.

  • Üst öğe, kayan alt öğeler içerdiğinde, bunu önlemek clear: both;için, her iki taraftaki kayan öğeleri temizlemek için özelliği kullanırız , bu da üst öğenin çökmesini önler. Daha fazla bilgi için, başka bir cevabımı buraya başvurabilirsiniz .

  • (Önemli) Çeşitli elemanlardan oluşan bir yığınımız olduğunu düşünün. Kullandığımızda float: left;veya float: right;öğe yığının üzerinde birer birer hareket ettiğinde . Bu nedenle, normal belge akışındaki öğeler yüzen öğelerin arkasına gizlenecektir, çünkü normal yüzen öğelerin üstündeki yığın seviyesindedir. (Lütfen bunu z-indextamamen farklı olduğu için ilişkilendirmeyin .)


Üstbilgi, altbilgi ve 2 sütun içeren basit bir 2 sütun düzenine ihtiyacımız olduğunu varsayarak, CSS'nin nasıl çalıştığını açıklamak için örnek olarak bir örnek almak, bu yüzden planın görünüşü şöyle ...

resim açıklamasını buraya girin

Yukarıdaki örnekte, biz sadece kırmızı kutuları yüzen olmak ya yapabilirsiniz olacak floathem leftveya mümkünse floatüzerine leftkadar ve başka rightbunun 3 sütun ise şunları yapabilirsiniz, düzen bağlıdır sıra floatiçin 2 sütun leftnerede başka biri rightbu duruma bağlıdır, ancak bu örnekte, basitleştirilmiş 2 sütun düzenine sahibiz, böylece floatbiri diğerine leftve diğerine right.

Düzeni oluşturmak için işaretleme ve stiller aşağıda açıklanmıştır ...

<div class="main_wrap">
    <header>Header</header>
    <div class="wrapper clear">
        <div class="floated_left">
            This<br />
            is<br />
            just<br />
            a<br />
            left<br />
            floated<br />
            column<br />
        </div>
        <div class="floated_right">
            This<br />
            is<br />
            just<br />
            a<br />
            right<br />
            floated<br />
            column<br />
        </div>
    </div>
    <footer>Footer</footer>
</div>

* {
    -moz-box-sizing: border-box;       /* Just for demo purpose */
    -webkkit-box-sizing: border-box;   /* Just for demo purpose */
    box-sizing: border-box;            /* Just for demo purpose */
    margin: 0;
    padding: 0;
}

.main_wrap {
    margin: 20px;
    border: 3px solid black;
    width: 520px;
}

header, footer {
    height: 50px;
    border: 3px solid silver;
    text-align: center;
    line-height: 50px;
}

.wrapper {
    border: 3px solid green;
}

.floated_left {
    float: left;
    width: 200px;
    border: 3px solid red;
}

.floated_right {
    float: right;
    width: 300px;
    border: 3px solid red;
}

.clear:after {
    clear: both;
    content: "";
    display: table;
}

Düzenle adım adım gidelim ve şamandıranın nasıl çalıştığını görelim ..

Her şeyden önce, biz ana sarıcı eleman kullanmak, sadece o zaman kullandığımız, bu Görünümünüzün olduğunu varsayabiliriz headerve bir atama heightait 50pxhiçbir şey fantezi yani orada. Bu kadar sürer sadece normal olmayan süzülüyor blok düzeyinde eleman var 100%o süzülüyor sürece yatay alan ya da biz atamak inline-blockona.

İlk geçerli bir değer floatolduğunu leftbizim örneğimizde bu yüzden, kullandığımız float: left;için .floated_leftbiz bir blok yüzer niyetinde böylece, leftbizim muhafaza elemanının.

Sütun sola yüzer

Ve evet, görürseniz, .wrapperdaraltılmış olan üst öğe, yeşil bir kenarlıkla gördüğünüz genişlemedi, ancak doğru olmalı? Bir süre sonra buna geri dönecek, şimdilik, üzerinde yüzen bir sütun var left.

İkinci sütuna geliyor, bunu sağlayan floatbu birright

Sağa yüzen başka bir sütun

Burada, bir var 300pxbiz geniş sütun floatiçin righto kadar süzülüyor oluyor olarak ilk sütunda yanında oturacak, leftve o kadar süzülüyor beri left, bu kadar boş oluk oluşturulan rightve üzerinde alanı geniş olduğundan right, bizim rightyüzer eleman bir yanında mükemmel oturdu left.

Yine de, üst öğe çöktü, şimdi bunu düzeltelim. Üst öğenin daraltılmasını önlemenin birçok yolu vardır.

  • Boş bir blok seviyesi öğesi ekleyin ve clear: both;kayan öğeleri tutan üst öğe bitmeden önce kullanın , şimdi bu clearsizin için işi yapacak yüzen öğelerinize ucuz bir çözümdür, ancak bunu kullanmamanızı tavsiye ederim.

Ekleme <div style="clear: both;"></div>önce .wrapper divolduğu gibi, uçları

<div class="wrapper clear">
    <!-- Floated columns -->
    <div style="clear: both;"></div>
</div>

gösteri

Eh, bu çok iyi bir şekilde düzeldi, artık çökmüş bir overflow: hidden;üst öğe yok, ancak DOM'a gereksiz işaretleme ekliyor, bu nedenle bazıları, amaçlandığı gibi çalışan kayan alt öğeleri tutan üst öğe üzerinde kullanılmasını önermektedir .

Kullanım overflow: hidden;ile ilgili.wrapper

.wrapper {
    border: 3px solid green;
    overflow: hidden;
}

gösteri

Bu bize her ihtiyaç duyduğumuzda bir öğe kazandırır, clear floatancak bununla çeşitli vakaları test ettiğim box-shadowiçin, alt öğeler üzerinde kullanılan belirli bir birinde başarısız oldu .

Demo (Gölgeyi 4 tarafta da göremiyorum,overflow: hidden;bu soruna neden oluyor)

Peki şimdi ne olacak? Bir öğeyi kaydedin, overflow: hidden;açık bir düzeltme kesmek için gitmeyin, CSS'nizde aşağıdaki snippet'i kullanın ve tıpkı overflow: hidden;üst öğe için kullandığınız gibi , classkendi kendini temizlemek için üst öğede aşağıdakileri arayın .

.clear:after {
    clear: both;
    content: "";
    display: table;
}

<div class="wrapper clear">
    <!-- Floated Elements -->
</div>

gösteri

Burada gölge amaçlandığı gibi çalışır, ayrıca çökmeyi önleyen ana öğeyi kendiliğinden temizler.

Ve son olarak, clearkayan elemanlardan sonra altbilgiyi kullanıyoruz .

gösteri


float: none;Zaten ne zaman kullanılır, varsayılan olduğu gibi, bildirmek için herhangi bir kullanım float: none;?

Duyarlı bir tasarıma gidiyorsanız, kayan öğelerinizin belirli bir çözünürlükte birbirinin altında olmasını istediğinizde, bu değeri birçok kez kullanacaksınız. Çünkü bu float: none;mülk burada önemli bir rol oynamaktadır.


Nasıl floatfaydalı olduğuna dair birkaç gerçek dünya örneği .

  • Daha önce gördüğümüz ilk örnek, bir veya daha fazla sütun düzeni oluşturmaktır.
  • Kullanılması imgsüzülüyor içini petrafında akmaya içeriğimizi sağlayacaktır.

Demo (Kayanimg)

Demo 2 (imgyüzerleft)

  • floatYatay menü oluşturmak için kullanma - Demo

İkinci öğeyi de yüzdürün veya "kenar boşluğu" kullanın

Son fakat en az değil, floatsadece tek bir öğeye sahip olduğunuz leftancak floatdiğerini yapmadığınız bu özel durumu açıklamak istiyorum , ne olacak?

Biz kaldırırsanız varsayalım float: right;kızımız gelen .floated_right class, divaşırı gelen işlenecek lefto süzülüyor çekmemektedir.

gösteri

Yani bu durumda, ya olabildiğince floatiçin leftde

VEYA

Sen edebilirsiniz kullanmak margin-leftyani süzülüyor sol sütunda büyüklüğüne eşit olacak 200pxgeniş .


3
Şamandıraların blok düzeyinde bir ebeveynin yüksekliğine katkıda bulunmaması gerçeği burada spesifik olarak belirtilmiştir: w3.org/TR/CSS21/visudet.html#normal-block Bir düzeltme eklemenin neden çalışmasının nedeni 1) temizleme (genellikle) normal akıştadır 2) temizleme şamandıraları, temizleme düzeltmesinin şamandıraların en altına yerleştirilmesini gerektirir 3) kabın bu düzeltmeyi içerecek şekilde gerilmesi gerekir.
BoltClock

@BoltClock Eğer şamandıranın nasıl çalıştığını bulan kullanıcılar için seo'yu ciddi şekilde etkileyecek şekilde başlık düzenlemesini geri alırsanız daha iyi olur .. bu terimleri google'a yazabilir ve kontrol edebilirsiniz .. başka insanlar için bu kanonik cevap işe yaramaz aradıklarını bulamıyorlar.
Bay Alien

"CSS şamandıra nasıl çalışır?" son derece geniş bir başlıktır ve insanları herhangi bir şamandıra sorusunu bu sorunun bir kopyası olarak kapatmak için oy kullanmaya yanıltır. Buradaki soru sadece bir yönü kapsıyor: kapları saran (veya saran) kaplar.
BoltClock

@BoltClock Her neyse teknik, açıklandığı gibi kalır clear: both;, ancak düzenlemenin haklı olduğunu düşünüyorsanız, bu şekilde devam edelim
Bay Alien

1
parlak cevap. "Herhangi bir öğeyi sola veya sağa kayan, genişlik açıkça tanımlanmadığı sürece, öğenin genişliği, tuttuğu içerikle sınırlı olacaktır" - aynı şeyi gözlemledim ve sadece bunun doğrulanmasını arıyordum. Teşekkür ederim
Deen John

38

overflow:autoİç yüzen div'ı kapsaması için ebeveyn div'inize eklemeniz gerekir :

<div style="margin:0 auto;width: 960px; min-height: 100px; background-color:orange;overflow:auto">
    <div style="width:500px; height:200px; background-color:black; float:right">
    </div>
</div>

jsFiddle örneği


6
bu bir çözüm değil, dış div'den sınırların dışına çıkan içeriği saklıyorsunuz.
Alejandro Ruiz Arias

@AlejandroRuizArias - Bir şey nasıl saklanıyor?
j08691

3
Bu örnekte hiçbir şey yok, ama iç div'e yeterli içerik eklerseniz evet.
Alejandro Ruiz Arias

Bu OP aradığı şeyi yapmaz: Forked jsfiddle.net/h0ceb5ra
TecBrat

1
Muhteşem. Aradığım tek öznitelik çözümü, eğer her şey bu kadar kolay olsaydı, küçülmeye gerek kalmazdı.
YK

10

Şamandıra hatasıyla karşılaşıyorsunuz (teknik olarak bir kaç tarayıcı bu davranışı sergilediğinden dolayı bir hata olup olmadığından emin değilim). İşte olanlar:

Normal koşullar altında, açık bir yükseklik ayarlanmadığı varsayılarak, div gibi bir blok düzeyi öğesi, yüksekliğini içeriğine göre ayarlayacaktır. Ana div'in alt kısmı son öğenin ötesine uzanacaktır. Ne yazık ki, bir elemanın kaydırılması, ebeveynin yüksekliğini belirlerken kayan elemanın dikkate alınmasını durdurur. Bu, son öğeniz kayarsa, üst öğeyi normal öğeyle aynı şekilde "germeyeceği" anlamına gelir.

takas

Bunu düzeltmenin iki yaygın yolu vardır. Birincisi bir "takas" elemanı eklemektir; yani, yüzen öğenin altında, ebeveynin gerilmesine zorlayacak başka bir öğe. Son çocuk olarak aşağıdaki html'yi ekleyin:

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

Görünür olmamalı ve temizle kullanarak: her ikisi de, kayan öğenin yanında değil, ondan sonra oturduğundan emin olursunuz.

Taşma:

Çoğu kişi tarafından tercih edilen ikinci yöntem (bence), üst öğenin CSS'sini, taşma "görünür" dışında bir şey olacak şekilde değiştirmektir. Bu nedenle, taşmanın "gizli" olarak ayarlanması, ebeveynin yüzen çocuğun alt kısmının ötesine gerilmesine zorlar. Bu, yalnızca ebeveyn üzerinde bir yükseklik ayarlamadıysanız doğrudur.

Dediğim gibi, ikinci yöntem, işaretlemenize anlamsal olarak anlamsız öğeler eklemenizi gerektirmediği için tercih edilir, ancak overflowgörünür olması gereken zamanlar vardır, bu durumda bir temizleme öğesi eklemek kabul edilenden daha fazladır .


3

Onun div şamandıra yüzünden. overflow: hiddenDış elemana ekleyin .

<div style="overflow:hidden; margin:0 auto;width: 960px; min-height: 100px; background-color:orange;">
    <div style="width:500px; height:200px; background-color:black; float:right">
    </div>
</div>

gösteri


3

Kayan öğeler olduğunda tarayıcıların öğeleri nasıl oluşturduğunu karıştırırsınız. Bir blok öğesi yüzüyorsa (sizin durumunuzdaki iç bölmeniz), tarayıcı web sayfasının normal akışından kayan öğeleri kaldırdığı için diğer blok öğeleri bunu yok sayar. Sonra, yüzen div normal akıştan çıkarıldığı için, iç div orada olmadığı gibi, dış div doldurulur. Ancak, satır içi öğeler (resimler, bağlantılar, metin, kara tırnaklar) kayan öğenin sınırlarına saygı gösterir. Dış div içine metin eklerseniz, metin iç div çevresine yerleştirilir.

Başka bir deyişle, blok elemanları (başlıklar, paragraflar, div'ler vb.) Kayan elemanları yok sayar ve doldurur ve satır içi elemanlar (görüntüler, bağlantılar, metin vb.) Kayan elemanların sınırlarına saygı duyar.

Burada keman örneği

<body>
    <div style="float:right; background-color:blue;width:200px;min-height:400px;margin-right:20px">
           floating element
    </div>
    <h1 style="background-color:red;"> this is a big header</h1>
    <p style="background-color:green"> this is a parragraph with text and a big image. The text places arrounds the floating element. Because of the image is wider than space between paragrah and floating element places down the floating element. Try to make wider the viewport and see what happens :D
        <img src="http://2.bp.blogspot.com/_nKxzQGcCLtQ/TBYPAJ6xM4I/AAAAAAAAAC8/lG6XemOXosU/s1600/css.png">
     </p>

3
Metni vurgulamayın ve keman bağlantılarını paylaşmayın, bir dahaki sefere yanıtınızda posta kodları yayınlayın, çünkü keman bağlantısı ölmüşse, gelecekteki kullanıcı burada herhangi bir yardım almayacak ve cevabınızın hiçbir anlamı olmayacak
Bay Alien


1

kapsayıcıda gösterilecek herhangi bir div'ınız yoksa kapsayıcı div için taşma özelliğini kullanabilirsiniz; örneğin:

<div class="cointainer">
    <div class="one">Content One</div>
    <div class="two">Content Two</div>
</div>

İşte aşağıdaki css:

.container{
    width:100%;/* As per your requirment */
    height:auto;
    float:left;
    overflow:hidden;
}
.one{
    width:200px;/* As per your requirment */
    height:auto;
    float:left;
}

.two{
    width:200px;/* As per your requirment */
    height:auto;
    float:left;
}

-----------------------VEYA-------------------------- ----

    <div class="cointainer">
        <div class="one">Content One</div>
        <div class="two">Content Two</div>
        <div class="clearfix"></div>
    </div>

İşte aşağıdaki css:

    .container{
        width:100%;/* As per your requirment */
        height:auto;
        float:left;
        overflow:hidden;
    }
    .one{
        width:200px;/* As per your requirment */
        height:auto;
        float:left;
    }

    .two{
        width:200px;/* As per your requirment */
        height:auto;
        float:left;
    }
    .clearfix:before,
    .clearfix:after{
        display: table;
        content: " ";
    }
    .clearfix:after{
        clear: both;
    }
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.