Hangi 'clearfix' yöntemlerini kullanabilirim?


864

divİki sütunlu bir düzeni kaydırmada eski bir sorunum var . Kenar çubuğum yüzer, bu nedenle kabım diviçeriği ve kenar çubuğunu saramıyor.

<div id="container">
  <div id="content"></div>
  <div id="sidebar"></div>
</div>

Firefox'taki açık hatayı düzeltmek için çok sayıda yöntem var gibi görünüyor:

  • <br clear="all"/>
  • overflow:auto
  • overflow:hidden

Benim durumumda, düzgün çalışıyor gibi görünen tek <br clear="all"/>çözüm biraz kirli. overflow:autobana kötü kaydırma çubukları verir ve overflow:hiddenkesinlikle yan etkileri olmalı. Ayrıca, IE7 görünüşe göre yanlış davranışı nedeniyle bu sorundan muzdarip olmamalı, ancak benim durumumda Firefox ile aynı acı çekiyor.

Şu anda mevcut olan en güçlü yöntem hangisidir?


1
Ben jqui.net/tips-tricks/css-clearfix kullanıyorum nokta gizlemek yardımcı olur :)
Val

1
IE 6 ve IE 7 ne olacak? Asla bir şeyleri temizlemenin doğru yolunu takip etmezler.
Praveen Kumar Purushothaman

Şimdi Modern üç satır Clearfix doğru cevabını revize şansı var mı, bir yıl olduğunu özetlenen burada büyük isim çerçeveler Bourbonlarla Inuit.css kullanılan? Bkz aşağıda Cevabımı .
iono

Yanıtlar:


1039

Üretilen tasarıma bağlı olarak, aşağıdaki açık CSS çözümlerinin her birinin kendi faydaları vardır.

Clearfix'in yararlı uygulamaları var, ancak bir saldırı olarak da kullanılıyor. Bir clearfix kullanmadan önce belki bu modern css çözümleri faydalı olabilir:


Modern Clearfix Çözümleri


Konteyner overflow: auto;

Kayan öğeleri temizlemenin en basit yolu overflow: auto, içeren öğenin stilini kullanmaktır . Bu çözüm tüm modern tarayıcılarda çalışır.

<div style="overflow: auto;">
  <img
    style="float: right;"
    src="path/to/floated-element.png"
    width="500"
    height="500"
  > 
  <p>Your content here…</p>
</div>

Dış öğe üzerinde belirli kenar boşluğu ve dolgu kombinasyonlarının kullanılması bir dezavantaj, kaydırma çubuklarının görünmesine neden olabilir, ancak bu, kenar boşluğu ve dolgu malzemesinin başka bir ebeveyn içeren öğeye yerleştirilmesiyle çözülebilir.

'Taşma: gizli' kullanmak da bir temizleme çözümüdür, ancak kaydırma çubukları olmayacaktır, ancak kullanımı hiddeniçeren öğenin dışında konumlandırılmış herhangi bir içeriği kırpacaktır .

Not: Kayan öğe imgbu örnekteki bir etikettir, ancak herhangi bir html öğesi olabilir.


Clearfix Yeniden Yüklendi

CSSMojo'daki Thierry Koblentz şunu yazdı: En son temizleme düzeltmesi yeniden yüklendi . EskiIE'ye destek bırakarak, çözümün bir css deyimiyle basitleştirilebileceğini belirtti. Ek olarak, display: block(yerine display: table) kullanılması , clearfix öğelerine kardeş olduğunda kenar boşluklarının düzgün bir şekilde daraltılmasına izin verir.

.container::after {
  content: "";
  display: block;
  clear: both;
}

Bu, düzeltmenin en modern sürümüdür.


Eski Clearfix Çözümleri

Aşağıdaki çözümler modern tarayıcılar için gerekli değildir, ancak eski tarayıcıları hedeflemek için yararlı olabilir.

Bu çözümlerin tarayıcı hatalarına bağlı olduğunu ve bu nedenle yalnızca yukarıdaki çözümlerin hiçbiri sizin için işe yaramadığında kullanılması gerektiğini unutmayın.

Kabaca kronolojik sırada listelenmiştir.


Modern tarayıcılar için bir düzeltme olan "Beat That ClearFix"

CSS Mojo'dan Thierry Koblentz ', modern tarayıcıları hedeflerken artık zoomve ::beforeözelliğini / değerlerini bırakabileceğimizi ve şunları kullanabileceğimizi belirtti:

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

Bu çözüm IE 6/7… 'yi bilerek desteklemez!

Thierry ayrıca şunları sunar: " Dikkatli bir kelime : sıfırdan yeni bir projeye başlarsanız, devam edin, ancak şu anda sahip olduğunuz teknikle bu tekniği değiştirmeyin, çünkü oldIE'yi desteklemeseniz bile, mevcut kurallarınız marjları daraltmak. "


Mikro Temizleme

En yeni ve küresel olarak benimsenen bir düzeltme çözümü olan Nicolas Gallagher tarafından üretilen Micro Clearfix .

Bilinen destek: Firefox 3.5+, Safari 4+, Chrome, Opera 9+, IE 6+

.container::before, .container::after {
  content: "";
  display: table;
}
.container::after {
  clear: both;
}
.container {
  zoom: 1;
}

Taşma Özelliği

Bu temel yöntem, konumlandırılmış içerik kabın sınırları dışında gösterilmeyeceği zamanki durum için tercih edilir.

http://www.quirksmode.org/css/clearing.html - bu teknikle ilgili sık karşılaşılan sorunların, yani width: 100%kapsayıcıda nasıl çözüleceğini açıklar .

.container {
  overflow: hidden;
  display: inline-block;
  display: block;
}

displayIE için "hasLayout" ayarlamak için özelliği kullanmak yerine , bir öğe için "hasLayout" u tetiklemek için diğer özellikler kullanılabilir .

.container {
  overflow: hidden;
  zoom: 1;
  display: block;
}

overflowÖzelliği kullanarak şamandıraları temizlemenin başka bir yolu , alt çizgi kesmek kullanmaktır . IE, alt çizgi ile önek değerleri uygular, diğer tarayıcılar uygulamaz. zoomMülkiyet tetikler hasLayout IE:

.container {
  overflow: hidden;
  _overflow: visible; /* for IE */
  _zoom: 1; /* for IE */
}

Bu çalışırken ... kesmek kullanmak ideal değildir.


PIE: Kolay Temizleme Yöntemi

Bu daha eski "Kolay Temizleme" yöntemi, konumlandırılmış elemanların daha zor CSS pahasına konteynerin sınırları dışına asılmasına izin verme avantajına sahiptir.

Bu çözüm oldukça eskidir, ancak Pozisyon Her Şeyde Kolay Temizleme hakkında her şeyi öğrenebilirsiniz: http://www.positioniseverything.net/easyclearing.html


"Clear" özelliğini kullanan öğe

Birlikte hızlıca tokat atmak için hızlı ve kirli çözüm (bazı dezavantajları olan):

<br style="clear: both" /> <!-- So dirty! -->

Dezavantajları

  • Duyarlı değildir ve bu nedenle düzen stilleri medya sorgularına göre değişirse istenen etkiyi sağlamayabilir. Saf CSS'de bir çözüm daha idealdir.
  • Herhangi bir anlamsal değer eklemeden html işaretlemesi ekler.
  • Css'de bir “clearfix” in tek bir çözümüne sınıf referansı ve html'de buna sınıf referansları yerine her örnek için satır içi tanım ve çözüm gerektirir.
  • Etrafında çalışmak için daha fazla kesmek yazmak zorunda kalabileceğinden, kod başkalarıyla birlikte çalışmayı zorlaştırır.
  • Gelecekte başka bir temizleme çözümüne ihtiyaç duyduğunuzda / kullanmak istediğinizde, geri dönüp <br style="clear: both" />işaretlemenin etrafında kalan her etiketi kaldırmanız gerekmeyecektir .

25
@David Rivers:: after yöntemi bir tarayıcıda ayrıştırma hatasından faydalanmadığı için bir hack değildir, çözüm olarak css özelliğini kullanır. Ayrıca: alt çizgi hack aksine, sonraki tarayıcılarda desteklenecektir. İdeal olarak, bir öğeye tüm içeriğini içermesine neden olacak bir css özelliği uygulanabilecektir.
Beau Smith

7
Arıza için teşekkürler. Ben bulmak: sonra "kolay temizleme" yöntemi "taşma: gizli" üstün, çünkü CSS3 kutu gölgeleri veya konumlandırılmış öğeleri kırpmaz. Ekstra kod satırları kesinlikle buna değer.
Aneon

7
Her iki çözümü de savunmuyorum: ama 'kirli' etiketlemenize katılmıyorum. 'Ağırlık / yük yavaşlatma ekleme' argümanı, ctm kodunun birkaç kısa satırına kıyasla (tarayıcınızın da yüklemesi gereken) 1 kısa satır html kodu olduğu için aptalca görünüyor. 'Anlamsal değer' argümanı için, açık bir br: Her ikisini de anlamak, aptal ateşli kadro css bir demet anlamaya çalışmaktan çok daha kolaydır. br clear: her ikisi de kısa ve basittir ve imho'nun 'profesyonellik' üzerinde hiçbir etkisi yoktur.
Vigrond

16
Genel kanının aksine, overflow: hiddenya overflow: auto( "Clearfix" bir yanlış isim olarak kategorize) değil açık yüzer; bunun yerine, bir öğenin içinde kayan noktaların içerilebileceği yeni bir biçimlendirme bağlamı oluşturmasına neden olur . Bu, kabın, bunları içermek için şamandıraların yüksekliğine gerilmesine neden olur. Herhangi bir açıklık yoktur - söylendiği gibi, düzeninize bağlı olarak konteynır içindeki şamandıraları temizlemeyi veya temizlemeyi seçebilirsiniz.
BoltClock

3
IE7'yi artık desteklememeliyiz. Lütfen bunu burada açıklanan üç satırlı yöntemle güncelleyin
iono

70

Hangi sorunları çözmeye çalışıyoruz?

Yüzen şeylerde iki önemli husus vardır:

  1. Torun float içerir. Bu, söz konusu öğenin kendisini tüm yüzen torunları sarmak için yeterince uzun hale getirdiği anlamına gelir. (Dışarıda takılmazlar.)

    Kapsayıcısının dışında asılı yüzen içerik

  2. Dış şamandıralardan izolasyon torunları. Bu, bir öğenin içindeki torunları kullanabilmeli clear: bothve öğenin dışındaki şamandıralarla etkileşime girmemelidir.

    <code> açık: her ikisi de </code> DOM'da başka bir yerde bir kayan nokta ile etkileşim

Blok biçimlendirme bağlamları

Her ikisini de yapmanın tek bir yolu var. Ve bu yeni bir blok biçimlendirme bağlamı oluşturmaktır . Blok formatlama bağlamı oluşturan elemanlar, şamandıraların birbirleriyle etkileştiği yalıtılmış bir dikdörtgendir. Bir blok biçimlendirme bağlamı, kayan torunlarını görsel olarak sarmak için her zaman yeterince uzun olacaktır ve bir blok biçimlendirme bağlamının dışında hiçbir yüzer içerideki öğelerle etkileşime giremez. Bu iki yönlü yalıtım tam olarak istediğiniz şeydir. IE'de, bu aynı kavram, üzerinden ayarlanabilen hasLayout olarak adlandırılır zoom: 1.

Orada bağlamı biçimlendirme bir blok kurmak için çeşitli yollar vardır, ama tavsiye çözümdür display: inline-blockile width: 100%. (Tabii ki, orada her zamanki uyarılar kullanarak width: 100%, kullanım yüzden box-sizing: border-boxya koymak padding, marginve borderfarklı bir eleman üzerinde.)

En sağlam çözüm

Muhtemelen şamandıraların en yaygın uygulaması iki sütunlu düzendir. (Üç sütuna genişletilebilir.)

İlk olarak işaretleme yapısı.

<div class="container">
  <div class="sidebar">
    sidebar<br/>sidebar<br/>sidebar
  </div>
  <div class="main">
    <div class="main-content">
      main content
      <span style="clear: both">
        main content that uses <code>clear: both</code>
      </span>
    </div>
  </div>
</div>

Ve şimdi CSS.

/* Should contain all floated and non-floated content, so it needs to
 * establish a new block formatting context without using overflow: hidden.
 */
.container {
  display: inline-block;
  width: 100%;
  zoom: 1; /* new block formatting context via hasLayout for IE 6/7 */
}

/* Fixed-width floated sidebar. */
.sidebar {
  float: left;
  width: 160px;
}

/* Needs to make space for the sidebar. */
.main {
  margin-left: 160px;
}

/* Establishes a new block formatting context to insulate descendants from
 * the floating sidebar. */
.main-content {
  display: inline-block;
  width: 100%;
  zoom: 1; /* new block formatting context via hasLayout for IE 6/7 */
}

Kendin dene

Kodla oynamak ve bu çözümün nasıl oluşturulduğunu görmek için JS Bin'e gidin .

Zararlı kabul edilen geleneksel temizleme yöntemleri

Geleneksel temizleme çözümleriyle ilgili sorun, IE ve diğer herkes için aynı hedefe ulaşmak için iki farklı oluşturma kavramı kullanmalarıdır. IE'de yeni bir blok biçimlendirme bağlamı oluşturmak için hasLayout'u kullanırlar, ancak herkes için yeni bir blok formatlama bağlamı oluşturmayan oluşturulmuş kutuları ( :after) kullanırlar clear: both. Bu, her durumda her şeyin aynı şekilde davranmayacağı anlamına gelir. Bunun neden kötü olduğuna ilişkin bir açıklama için bkz . Clearfix Hakkında Bildiğiniz Her Şey Yanlış .


"Kullanımdaki olağan uyarılar width: 100%" nedir? Ayrıca, zoom: 1§2'nin ¶1'inde kullanmayı öneriyor musunuz?
Baumr

İlginç bir cevap, ama ne hakkında overflow: hidden, bu hangi render kavramını çağırıyor? Ve bundan nasıl farklı olabilir hasLayout?
Baumr

Doğru, ama bir kişi kullanmaktan kaçınırsa position: absolute, o zaman iyi ve aynı oluşturma kavramının bir parçası olacak mı?
Baumr

Anlıyorum. Kavram overflow: hiddensunarak, hasLayout'un yaptıklarından farklı olan böyle bir şeyi uygulayıp uygulamadığını kastediyorum?
Baumr

2
Hakkında daha fazla bilgi hasLayoutiçin stackoverflow.com/questions/1794350/what-is-haslayout . Ben yeni bir blok biçimlendirme bağlamı kurmak ile eşanlamlı düşünüyorum. Bunu yapan elemanlar, temel olarak tüm torun elemanlarının düzeninden sorumludur. Bunun bir sonucu, yeni bir blok biçimlendirme bağlamı oluşturan öğelerin kayan torunları içerdiği ve elemanın dışındaki şamandıraların clear: left|right|bothiçindeki elemanlarla etkileşime girmemesidir . (Bu yukarıdaki cevapta.)
Chris Calo

54

Inuit.css ve Bourbon tarafından kullanılan yeni standart - çok yaygın kullanılan ve bakımlı iki CSS / Sass çerçevesi:

.btcf:after {
    content:"";
    display:block;
    clear:both;
}

notlar

Temizlemelerin aslında flexbox mizanpajlarının artık çok daha akıllı bir şekilde sağlayabileceği bir saldırı olduğunu unutmayın . CSS şamandıraları başlangıçta satır içi içeriğin uzun metinsel bir makaledeki görüntüler gibi akması için tasarlanmıştır ve ızgara düzenleri ve benzerleri için değil. Senin Eğer hedef tarayıcıları flexbox'a destekleyen , 's değerinde içine bakarak.

Bu IE7'yi desteklemez. Sen olmamalıdır IE7 destekleyeceğiz. Bunu yapmak, kullanıcıları sabit olmayan güvenlik açıklarına maruz bırakmaya devam eder ve diğer tüm web geliştiricileri için hayatı zorlaştırır, çünkü kullanıcılar ve kuruluşların modern tarayıcılara geçme baskısını azaltır.

Bu düzeltme, Temmuz 2012'de Thierry Koblentz tarafından açıklanmış ve açıklanmıştır . Nicolas Gallagher'ın 2011 mikro-berraklığından gereksiz ağırlık çıkarmaktadır . Bu süreçte, kendi kullanımınız için bir sözde elemanı serbest bırakır. Bu, (tekrar Thierry Koblentz'e verilen kredi) display: blockyerine kullanılmak üzere güncellendi display: table.


3
Umarım sana tamamen katıldığım için cevabın bu konuda daha fazla oy alır. Yine 2013 ve gerçekten insanların kullanması gereken çözüm olduğuna inanıyorum.
rafaelbiten

2
Kabul. theie7countdown.com Kendi analitiklerinizi kontrol edin ve umarım IE7'nin zamanınıza değmeyeceğini görün.
Justin

1
@ Justin kabul etti; kişisel analitikleriniz bunu ortaya koyacaktır. Geri sayım sitesinin bir süredir güncellendiğini sanmıyorum - dünya çapında IE7'yi % 0,39 yapan caniuse istatistiklerini kullanmak en iyisidir .
iono

1
İnşallah, temizleme gibi hack'ler yakında düzen için yüzerden ziyade flexbox kullanımı ile gereksiz hale getirilecek.
iono

IE7'yi istediğiniz kadar desteklemeye itiraz edebilirsiniz, ancak iş sonundan bu kullanıcıları desteklemek için bir gereksinim varsa (farklı nedenlerle - genellikle para), sorun hakkında ne hissederseniz hissedin
Kris Selbekk

27

Http://html5boilerplate.com/ adresinden alınan aşağıdakileri kullanmanızı öneririm.

/* >> The Magnificent CLEARFIX << */
.clearfix:after { 
  content: "."; 
  display: block; 
  height: 0; 
  clear: both; 
  visibility: hidden; 
}
.clearfix { 
  display: inline-block;  
}
* html .clearfix {  
  height: 1%;  
} /* Hides from IE-mac \*/
.clearfix {  
  display: block;  
}

8
IE-mac'i şimdi kim hatırlıyor? Daha alakalı olmayan sorunlar nedeniyle işleri neden bu kadar karmaşık hale getiriyoruz?
Ilya Streltsyn

23

Overflow özelliği, ek işaretleme olmadan şamandıraları temizlemek için kullanılabilir:

.container { overflow: hidden; }

Bu, tüm yapmanız gereken hasLayout'u etkinleştirmek olan IE6 dışındaki tüm tarayıcılar için geçerlidir (zoom benim tercih ettiğim yöntemdir):

.container { zoom: 1; }

http://www.quirksmode.org/css/clearing.html


3
taşma: gizli PS3 tarayıcısında çalışmaz. Çoğu insanın çalışması için buna ihtiyaç duymaz, ancak iş nedenleriyle hedeflemeye çalıştığımız PS3'te sitemi havaya uçurmak en önemli şeydir. Ugh.
gtd

1
Ve aslında belirli içeriğin kapsayıcı dışında kalmasını istiyorsanız bir sorun.
Simon East

taşma: gizli kırpma içeriği kötü bir yan etkisi vardır
Chris Calo

9
overflow:hiddeniçeriği kırpma etkisi vardır ; konteyneri temizlemenin yan etkisi vardır ;-)
Tamlyn

taşma: otomatik ayrıca bir blok biçimlendirme bağlamını tetikler ve içeriği kırpmaz.
Harry Robbins

17

Resmi CLEARFIX yönteminde bir hata buldum: DOT yazı tipi boyutu yok. Ve height = 0DOM-Tree'nizdeki ilk Öğeyi "clearfix" sınıfına ayarlarsanız, her zaman 12px sayfanın alt kısmında bir kenar boşluğu olur :)

Bunu şu şekilde düzeltmelisiniz:

/* float clearing for everyone else */
.clearfix:after{
  clear: both;
  content: ".";
  display: block;
  height: 0;
  visibility: hidden;
  font-size: 0;
}

Şimdi YAML-Layout'un bir parçası ... Sadece bir göz atın - çok ilginç! http://www.yaml.de/en/home.html


15

Bu oldukça düzenli bir çözüm:

/* For modern browsers */
.cf:before,
.cf:after {
    content:"";
    display:table;
}

.cf:after {
    clear:both;
}

/* For IE 6/7 (trigger hasLayout) */
.cf {
    zoom:1;
}

Firefox 3.5 ve üstü, Safari 4 ve üstü, Chrome, Opera 9 ve üstü, IE 6 ve üstü sürümlerde çalıştığı bilinmektedir.

Şunlar dahil: şamandıraları temizlemek için seçici önce gerekli değildir, ancak üst kenar boşluklarının modern tarayıcılarda çökmesini önler. Bu, zoom: 1 uygulandığında IE 6/7 ile görsel tutarlılığın olmasını sağlar.

Gönderen http://nicolasgallagher.com/micro-clearfix-hack/


1
Evet, 2011'in ortalarından itibaren bu benim en sevdiğim çözüm. Gerekirse nesneleri muhafaza kutusunun dışına yerleştirmenizi sağlar (kaçınarak overflow: hidden).
Simon East

10

Bootstrap'tan temizleme:

.clearfix {
  *zoom: 1;
}

.clearfix:before,
.clearfix:after {
  display: table;
  line-height: 0;
  content: "";
}

.clearfix:after {
  clear: both;
}

Bu hangi bootstrap sürümü?
Eric

8

Sadece kullanıyorum: -

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

IE8 + ile en iyi ve uyumlu çalışır :)


IE7'de çalışmaz, çünkü CSS sözde destekleri için desteği yoktur.
superluminary

4
... Bu yüzden "IE8 + ile uyumlu" dedi. Çoğu web sitesinin artık IE7'yi desteklemesi gerekmez, kullanımı dünya çapında% 1'den azdır. theie7countdown.com
Justin

8

Çok fazla cevap verildiği takdirde ben göndermeyecektim. Ancak, bu yöntem bana yardım ettiği gibi birine yardım edebilir.

Mümkün olduğunca yüzerlerden uzak durun

Bahsetmeye değer, Ebola gibi şamandıralardan kaçınırım. Bunun birçok nedeni var ve ben yalnız değilim; Netlik nedir ve ne demek istediğimi anlarsınız. Kendi sözleriyle:...the use of floated elements for layout is getting more and more discouraged with the use of better alternatives...

Şamandıralar dışında başka iyi (ve bazen daha iyi) seçenekler var. Teknoloji ilerledikçe ve geliştikçe, flexbox (ve diğer yöntemler) yaygın olarak benimsenecek ve şamandıralar sadece kötü bir hafıza haline gelecektir. Belki bir CSS4?


Kayan hatalı davranış ve başarısız silme işlemleri

Öncelikle, bazen, cankurtaran delinene ve html akışınız batmaya başlayana kadar şamandıralardan korunduğunuzu düşünebilirsiniz:

Aşağıdaki kod açıklamasında http://codepen.io/omarjuvera/pen/jEXBya kodlamasında , bir şamandıranın <div classs="clear"></div>(veya başka bir öğenin) temizlenmesi , yaygındır ancak kaşlarını çatmak ve anti-semantiktir.

<div class="floated">1st</div>
<div class="floated">2nd</div>
<div class="floated">3nd</div>
<div classs="clear"></div> <!-- Acts as a wall -->
<section>Below</section>

CSS

div {
    border: 1px solid #f00;
    width: 200px;
    height: 100px;
}

div.floated {
    float: left;
}

.clear {
    clear: both;
}
section {
    border: 1px solid #f0f;
}

Ancak , sadece şamandıra yelken layık olduğunu düşündüğünüzde ... patlama! Ekran boyutu küçüldükçe, aşağıdaki grafikte olduğu gibi garip davranışlar görürsünüz (Aynı http://codepen.io/omarjuvera/pen/jEXBya ):

şamandıra hata örneği 1

Neden umursasın ki? Tam rakamdan emin değilim, ancak kullanılan cihazların yaklaşık% 80'i (veya daha fazlası) küçük ekranlı mobil cihazlardır. Masaüstü bilgisayarlar / dizüstü bilgisayarlar artık kral değil.


Orada bitmiyor

Şamandıralardaki tek sorun bu değil. Çok var, ancak bu örnekte bazıları söylenebilir all you have to do is to place your floats in a container. Ancak kod alanında ve grafikte görebileceğiniz gibi , durum böyle değil. Görünüşe göre işleri daha da kötüleştirdi:

HTML

<div id="container" class="">
  <div class="floated">1st</div>
  <div class="floated">2nd</div>
  <div class="floated">3nd</div>
</div> <!-- /#conteiner -->
<div classs="clear"></div> <!-- Acts as a wall -->
<section>Below</section>

CSS

#container {
  min-height: 100px; /* To prevent it from collapsing */
  border: 1px solid #0f0;
}
.floated {
    float: left;
    border: 1px solid #f00;
    width: 200px;
    height: 100px;
}

.clear {
    clear: both;
}
section {
    border: 1px solid #f0f;
}

Sonuç gelince?

Aynısı! float bug örnek 2

En azından, her türlü seçiciyi ve mülkü partiye davet eden bir CSS partisine başlayacaksınız; CSS'nizle başladığınızdan daha büyük bir karmaşa yaratıyor. Sadece şamandıra düzeltmek için.


Kurtarmaya CSS Düzeltmesi

Bu basit ve çok uyarlanabilir CSS parçası bir güzellik ve bir "kurtarıcı":

.clearfix:before, .clearfix:after { 
    content: "";
    display: table;
    clear: both;
    zoom: 1; /* ie 6/7 */
}

Bu kadar! Anlambilimi bozmadan çalışır ve işe yaradığını söylemiş miydim ? :

Aynı örnekten ... HTML

<div class="clearfix">
    <div class="floated">1st</div>
    <div class="floated">2nd</div>
    <div class="floated">3nd</div>
</div>
<section>Below</section>

CSS

div.floated {
    float: left;
    border: 1px solid #f00;
    width: 200px;
    height: 100px;
}
section {
        border: 4px solid #00f;
}


.clearfix:before, .clearfix:after { 
    content: "";
    display: table;
    clear: both;
    zoom: 1; /* ie 6/7 */
}

Artık <div classs="clear"></div> <!-- Acts as a wall -->anlambilimsel polise ihtiyacımız yok ve onu mutlu tutuyoruz. Tek faydası bu değil. Bu düzeltme, @mediaen basit biçimini kullanmadan herhangi bir ekran boyutuna yanıt verir . Başka bir deyişle, şamandıra kabınızı kontrol altında tutacak ve selleri önleyecektir. Son olarak, küçük bir karate chop =) eski tarayıcılar için destek sağlar

İşte yine düzeltme

.clearfix:before, .clearfix:after { 
    content: "";
    display: table;
    clear: both;
    zoom: 1; /* ie 6/7 */
}

2
clearSınıf adına sahip öğenin çalışmamasının nedeni, özelliğinizin classyanlış olmasıdır. Yazdığınız şey classs, bir ek ile s.
kestane

Örneğiniz, hataları düzelttikten sonra bile iddia ettiğiniz şeyi göstermez.
Monica'yı eski durumuna getirme - notmaynard

7

Her zaman şebekemin ana bölümlerini yüzer clear: both;ve altbilgiye uygularım . Bu ekstra bir div veya sınıf gerektirmez.


Neil, sanırım sorun hem sütunlarınızın (ya da bir arka plan renginin / görüntüsünün) etrafında bir kenarlık istediğinizde geliyor, içeren kesmek gerektiren bir sarıcı bölümüne ihtiyacınız var.
Simon East

5

dürüst; tüm çözümler bir render hata düzeltmek için bir kesmek gibi görünüyor ... yanlış mı?

<br clear="all" />en kolay, en basit buldum . class="clearfix"her yerde görmek , yabancı işaretleme öğelerine itiraz eden birinin hassasiyetlerini inemez, değil mi? problemi sadece farklı bir tuval üzerinde boyarsınız.

ben de display: hiddenbüyük ve ekstra sınıf bildirimleri veya html işaretleme gerektirmeyen çözüm kullanın ... ama bazen örneğin, kap taşması için öğeleri gerekir. güzel şeritler ve kanatlar


5
overflow: hiddenSanırım demek istiyorsun
ajbeaven

Bazıları, işleri daha anlamsal hale getiren grup adı verilen sınıfı kullanmanızı önerir. Açıkçası bunun neden yakalanmadığından emin değilim
Damon

bu pozisyonu tamamen geri çekiyorum. Ben sadece şimdi clearfix kullanın. ama çok yaygın kaplarda, sınıf öznitelik kirliliğini azaltmak için css içine 'fırında'. Ayrıca, 'grup' adını vermek hoş görünüyor. yazmak için daha az karakter
duggi

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

4

Tüm bu çözümleri denedim, <html>aşağıdaki kodu kullandığımda öğeye otomatik olarak büyük bir marj eklenecek :

.clearfix:after {   
    visibility: hidden;   
    display: block;   
    content: ".";   
    clear: both;   
    height: 0;
}

Son olarak, font-size: 0;yukarıdaki CSS'ye ekleyerek marj problemini çözdüm.


2
Çünkü bir satır ekliyorsunuz ., sadece kullanıncontent: ""
Kırk

4

SASS ile, düzeltme şu şekildedir:

@mixin clearfix {
    &:before, &:after {
        content: '';
        display: table;
    }
    &:after {
        clear: both;
    }
    *zoom: 1;
}

ve şu şekilde kullanılır:

.container {
    @include clearfix;
}

yeni düzeltmeyi istiyorsanız:

@mixin newclearfix {
    &:after {
        content:"";
        display:table;
        clear:both;
    }
}

4

LESS ( http://lesscss.org/ ) ile kullanışlı bir temizleme yardımcısı oluşturulabilir:

.clearfix() {
  zoom: 1;
  &:before { 
    content: ''; 
    display: block; 
  }
  &:after { 
    content: ''; 
    display: table; 
    clear: both; 
  }
}

Ve sonra sorunlu kaplarla kullanın, örneğin:

<!-- HTML -->
<div id="container">
  <div id="content"></div>
  <div id="sidebar"></div>
</div>
/* LESS */
div#container {
  .clearfix();
}

4

overflow:hidden/ Kullanarakauto yüzer konteyner bir ebeveyn eleman varsa IE6 yeterli olacaktır için ve yüksekliğini.

Aşağıda belirtilen HTML'nin float'ları temizlemesi için #test'ten biri işe yarayabilir.

#test {
  overflow:hidden; // or auto;
  _height:1%; forces hasLayout in IE6
}

<div id="test">
  <div style="floatLeft"></div>
  <div style="random"></div>
</div>

Bunun ie6 ile çalışmayı reddettiği durumlarda, şamandırayı temizlemek için ebeveyni yüzdürün.

#test {
  float: left; // using float to clear float
  width: 99%;
}

Hiçbir zaman başka hiçbir takas işlemine gerçekten ihtiyaç duymadım. Belki de HTML kodumu yazma şeklim budur.


1
Herhangi bir öğeyi temizlemeden HTML yazma yolunuzu incelemek istiyorum. Bağlantı gönderebilir misiniz?
Starx

4

İşe bir satırda yeni bir görüntüleme değeri geliyor.

display: flow-root;

W3 spesifikasyonundan: "Öğe bir blok konteyner kutusu oluşturur ve içeriğini akış düzenini kullanarak düzenler. İçeriği için her zaman yeni bir blok biçimlendirme bağlamı oluşturur."

Bilgi: https://www.w3.org/TR/css-display-3/#valdef-display-flow-root https://www.chromestatus.com/feature/5769454877147136

※ Yukarıdaki bağlantıda gösterildiği gibi, destek şu anda sınırlıdır, bu nedenle aşağıdaki gibi yedek destek kullanımda olabilir: https://github.com/fliptheweb/postcss-flow-root


3

Ben #contentde yüzerdim, her iki sütun da yüzer. Ayrıca #content, yan çubuğu temizlemeden içindeki elemanları temizlemenizi sağlayacaktır.

Sarıcı ile aynı şey, iki sütunu sarmak için bunu bir blok biçimlendirme bağlamı yapmanız gerekir.

Bu makalede, kullanabileceğiniz birkaç tetikleyiciden bahsedilmektedir: blok biçimlendirme bağlamları .


3

Bir düzeltme, bir öğenin kendisinden sonra otomatik olarak temizlenmesinin bir yoludur, böylece ek işaretleme eklemenize gerek yoktur.

.clearfix:after {
   content: " "; /* Older browser do not support empty content */
   visibility: hidden;
   display: block;
   height: 0;
   clear: both;
}
.cleaner {
  clear: both;
}

Normalde aşağıdaki gibi bir şey yapmanız gerekir:

<div style="float: left;">Sidebar</div>
<div class="cleaner"></div> <!-- Clear the float -->

Clearfix ile, sadece

<div style="float: left;" class="clearfix">Sidebar</div>
<!-- No Clearing div! -->

2

Neden sadece 1 satır HTML iş yapmak için css kesmek kullanmaya çalışıyor. Ve neden semantik html tu put break satırına dönmek için kullanmıyorsunuz?

Benim için kullanmak gerçekten daha iyi:

<br style="clear:both" />

Ve html'nizde herhangi bir stil istemiyorsanız, mola ve sınıf için sınıf kullanmanız yeterlidir. .clear { clear:both; } yeterlidir.

Bunun avantajı:

  • Çizgiye dönmek için html'nin semantik kullanımı
  • CSS yükü yoksa çalışır
  • Ekstra CSS kodu ve Hack'e gerek yok
  • br'yi CSS ile simüle etmeye gerek yok, zaten HTML'de var

2

Bu HTML yapısını kullandığınızı varsayarsak:

<div id="container">
  <div id="content">
  </div>
  <div id="sidebar">
  </div>
</div>

İşte kullanacağım CSS:

div#container {
    overflow: hidden;    /* makes element contain floated child elements */
}

div#content, div#sidebar {
    float: left;
    display: inline;    /* preemptively fixes IE6 dobule-margin bug */
}

Bu seti her zaman kullanıyorum ve IE6'da bile benim için iyi çalışıyor.


2

Diğer düzeltmelerin aksine, burada kapları olmayan açık uçlu bir çözüm var

Diğer düzeltmeler, kayan öğenin iyi işaretlenmiş bir kapta olmasını veya fazladan, anlamsal olarak boş olmasını gerektirir <div>. Tersine, içeriğin ve işaretlemenin net bir şekilde ayrılması, bu soruna sıkı bir CSS çözümü gerektirir .

Bir kişinin bir kayan noktanın sonunu işaretlemesi gerektiği, katılımsız CSS dizgisine izin vermez .

Eğer ikincisi sizin hedefinizse, şamandıra "netleme" ile karşılaşılana kadar etrafına sarılabilecek herhangi bir şeye (paragraflar, sıralı ve sırasız listeler vb.) Açık bırakılmalıdır. Örneğin, düzeltme yeni bir başlık ile ayarlanabilir.

Bu nedenle yeni başlıklarda aşağıdaki düzeltmeyi kullanıyorum:

h1 {
    clear: both;
    display: inline-block;
    width: 100%;
}

Bu çözüm web sitemde yaygın olarak kullanılıyor , sorunu çözmek için : Kayan bir minyatürün yanındaki metin kısadır ve bir sonraki temizleme nesnesinin üst kenar boşluğuna saygı gösterilmez.

Ayrıca , siteden otomatik olarak PDF oluştururken manuel müdahaleleri de önler . İşte bir örnek sayfa .


2

Ben her zaman mikro-clearfix kullanın :

.cf:before,
.cf:after {
    content: " ";
    display: table;
}

.cf:after {
    clear: both;
}

/**
 * For IE 6/7 only
 */
.cf {
    *zoom: 1;
}

In Cascade Çerçeve I bile blok seviyesi elemanları varsayılan olarak uygulayın. IMO, varsayılan olarak blok düzeyi öğelerine uygulanması, blok düzeyi öğelerine traditonal davranışlarından daha sezgisel davranış kazandırır. Ayrıca Cascade Framework'e (IE6-8'in yanı sıra modern tarayıcıları da destekleyen) eski tarayıcılar için destek eklememi çok daha kolay hale getirdi.


0

Bunu CSS'nize de ekleyebilirsiniz:

.cb:after{
  visibility: hidden;
  display: block;
  content: ".";
  clear: both;
  height: 0;
}

*:first-child+html .cb{zoom: 1} /* for IE7 */

Ve ana div'inize "cb" sınıfı ekleyin:

<div id="container" class="cb">

Orijinal kodunuza başka bir şey eklemenize gerek yoktur ...


0

#content{float:left;}
#sidebar{float:left;}
.clear{clear:both; display:block; height:0px; width:0px; overflow:hidden;}
<div id="container">
  <div id="content">text 1 </div>
  <div id="sidebar">text 2</div>
  <div class="clear"></div>
</div>


-2

Bunu denedin mi:

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

Bu yöntemle ilgili herhangi bir sorun yaşamadım.


2
Bence bu çözümle hem ekstra işaretleme hem de satır içi stillerden kaçınmaya çalışıyoruz. Sanırım en mutlu olanı tehlikeye atıyor
Sam Murray-Sutton

1
Bu yöntemle ilgili sorun IE tarayıcılarında div'ın bir yüksekliğe sahip olmasıdır, bu nedenle aralığınız kapalı olacaktır. Bu nedenle css yöntemleri yükseklik ve yazı tipi boyutunu ayarlar.
zznq

XHTML uyumlu olması için uygun bir kapanış etiketi ile <div style = "clear: both"> </div> demeniz gerekir. Bunu yapmadığımda jQuery sorunları yaşadım
Simon_Weaver 12:03

1
İronik olarak, "sözde-to-kendinden kapalı olması" <div/> olduğunu X (HT) ML uyumlu, ancak HTML uyumlu değildir olarak görev belgeler için öylesine, text/htmlkapatılmamış etiketi olarak kabul ederiz tüm tarayıcılar. Ne yazık ki , doküman türünden bağımsız olarak,text/html belgeler için kendiliğinden kapanan etiketler gibi bir şey yoktur .
Ilya Streltsyn

-2

En Sevdiğim Yöntem css / scss belgemde aşağıdaki gibi bir düzeltme sınıfı oluşturmaktır

.clearfix{
    clear:both
}

Ve sonra aşağıda gösterildiği gibi benim html belgemde arayın

<html>
  <div class="div-number-one">
    Some Content before the clearfix
  </div>

  <!-- Let's say we need to clearfix Here between these two divs --->
  <div class="clearfix"></div>

  <div class="div-number-two">
    Some more content after the clearfix
  </div>
</html>

-2

Bu kadar basit bir düzeltme, div öğesinin içindeki float özelliklerini kullanırken sorunu giderir. Float olarak iki div öğesi kullanırsak: left; diğeri şamandıra olarak: doğru; iki div öğesinin üstü için clearfix'i kullanabiliriz. Clearfix gereksiz alanlarını kullanmayı reddedersek aşağıdaki içeriklerle doldurun ve site yapısı bozulacaktı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.