Düzeltme nedir?


1003

Son zamanlarda bazı web sitelerinin kodlarına bakıyordum ve her birinin <div> bir sınıfı olduğunu gördüm clearfix.

Hızlı bir Google aramasından sonra, bazen IE6 için olduğunu öğrendim, ancak aslında bir düzeltme nedir?

Temizlenmemiş bir düzene kıyasla, temizlenmiş bir düzene ilişkin bazı örnekler verebilir misiniz?


65
IE 6 için değildir. Bir düzeltme div, yüzen çocuklarını kapsamak için a'nın uygun yüksekliğe tam olarak genişlemesini sağlar . webtoolkit.info/css-clearfix.html
Sparky

Yanıtlar:


983

IE9 veya daha düşük bir sürümü desteklemeniz gerekmiyorsa, flexbox'ı özgürce kullanabilirsiniz ve kayan düzenler kullanmanıza gerek yoktur.

Bugün, yerleşim için yüzer elemanların kullanımının daha iyi alternatiflerin kullanımı ile gittikçe daha cesaret kırıldığını belirtmek gerekir.

  • display: inline-block - Daha iyi
  • Flexbox - En İyi (ancak sınırlı tarayıcı desteği)

Flexbox, Firefox 18, Chrome 21, Opera 12.10 ve Internet Explorer 10, Safari 6.1 (Mobil Safari dahil) ve Android'in varsayılan tarayıcısı 4.4'ten desteklenmektedir.

Ayrıntılı bir tarayıcı listesi için bkz . Https://caniuse.com/flexbox .

(Belki de pozisyonu tamamen kurulduktan sonra, öğeleri döşemenin kesinlikle tavsiye edilen yolu olabilir.)


Bir düzeltme, bir öğenin alt öğelerini otomatik olarak temizlemesinin bir yoludur , böylece ek işaretleme eklemenize gerek kalmaz. Genellikle elemanların yatay olarak istiflenmesi için yüzer şamandıra düzenlerinde kullanılır .

Temizleme, kayan elemanlar için sıfır yükseklik konteyner sorunuyla mücadele etmenin bir yoludur

Bir temizleme aşağıdaki gibi yapılır:

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

Veya IE <8 desteğine ihtiyacınız yoksa, aşağıdakiler de iyidir:

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

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

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

Clearfix ile sadece aşağıdakilere ihtiyacınız vardır:

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

Bu makalede bunu okuyun - Chris Coyer @ CSS-Tricks tarafından


1
beyaz boşluk bir noktadan daha iyi bir uygulama ne olursa olsun, her iki şekilde de bazı tarayıcılarda nokta ile ilgili sorunlar vardı bu yüzden neden bahsetti :) küçük bir gelişme zarar vermez :)
Val

1
content: "\00A0";\ 00A0 beyaz bir alanı temsil eder, basit bir beyaz alan iyi çalışmaz :) üzgünüm. :)
Val

14
@MadaraUchiha, neden ekran: satır içi blok kayan elemanlardan daha iyi? Sahip olduğum tek sorun, satır içi blok ile görüntülemenin her zaman kolayca kontrol edilemeyen etiketler arasında boşluk olması ile ilgili sorunlara neden olmasıdır.
mowwwalker

2
@Kzqai: Bu nedenle flexbox, daha yaygın olarak desteklendiğinde tercih edilen seçenektir.
Madara'nın Hayaleti

11
Bu Katılmıyorum display: inline-blockblok tabanlı düzen için yüzen daha iyidir. Satır içi bloklar, adından da anlaşılacağı gibi, satır içi olarak düzenlenir - çoğu mizanpaj blok tabanlıdır ve bu blokların satır içi biçimlendirme bağlamında düzenlenmesi mantıklı değildir. Ayrıca, diğer öğelerin işaret ettiği gibi, öğeler arası boşluk, diğer satır içi öğeler, boyutlandırma, hizalama ve benzeri gibi satır içi biçimlendirme ile ilgili çeşitli sorunlarla da uğraşmanız gerekir. Şamandıra düzenleri de pek bir anlam ifade etmiyor, ancak en azından şamandıralar blok tabanlı olma avantajına sahip.
BoltClock

70

Diğer cevaplar doğrudur. Ama şunu eklemek istiyorum ki, insanların ilk olarak CSS öğrendikleri ve floattüm düzenlerini kötüye kullandıkları zamanın bir kalıntısı . floatuzun metnin yanında şamandıra görüntüleri gibi şeyler yapmak içindir, ancak birçok kişi bunu birincil düzen mekanizması olarak kullandı. Bunun için gerçekten amaçlanmadığı için, çalışması için "clearfix" gibi saldırılara ihtiyacınız var.

Bugünlerde display: inline-block(sağlam bir alternatiftir IE6 ve IE7 hariç daha modern tarayıcılar vb flexbox'a, ızgara düzeni gibi isimler altında daha da yararlı düzen mekanizmaları ile geliyor rağmen,)


1
Uygulamam şamandıra kullanmak için hiçbir sebep olmadığı sonucuna vardı. Ne zaman kullanırsanız kullanın şeylerin yarısı kırılır. Sadece bir div içinde büyülemek için bir şeylere ihtiyacım olduğunda kullanırım. Satır içi blok harika. Yeni kutu modeli harika. Böylece dikey hizaya gitmek için kesmek yok.
Muhammed Umer

50
inline-blockHTML'deki boşluk, blokları ayıran boşluk karakterlerine dönüştüğü bloklar arası boşluk sorunu nedeniyle kayan noktalar üzerinde katı bir gelişme değildir . kendi başına geçici çözümlerinline-block gerektirir , tıpkı clearfix gerektirir. float
Rory O'Kane

41

clearfixBir kap onun süzülüyor çocukları sarılmasına izin verir. Bir clearfixveya eşdeğer bir stil olmadan , bir kap yüzer çocuklarının etrafına sarılmaz ve yüzer çocukları tamamen konumlandırılmış gibi çöker.

Net düzeltmenin birkaç sürümü vardır, Nicolas Gallagher ve Thierry Koblentz anahtar yazarlar olarak.

Eski tarayıcılar için destek istiyorsanız, bu düzeltmeyi kullanmak en iyisidir:

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

.clearfix:after {
    clear: both;
}

.clearfix {
    *zoom: 1;
}

SCSS'de aşağıdaki tekniği kullanabilirsiniz:

%clearfix {
    &:before, &:after {
        content:" ";
        display:table;
    }

    &:after {
        clear:both;
    }

    & {
        *zoom:1;
    }
}

#clearfixedelement {
    @extend %clearfix;
}

Eski tarayıcıları desteklemeyi umursamıyorsanız, daha kısa bir sürüm vardır:

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

1
Güzel cevap John! Merak ettiğim şey neden açık bir divşekilde yüzen elemanları sararıyor? Görselleştirmeme yardım eder misin?
Alexander Suraphel

@AlexanderSuraphel: Bu cevap ayrıntılı olarak açıklıyor -> stackoverflow.com/questions/12871710/…
John Slegers

16

2017 yılının 2. çeyreğinde durum hakkında bir güncelleme sunmak.

Firefox 53, Chrome 58 ve Opera 45'te yeni bir CSS3 görüntüleme özelliği bulunmaktadır .

.clearfix {
   display: flow-root;
}

Herhangi bir tarayıcının kullanılabilirliğini buradan kontrol edin: http://caniuse.com/#feat=flow-root

(Display özelliği flow-root olarak ayarlanmış) öğ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.

Yani, bir veya birkaç yüzen çocuk içeren bir üst div kullanırsanız, bu özellik üst öğenin tüm çocuklarını kapsadığından emin olur. Herhangi bir temizleme düzeltmesine gerek kalmadan. Herhangi bir çocukta, hatta son bir kukla öğede (daha önce son çocuklarda olan clearfix varyantını kullanıyorsanız).

.container {
  display: flow-root;
  background-color: Gainsboro;
}

.item {
  border: 1px solid Black;
  float: left;
}

.item1 {  
  height: 120px;
  width: 120px;
}

.item2 {  
  height: 80px;
  width: 140px;
  float: right;
}

.item3 {  
  height: 160px;
  width: 110px;
}
<div class="container">
  This container box encloses all of its floating children.
  <div class="item item1">Floating box 1</div>
  <div class="item item2">Floating box 2</div> 
  <div class="item item3">Floating box 3</div>  
</div>


1
Bunun soru ile ilgili ne yaptığını anlatabilir misiniz?
1.21 gigawatts

Clearfix, akıllı hackleri kullanarak ebeveyn akışını etkilemeyen yüzen çocukları flow-rootgerçek çözümdür.
mystrdat

11

Basitçe söylemek gerekirse, clearfix bir hack'tir .

Yüzen çocuk elemanlarının ebeveynlerini taşmamasını sağlamanın tek makul yolu olduğu için hepimizin yaşaması gereken çirkin şeylerden biridir. Orada başka düzen şemaları var ama yüzen web tasarım / geliştirme bugün clearfix kesmek değerini göz ardı etmek için çok yaygın.

Ben şahsen Micro Clearfix çözümüne (Nicolas Gallagher) yaslandım

.container:before,
.container:after {
  content:"";
  display:table;
}
.container:after {
  clear:both;
}
.container {
  zoom:1; /* For IE 6/7 (trigger hasLayout) */
}

referans


5

CSS float tabanlı mizanpajlarda yaygın olarak kullanılan bir teknik, kayan elemanlar içereceğini bildiğiniz bir öğeye bir avuç CSS özelliği atamaktır. Yaygın olarak adlandırılan bir sınıf tanımı kullanılarak uygulanan teknik clearfix(genellikle) aşağıdaki CSS davranışlarını uygular:

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

Bu birleşik davranışların amacı :after, aktif elemanı tek bir 'içeren' bir kap oluşturmaktır . önceden var olan tüm kayan reklamları temizleyecek ve bir sonraki içerik için sayfayı etkili bir şekilde sıfırlayacak gizli olarak işaretlenmiştir.


2

Bir temizleme elde etmek için diğer (ve belki de en basit) seçenek overflow:hidden;içeren öğede kullanmaktır. Örneğin

.parent {
  background: red;
  overflow: hidden;
}
.segment-a {
  float: left;
}
.segment-b {
  float: right;
}
<div class="parent">
  <div class="segment-a">
    Float left
  </div>
  <div class="segment-b">
    Float right
  </div>
</div>

Tabii ki bu sadece içeriğin asla taşmasını istemediğiniz durumlarda kullanılabilir.


1

Kabul edilen cevabı denedim ancak içerik hizalama ile ilgili hala bir sorunum vardı. Aşağıda gösterildiği gibi ": önce" seçicisinin eklenmesi sorunu çözdü:

// LESS HELPER
.clearfix()
{
    &:after, &:before{
       content: " "; /* Older browser do not support empty content */
       visibility: hidden;
       display: block;
       height: 0;
       clear: both;
    }
}

Yukarıdaki LESS, aşağıdaki CSS ile derlenecektir:

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

0

Farklı bir yöntem aynı şey ama biraz farklı

fark, \00A0== ile değiştirilen içerik noktasıdırwhitespace

Bu http://www.jqui.net/tips-tricks/css-clearfix/ hakkında daha fazla bilgi

.clearfix:after { content: "\00A0"; display: block; clear: both; visibility: hidden; line-height: 0; height: 0;}
.clearfix{ display: inline-block;}
html[xmlns] .clearfix { display: block;}
* html .clearfix{ height: 1%;}
.clearfix {display: block}

İşte bunun kompakt bir versiyonu ...

.clearfix:after { content: "\00A0"; display: block; clear: both; visibility: hidden; line-height: 0; height: 0;width:0;font-size: 0px}.clearfix{ display: inline-block;}html[xmlns] .clearfix { display: block;}* html .clearfix{ height: 1%;}.clearfix {display: block}

Burada en az 3 örnekte kendinizi aşıyorsunuz. .clearfix {...}, html[xmlns] .clearfix {...}, * html .clearfix {...}Ve .clearfix {...}hepsi aynı şeyi seçmek ve birbirini geçersiz. Bu biraz acayip ve gerçekten gerekli değil.
ORyan

Bu CSS temizleme yönteminin eski sürümüdür, daha sonra öğrendiğim, "." [Nokta] çok can sıkıcı olduğunu ve bir boşluk ile değiştirildi css-tricks.com/snippets/css/clear-fix alınmıştır . , bu nedenle \00A0, bunun çapraz tarayıcı uyumluluğu ve zaman bilgisi nedeniyle olduğunu düşünüyorum.
Val
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.