CSS kuralı “açık: her ikisi de” ne yapar?


293

Aşağıdaki CSS kuralı ne işe yarar:

.clear { clear: both; }

Ve neden kullanmamız gerekiyor?


22
CSS kullandığınızda floatve sağda veya solda değil, aşağıdaki sonraki öğeyi istediğinizde.
Riz

Öğe açık olarak kullanıldığında belirtilen bir öğenin solunda ve sağında yüzen öğelere izin verilmez: her ikisi de
JackXu

Yanıtlar:


687

Bu soru şamandıraların burada nasıl çalıştığını (ayrıntılı olarak) açıklamayacağım, çünkü bu soru genellikle neden kullanıyoruz clear: both;VEYA clear: both;tam olarak ne işe yarar ...

Bu cevabı basit ve noktaya saklayacağım ve size niçin clear: both;gerekli olduğunu veya ne yaptığını grafik olarak açıklayacağım ...

Genellikle tasarımcılar elemanları sağa veya sola kaydırır, bu da diğer tarafta boş alan yaratır ve bu da diğer elemanların kalan alanı kaplamasını sağlar.

Neden elementleri yüzüyorlar?

Tasarımcının yan yana 2 blok seviyeli elemanlara ihtiyacı olduğunda elemanlar yüzer. Örneğin, aşağıdaki gibi bir düzene sahip temel bir web sitesi tasarlamak istediğimizi varsayalım ...

resim açıklamasını buraya girin

Demo görüntüsünün canlı örneği .

Demo Kodu

Not: ekleyebilir gerekebilir header, footer, aside, section(ve diğer HTML5 öğeleri) olarakdisplay: block; açıkça elemanları blok seviyesi unsurlardır söz için stil.

Açıklama:

Temel bir düzen, 1 üstbilgi, 1 kenar çubuğu, 1 içerik alanı ve 1 altbilgim var.

Şamandıra yok header, daha sonra asideweb sitem kenar çubuğu için kullanacağım etiket geliyor , bu yüzden öğeyi sola kayarım.

Not: Varsayılan olarak, blok düzeyi öğesi belgeyi% 100 genişlik alır, ancak sola veya sağa kaydırıldığında, içerdiği içeriğe göre yeniden boyutlandırılır.

  1. Blok Seviye Elemanın Normal Davranışı
  2. Blok Seviye Elemanının Dalgalı Davranışı

Not ettiğiniz gibi, sol yüzen divalan boşluğu kullanılmamış olarak bırakır, bu da divsonradan kalan alanda kaymasına izin verir .

  1. divyüzer DEĞİLSE birbiri ardına render
  2. div sola veya sağa kayarsa yan yana kayar

Tamam, öyleyse blok seviyesi elemanları sola veya sağa doğru yüzerken böyle davranır, şimdi neden clear: both;gerekli ve neden?

Yani düzen demosunda not ederseniz - unutmanız durumunda, işte ..

Ben denilen bir sınıf kullanıyorum .clearve cleardeğeri ile denilen bir özellik tutar both. Öyleyse neden ihtiyacı olduğunu görelim both.

Ben yüzen asideve sectionsola elemanları, bu yüzden bir havuz var, burada headerkatı arazi, asideve sectionhavuzda yüzen ve altbilgi tekrar katı arazi, böyle bir şey var ..

Kayan Görünüm

Yani mavi suyun yüzen elemanların alanının ne olduğu hakkında hiçbir fikri yok, havuzdan daha büyük veya daha küçük olabilirler, bu yüzden burada CSS yeni başlayanların% 90'ını rahatsız eden ortak bir sorun geliyor: neden bir konteyner elemanının arka planı gerilmedi yüzen elemanları tutarken. Konteyner elemanının burada bir HAVUZ olması ve HAVUZ'un kaç nesnenin yüzdüğünü veya yüzen öğelerin uzunluğunun veya genişliğinin ne olduğunu bilmediği için, gerilmeyecektir.

  1. Dokümanın Normal Akışı
  2. Sola Kayan Bölümler
  3. Kabın Arka Plan Rengini Uzatmak İçin Yüzen Öğeler Temizlendi

( Bunu yapmak için düzgün bir yol için bu cevabın [Clearfix] bölümüne bakın . divAçıklama amacıyla bilerek boş bir örnek kullanıyorum )

Yukarıda 3 örnek verdim, 1'inci, redkapta yüzen nesneler olmadığı için arka planın beklendiği gibi oluşturulacağı normal belge akışıdır .

İkinci örnekte, nesne sola kayarken, konteyner elemanı (POOL) kayan elemanların boyutlarını bilemez ve bu nedenle kayan elemanların yüksekliğine uzanmaz.

resim açıklamasını buraya girin

Kullandıktan sonra clear: both;kap elemanı, yüzer eleman boyutlarına gerilecektir.

resim açıklamasını buraya girin

Başka bir neden clear: both; kullanılmasının bir elemanın kalan boşlukta yukarı kaymasını önlemektir.

Diyelim ki 2 eleman yan yana ve altlarında başka bir eleman ... Yani 2 elemanı sola yüzdüreceksin ve alt kısımlarını da altta istiyorsun.

  1. divsectionKalan sola doğru kayar ve kalan boşluğa geçer
  2. Süzülüyor divböylece temizlenmiş sectionetiketi süzülüyor aşağıda verecek divs

1. Örnek

resim açıklamasını buraya girin


2. Örnek

resim açıklamasını buraya girin

Son fakat en az değil, footeretiket, kayan öğelerden sonra , etiketlerimi clearbildirmeden önce sınıfı kullandığım için oluşturulacak footer, bu da tüm kayan öğelerin (sol / sağ) o noktaya kadar temizlenmesini sağlar.


Clearfix

Şamandıralarla ilgili düzeltmeye geliyor. @Elky tarafından daha önce belirtildiği gibi , bu şamandıraları temizleme şeklimiz bunu yapmanın temiz bir yolu divdeğildir, çünküdiv eleman . İşte burada düzeltme geliyor.

Üst öğeniz bitmeden sizin için boş bir öğe oluşturacak bir sanal öğe olarak düşünün. Bu, yüzen elemanları tutan sarma elemanınızı kendiliğinden temizleyecektir. Bu öğe DOM'nizde tam anlamıyla mevcut olmayacak, ancak işi yapacak.

Yüzen elemanlara sahip herhangi bir sargı elemanını kendi kendini temizlemek için kullanabiliriz

.wrapper_having_floated_elements:after {  /* Imaginary class name */
  content: "";
  clear: both;
  display: table;
}

Bunun :afteriçin benim tarafımdan kullanılan sahte öğeye dikkat edin class. Bu, sarma öğesi için kendisini kapatmadan hemen önce sanal bir öğe oluşturur. Dom'a bakarsak, Belge ağacında nasıl göründüğünü görebilirsiniz.

Clearfix

Görüyorsanız, yüzen çocuktan sonra, bunun diviçin de kullandığımız özelliğe sahip boş bir divelemana eşdeğer olmayan şamandıraları temizlediğimiz yerde render clear: both;edilir. Şimdi neden display: table;ve contentbu cevapların kapsamı dışındadır, ancak sözde öğe hakkında daha fazla bilgi edinebilirsiniz .

IE8 :aftersözde desteği desteklediğinden, bunun IE8'de de çalışacağını unutmayın .


Orijinal Yanıt:

Geliştiricilerin çoğu, içeriklerini sayfalarında sola veya sağa yüzer, muhtemelen logo, kenar çubuğu, içerik vb. Kalan alanda da yüzer, bu yüzden clear: both;kullanılmasını önlemek için sola veya sağa yüzen tüm elemanları temizler.

gösteri:

------------------ ----------------------------------
div1(Floated Left) Other div takes up the space here
------------------ ----------------------------------

Şimdi div1, aşağıdaki diğer div clear: both;işlemesini yapmak istiyorsanız , böylece tüm şamandıraları sola veya sağa temizlemenizi sağlayacak şekilde kullanırsınız.

------------------
div1(Floated Left)
------------------
<div style="clear: both;"><!--This <div> acts as a separator--></div>
----------------------------------
Other div renders here now
----------------------------------

3
Şamandıraları daha önce hiç duymadıysanız, önce şamandıralara bir giriş okumanızı öneririm - örneğin, bir sonraki cevaptaki bağlantıya bakın. Sonra geri dön ve bu cevabı oku - mantıklı olacak.
osa

37
Unutmayın, şamandıralar başlangıçta yan yana iki blok seviyesine sahip olmak için icat edilmedi , bu sadece yan etki! Orijinal amaç metnin görüntülere satır içinde akmasına izin vermekti, böylece görüntüleri her iki yönde de kaydırdınız.
Madara'nın Hayaleti

3
Sadece genel bir fikir edinmek için, bunu okumadan önce başvurmak için ilgili kısa cevap .. stackoverflow.com/questions/16568272/…
Bay Alien

@ mr-uzaylı İyi örnek Ancak söz konusu jsfiddle.net/N82UD/1 eleman akışı takip etmiyor ekrana küçültmek, şamandıra ile bir problem var ve "temizlendi": jsfiddle.net/N82UD/138 It yüzer madde 2'nin yerini alıyor
Omar

1
@Carlo: Twitter Bootstrap gibi şablonlarda çok kullanılan bir alternatif; koymaktır display: inline-blockBir öğeyi ve ebeveyn üzerinde kullanabileceğiniz text-align: left, text-align: centerya text-align: rightörneğin.
Daan

39

clearÖzelliği, bir elemanın sağdan sola, ya da her iki tarafında aynı blok biçimlendirme kapsamında daha önce yüzen elemanlara bitişik olamaz gösterir. Temizlenen elemanlar karşılık gelen yüzen elemanların altına itilir. Örnekler:

clear: none; Eleman yüzen elemanlara bitişik kalır

clear: left; Sol yüzen elemanların altına itilen eleman

clear: right; Sağ kayan elemanların altına itilen eleman

clear: both; Yüzen tüm elemanların altına itilen eleman

clear geçerli blok biçimlendirme bağlamının dışındaki kaydırmaları etkilemez


1
Mükemmel. Bu en iyi cevap. Acaba başka bir cevabın neden kabul edildiğini.
sawa

display: inline-block;Bu senaryodan css özelliğini kaldırırsak ne olur ? inline-blockÜst öğeyi sınıfı olan kardeş öğesine gerer float-left. Bu da "açık, geçerli blok biçimlendirme bağlamı dışındaki kayan noktaları etkilemez" deyimini yanlış yapar. Birisi açıklayabilir mi lütfen?
Sashrika Waidyarathna

@SashrikaWaidyarathna: bir üst öğe mutlaka çocukları için bir blok biçimlendirme bağlamı oluşturmaz. Örneğinizde (a) kaldırma display: inline-block, artık bir blok biçimlendirme bağlamı (b) o öğenin içindeki yüzer / temizler oluşturmaz ve ilk şamandıra aynı blok biçimlendirme bağlamının (görünüm alanı) bir parçası haline gelir.
Salman A

@SalmanA, css şartnamesine atıfta bulunan açıklama için teşekkürler. Blok biçimlendirme bağlamının tanımının farkında değildim.
Sashrika Waidyarathna

2
Sundar Pichai doppelganger?
Manoj Kumar


13

Bay Alien'in cevabı mükemmel, ama yine de kullanmanızı tavsiye etmiyorum <div class="clear"></div>çünkü sadece işaretlemenizi kirleten bir hack. Bu, divkötü yapı ve anlamsal açıdan işe yaramaz , kodunuzu esnek hale getirmez. Bazı tarayıcılarda bu div ek yüksekliğe neden olur ve height: 0;hangisini daha da kötüye eklemeniz gerekir . Ancak gerçek sorunlar, yüzen öğelerinize arka plan veya kenarlık eklemek istediğinizde başlar - web kötü tasarlandığı için çökecek . Kayan öğeleri clearfix CSS kuralı olan kaba sarmanızı öneririm . Bu da kesmek, ama güzel, kullanımı daha esnek ve insan ve SEO robotları için okunabilir.


Bu diğer gönderi hakkında daha fazla bilgi var clearfix: stackoverflow.com/questions/211383/…
Bill Hoag

2

Bir öğenin diğer öğenin altına yerleştirilmesini istediğinizde bu kodu CSS'de kullanırsınız. Şamandıralar için kullanılır.

İçeriği yüzerseniz sola veya sağa yüzebilirsiniz ... yani ortak bir düzende sol gezinme bölmesi, içerik bölmesi ve altbilgi olabilir.

Altbilginin bu yüzenlerin her ikisinin altında kalmasını sağlamak için (sağa ve sola yüzdüyseniz), altbilgiyi şu şekilde koyarsınız clear: both.

Bu şekilde her iki şamandıranın altında kalacaktır.

(Sadece sola temizliyorsanız, sadece gerçekten yapmanız gerekir clear: left;.)

Bu eğiticiyi gözden geçirin:


3
Ne öğretici?
Peter Mortensen
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.