Saya memiliki masalah kuno div
pembungkus tata letak dua kolom. Bilah sisi saya melayang, jadi wadah saya div
gagal membungkus konten dan bilah sisi.
<div id="container">
<div id="content"></div>
<div id="sidebar"></div>
</div>
Tampaknya ada banyak metode untuk memperbaiki bug yang jelas di Firefox:
<br clear="all"/>
overflow:auto
overflow:hidden
Dalam situasi saya, satu-satunya yang tampaknya berfungsi dengan benar adalah <br clear="all"/>
solusinya, yang sedikit berantakan. overflow:auto
memberi saya scrollbar jahat, dan overflow:hidden
pasti memiliki efek samping. IE7 juga seharusnya tidak menderita masalah ini karena perilakunya yang salah, tetapi dalam situasi saya ini sama dengan Firefox.
Metode apa yang saat ini tersedia bagi kita yang paling kuat?
Jawaban:
Bergantung pada desain yang diproduksi, masing-masing solusi CSS clearfix di bawah ini memiliki manfaatnya sendiri.
Clearfix memang memiliki aplikasi yang bermanfaat tetapi juga telah digunakan sebagai peretasan. Sebelum Anda menggunakan perbaikan yang jelas mungkin solusi css modern ini dapat bermanfaat:
Solusi Clearfix Modern
Wadah dengan
overflow: auto;
Cara paling sederhana untuk menghapus elemen melayang adalah menggunakan gaya
overflow: auto
pada elemen yang mengandung. Solusi ini berfungsi di setiap browser modern.Satu kelemahan, menggunakan kombinasi margin dan bantalan tertentu pada elemen eksternal dapat menyebabkan bilah gulir muncul tetapi ini dapat diselesaikan dengan menempatkan margin dan bantalan pada elemen induk yang mengandung lainnya.
Menggunakan 'overflow: hidden' juga merupakan solusi perbaikan yang jelas, tetapi tidak akan memiliki scrollbar, namun menggunakan
hidden
akan memotong konten yang diposisikan di luar elemen yang mengandung.Catatan: Elemen apung adalah
img
tag dalam contoh ini, tetapi bisa berupa elemen html apa pun.Clearfix Reloaded
Thierry Koblentz di CSSMojo menulis: Clearfix terbaru dimuat ulang . Dia mencatat bahwa dengan menjatuhkan dukungan untuk oldIE, solusinya dapat disederhanakan menjadi satu pernyataan css. Selain itu, menggunakan
display: block
(bukandisplay: table
) memungkinkan margin untuk runtuh dengan benar ketika elemen dengan clearfix bersaudara.Ini adalah versi clearfix paling modern.
⋮
⋮
Solusi Clearfix Lama
Solusi di bawah ini tidak diperlukan untuk peramban modern, tetapi mungkin bermanfaat untuk menargetkan peramban lama.
Perhatikan bahwa solusi ini bergantung pada bug browser dan karenanya hanya boleh digunakan jika tidak ada solusi di atas yang berfungsi untuk Anda.
Mereka terdaftar kira-kira dalam urutan kronologis.
"Beat That ClearFix", sebuah perbaikan yang jelas untuk browser modern
Thierry Koblentz dari CSS Mojo telah menunjukkan bahwa ketika menargetkan browser modern, kita sekarang dapat menghapus
zoom
dan::before
properti / nilai dan hanya menggunakan:Solusi ini tidak mendukung untuk IE 6/7 ... sengaja!
Thierry juga menawarkan: " Sebuah peringatan : jika Anda memulai proyek baru dari awal, lakukan saja, tetapi jangan menukar teknik ini dengan yang Anda miliki sekarang, karena meskipun Anda tidak mendukung oldIE, aturan Anda yang ada mencegah margin yang runtuh. "
Micro Clearfix
Solusi clearfix terbaru dan diadopsi secara global, the Micro Clearfix oleh Nicolas Gallagher .
Dukungan yang dikenal: Firefox 3.5+, Safari 4+, Chrome, Opera 9+, IE 6+
Properti Melimpah
Metode dasar ini lebih disukai untuk kasus biasa, ketika konten yang diposisikan tidak akan ditampilkan di luar batas wadah.
http://www.quirksmode.org/css/clearing.html - menjelaskan cara mengatasi masalah umum yang terkait dengan teknik ini, yaitu pengaturan
width: 100%
pada wadah.Daripada menggunakan
display
properti untuk menetapkan "hasLayout" untuk IE, properti lain dapat digunakan untuk memicu "hasLayout" untuk suatu elemen .Cara lain untuk menghapus float menggunakan
overflow
properti adalah dengan menggunakan underscore hack . IE akan menerapkan nilai yang diawali dengan garis bawah, browser lain tidak. Thezoom
properti memicu hasLayout di IE:Meskipun ini berfungsi ... tidak ideal untuk menggunakan peretasan.
PIE: Metode Kliring Mudah
Metode "Kliring Mudah" yang lebih tua ini memiliki keuntungan memungkinkan elemen yang diposisikan untuk menggantung di luar batas wadah, dengan mengorbankan CSS yang lebih rumit.
Solusi ini cukup lama, tetapi Anda dapat mempelajari semua tentang Kliring Mudah pada Posisi Is Everything: http://www.positioniseverything.net/easyclearing.html
Elemen menggunakan properti "jelas"
Solusi cepat dan kotor (dengan beberapa kekurangan) ketika Anda dengan cepat menampar sesuatu bersama:
Kekurangannya
<br style="clear: both" />
tag yang berserakan di sekitar markup.sumber
overflow: hidden
atauoverflow: auto
tidak menghapus mengapung (mengkategorikannya sebagai "clearfix" adalah keliru); alih-alih itu menyebabkan elemen untuk membuat konteks pemformatan baru di mana float dapat dimasukkan. Hal ini menyebabkan wadah untuk meregang ke ketinggian mengapung untuk menampungnya. Tidak ada izin yang terlibat - yang dikatakan, Anda masih dapat memilih untuk menghapus, atau tidak menghapus, mengapung di dalam wadah tergantung pada tata letak Anda.Masalah apa yang kita coba selesaikan?
Ada dua pertimbangan penting saat mengapung:
Mengandung pelampung keturunan. Ini berarti bahwa elemen yang dimaksud membuat dirinya cukup tinggi untuk membungkus semua keturunan yang mengambang. (Mereka tidak nongkrong di luar.)
Keturunan isolasi dari mengapung luar. Ini berarti bahwa keturunan di dalam suatu elemen harus dapat menggunakan
clear: both
dan membuatnya tidak berinteraksi dengan pelampung di luar elemen.Blokir konteks pemformatan
Hanya ada satu cara untuk melakukan keduanya. Dan itu adalah untuk membangun konteks format blok baru . Elemen yang membentuk konteks pemformatan blok adalah persegi panjang terisolasi di mana mengapung berinteraksi satu sama lain. Konteks pemformatan blok akan selalu cukup tinggi untuk secara visual membungkus keturunannya yang mengambang, dan tidak ada pelampung di luar konteks pemformatan blok yang dapat berinteraksi dengan elemen di dalamnya. Insulasi dua arah ini persis seperti yang Anda inginkan. Di IE, konsep yang sama ini disebut hasLayout , yang dapat diatur melalui
zoom: 1
.Ada beberapa cara untuk membangun konteks pemformatan blok, tetapi solusi yang saya sarankan adalah
display: inline-block
denganwidth: 100%
. (Tentu saja, ada peringatan biasa dengan menggunakanwidth: 100%
, sehingga penggunaanbox-sizing: border-box
atau putpadding
,margin
danborder
pada elemen yang berbeda.)Solusi paling kuat
Mungkin aplikasi float yang paling umum adalah tata letak dua kolom. (Dapat diperpanjang hingga tiga kolom.)
Pertama struktur markup.
Dan sekarang CSS.
Cobalah sendiri
Pergi ke Bin JS untuk bermain-main dengan kode dan melihat bagaimana solusi ini dibangun dari bawah ke atas.
Metode clearfix tradisional dianggap berbahaya
Masalah dengan solusi clearfix tradisional adalah bahwa mereka menggunakan dua konsep rendering berbeda untuk mencapai tujuan yang sama untuk IE dan orang lain. Di IE mereka menggunakan hasLayout untuk membangun konteks pemformatan blok baru, tetapi untuk semua orang mereka menggunakan kotak yang dihasilkan ( ) dengan , yang tidak membangun konteks pemformatan blok baru. Ini berarti segala sesuatu tidak akan berlaku sama dalam semua situasi. Untuk penjelasan mengapa ini buruk, lihat Semua yang Anda Ketahui tentang Clearfix salah .
:after
clear: both
sumber
width: 100%
"? Juga, apakah Anda menyarankan untuk menggunakanzoom: 1
¶1 dari §2?overflow: hidden
, konsep rendering apa yang dimunculkan? Dan bagaimana bisa berbedahasLayout
?position: absolute
, maka itu baik-baik saja dan akan menjadi bagian dari konsep rendering yang sama?overflow: hidden
memaksakan hal yang berbeda dengan apa yang hasLayout lakukan?hasLayout
di stackoverflow.com/questions/1794350/what-is-haslayout . Saya menganggapnya identik dengan membangun konteks pemformatan blok baru. Elemen yang melakukan ini pada dasarnya bertanggung jawab atas tata letak semua elemen turunannya. Salah satu hasil dari hal ini adalah bahwa elemen yang membentuk konteks pemformatan blok baru mengandung keturunan mengambang dan mengapung di luar elemen tidak berinteraksi denganclear: left|right|both
elemen di dalamnya. (Ini dalam jawaban di atas.)Standar baru, seperti yang digunakan oleh Inuit.css dan Bourbon - dua kerangka kerja CSS / Sass yang sangat banyak digunakan dan dipelihara dengan baik:
Catatan
Perlu diingat bahwa clearfix pada dasarnya adalah peretasan untuk tata letak flexbox yang sekarang dapat menyediakan dengan cara yang jauh lebih cerdas . CSS float pada awalnya dirancang untuk konten inline mengalir - seperti gambar dalam artikel tekstual yang panjang - dan bukan untuk tata letak kotak dan sejenisnya. Jika browser target Anda mendukung flexbox , ada baiknya melihat.
Ini tidak mendukung IE7. Anda seharusnya tidak mendukung IE7. Melakukan hal itu terus mengekspos pengguna untuk eksploitasi keamanan yang tidak tetap dan membuat hidup lebih sulit untuk semua pengembang web lainnya, karena hal itu mengurangi tekanan pada pengguna dan organisasi untuk beralih ke browser modern.
Clearfix ini diumumkan dan dijelaskan oleh Thierry Koblentz pada bulan Juli 2012. Ini menghilangkan bobot yang tidak perlu dari mikro-clearfix 2011 milik Nicolas Gallagher . Dalam prosesnya, ia membebaskan elemen pseudo untuk Anda gunakan sendiri. Ini telah diperbarui untuk digunakan
display: block
daripadadisplay: table
(sekali lagi, kredit ke Thierry Koblentz).sumber
Saya sarankan menggunakan yang berikut ini, yang diambil dari http://html5boilerplate.com/
sumber
Properti overflow dapat digunakan untuk menghapus float tanpa mark-up tambahan:
Ini berfungsi untuk semua browser kecuali IE6, di mana yang perlu Anda lakukan adalah mengaktifkan hasLayout (tampilannya adalah metode pilihan saya):
http://www.quirksmode.org/css/clearing.html
sumber
overflow:hidden
memiliki efek kliping konten; ia memiliki efek samping membersihkan wadah ;-)Saya telah menemukan bug di CLEARFIX-Method resmi: DOT tidak memiliki ukuran font. Dan jika Anda mengatur
height = 0
dan Elemen pertama di DOM-Tree Anda memiliki kelas "clearfix" Anda akan selalu memiliki margin di bagian bawah halaman 12px :)Anda harus memperbaikinya seperti ini:
Ini sekarang bagian dari Tata Letak YAML ... Lihat saja - sangat menarik! http://www.yaml.de/en/home.html
sumber
Ini adalah solusi yang cukup rapi:
Dari http://nicolasgallagher.com/micro-clearfix-hack/
sumber
overflow: hidden
).Hapus perbaikan dari bootstrap:
sumber
Saya hanya menggunakan: -
Bekerja paling baik dan kompatibel dengan IE8 + :)
sumber
Mengingat besarnya jumlah balasan, saya tidak akan memposting. Namun, metode ini dapat membantu seseorang, karena memang membantu saya.
Tinggal jauh dari mengapung jika memungkinkan
Perlu disebutkan, saya menghindari mengapung seperti Ebola. Ada banyak alasan dan saya tidak sendirian; Baca jawaban Rikudo tentang apa itu clearfix dan Anda akan melihat apa yang saya maksud. Dengan kata-katanya sendiri:
...the use of floated elements for layout is getting more and more discouraged with the use of better alternatives...
Ada pilihan lain yang baik (dan kadang-kadang lebih baik) di luar sana selain mengapung. Seiring kemajuan teknologi dan peningkatan, flexbox (dan metode lainnya) akan diadopsi secara luas dan float hanya akan menjadi memori yang buruk. Mungkin sebuah CSS4?
Kesalahan perilaku mengambang dan gagal dihapus
Pertama, kadang-kadang, Anda mungkin berpikir bahwa Anda aman dari mengapung sampai penyelamat Anda tertusuk dan aliran html Anda mulai tenggelam:
Dalam codepen http://codepen.io/omarjuvera/pen/jEXBya bawah ini, praktik membersihkan float dengan
<div classs="clear"></div>
(atau elemen lain) adalah umum tetapi disukai dan anti-semantik.CSS
Namun , tepat ketika Anda berpikir pelampung Anda layak berlayar ... booming! Ketika ukuran layar menjadi lebih kecil dan lebih kecil Anda melihat perilaku aneh seperti gambar di bawah ini (Sama http://codepen.io/omarjuvera/pen/jEXBya ):
Kenapa kamu harus peduli? Saya tidak yakin dengan angka pasti tetapi sekitar 80% (atau lebih) dari perangkat yang digunakan adalah perangkat seluler dengan layar kecil. Komputer / laptop desktop bukan lagi raja.
Itu tidak berakhir di sana
Ini bukan satu-satunya masalah dengan mengapung. Ada banyak, tetapi dalam contoh ini, beberapa orang mungkin berkata
all you have to do is to place your floats in a container
. Tapi seperti yang Anda lihat di codepen dan grafik, itu tidak terjadi. Tampaknya membuat segalanya menjadi lebih buruk:HTML
CSS
Bagaimana hasilnya?
Itu sama!
Setidaknya Anda tahu, Anda akan memulai pesta CSS, mengundang semua jenis penyeleksi dan properti ke pesta; membuat kekacauan CSS Anda lebih besar dari yang Anda mulai. Hanya untuk memperbaiki kendaraan Anda.
CSS Clearfix untuk penyelamatan
Bagian sederhana dan sangat mudah beradaptasi dari CSS ini adalah keindahan dan "penyelamat":
Itu dia! Ini benar-benar berfungsi tanpa melanggar semantik dan apakah saya menyebutkan itu berhasil? :
Dari sampel yang sama ... HTML
CSS
Sekarang kita tidak perlu lagi
<div classs="clear"></div> <!-- Acts as a wall -->
dan membuat polisi semantik bahagia. Ini bukan satu-satunya manfaat. Clearfix ini responsif terhadap ukuran layar apa pun tanpa menggunakan@media
bentuk paling sederhana. Dengan kata lain, itu akan menjaga wadah mengapung Anda di cek dan mencegah banjir. Terakhir, ia menyediakan dukungan untuk browser lama semuanya dalam satu karate chop kecil =)Inilah perbaikan yang jelas lagi
sumber
clear
nama kelas tidak berfungsi adalah karena atribut Andaclass
salah. Apa yang Anda tulis adalahclasss
, dengan tambahans
.Saya selalu mengapung bagian utama dari kisi saya dan melamar
clear: both;
ke footer. Itu tidak memerlukan div atau kelas tambahan.sumber
secara jujur; semua solusi tampaknya merupakan peretasan untuk memperbaiki bug rendering ... apakah saya salah?
Saya telah menemukan
<br clear="all" />
yang paling mudah, paling sederhana. melihat diclass="clearfix"
mana - mana tidak dapat membuat orang sensibilitas yang keberatan dengan elemen markup asing, kan? Anda hanya melukis masalah di kanvas yang berbeda.saya juga menggunakan
display: hidden
solusi, yang hebat dan tidak memerlukan deklarasi kelas tambahan atau markup html ... tapi kadang-kadang Anda membutuhkan elemen untuk meluap wadah, misalnya. pita dan ikat pinggang yang cantiksumber
overflow: hidden
Saya pikir maksud Andasumber
Saya telah mencoba semua solusi ini, margin besar akan ditambahkan ke
<html>
elemen secara otomatis ketika saya menggunakan kode di bawah ini:Akhirnya, saya memecahkan masalah margin dengan menambahkan
font-size: 0;
CSS di atas.sumber
.
, gunakan sajacontent: ""
Dengan SASS, clearfix adalah:
dan digunakan seperti:
jika Anda menginginkan clearfix baru:
sumber
Dengan KURANG ( http://lesscss.org/ ), seseorang dapat membuat helper clearfix berguna:
Dan kemudian menggunakannya dengan wadah yang bermasalah, misalnya:
sumber
Menggunakan
overflow:hidden
/auto
dan tinggi untuk ie6 akan cukup jika wadah mengambang memiliki elemen induk.Salah satu dari #test dapat berfungsi, untuk HTML yang dinyatakan di bawah ini untuk menghapus float.
Dalam kasus ketika ini menolak untuk bekerja dengan ie6, hanya float induknya untuk menghapus float.
Belum pernah benar-benar membutuhkan jenis kliring lain. Mungkin itu cara saya menulis HTML.
sumber
Nilai tampilan baru tampaknya berfungsi dalam satu baris.
Dari spec W3: "Elemen menghasilkan kotak kontainer blok, dan menjabarkan isinya menggunakan tata letak aliran. Itu selalu membuat konteks format blok baru untuk isinya."
Informasi: https://www.w3.org/TR/css-display-3/#valdef-display-flow-root https://www.chromestatus.com/feature/5769454877147136
※ Seperti yang ditunjukkan pada tautan di atas, dukungan saat ini terbatas sehingga dukungan mundur seperti di bawah ini dapat digunakan: https://github.com/fliptheweb/postcss-flow-root
sumber
Saya akan mengapung
#content
juga, dengan cara itu kedua kolom berisi mengapung. Juga karena itu akan memungkinkan Anda untuk membersihkan elemen di dalamnya#content
tanpa membersihkan bilah samping.Hal yang sama dengan pembungkus, Anda harus menjadikannya konteks pemformatan blok untuk membungkus kedua kolom.
Artikel ini menyebutkan beberapa pemicu yang dapat Anda gunakan: blok konteks pemformatan .
sumber
Clearfix adalah cara elemen menghapus secara otomatis setelahnya, sehingga Anda tidak perlu menambahkan markup tambahan.
Biasanya Anda perlu melakukan sesuatu sebagai berikut:
Dengan clearfix, Anda hanya perlu
sumber
Mengapa hanya mencoba menggunakan hack css untuk melakukan apa yang dilakukan 1 baris HTML. Dan mengapa tidak menggunakan html semantik tu put break untuk kembali ke garis?
Untuk saya benar-benar lebih baik untuk digunakan:
Dan jika Anda tidak ingin gaya apapun dalam html Anda, Anda hanya perlu menggunakan kelas untuk istirahat Anda dan masukkan ke
.clear { clear:both; }
dalam CSS Anda.Keuntungan dari ini:
sumber
Dengan asumsi Anda menggunakan struktur HTML ini:
Inilah CSS yang akan saya gunakan:
Saya menggunakan set ini sepanjang waktu dan berfungsi dengan baik untuk saya, bahkan di IE6.
sumber
Tidak seperti perbaikan-perbaikan lainnya, berikut ini adalah open-ended tanpa wadah
Perbaikan-perbaikan lain baik mengharuskan elemen melayang berada dalam wadah yang ditandai dengan baik atau membutuhkan ekstra, kosong secara semantik
<div>
. Sebaliknya, pemisahan konten dan markup yang jelas membutuhkan solusi CSS yang ketat untuk masalah ini.Fakta bahwa seseorang perlu menandai akhir float, tidak memungkinkan untuk pengaturan huruf CSS tanpa pengawasan .
Jika yang terakhir adalah tujuan Anda, pelampung harus dibiarkan terbuka untuk apa saja (paragraf, daftar tertata dan tidak terurut dll) untuk membungkusnya, sampai "perbaikan jelas" ditemukan. Misalnya, clearfix mungkin diatur oleh tajuk baru.
Inilah mengapa saya menggunakan clearfix berikut dengan heading baru:
Solusi ini digunakan secara luas di situs web saya untuk menyelesaikan masalah: Teks di sebelah miniatur yang melayang pendek dan margin atas objek kliring berikutnya tidak dihormati.
Ini juga mencegah intervensi manual ketika secara otomatis menghasilkan PDF dari situs. Ini adalah halaman contoh .
sumber
Saya selalu menggunakan micro-clearfix :
Dalam Cascade Framework saya bahkan menerapkannya secara default pada elemen level blok. IMO, menerapkannya secara default pada elemen level blok memberikan elemen level blok perilaku yang lebih intuitif daripada perilaku tradisional mereka. Ini juga membuatnya lebih mudah bagi saya untuk menambahkan dukungan untuk browser lama ke Cascade Framework (yang mendukung IE6-8 dan juga browser modern).
sumber
Anda juga bisa memasukkan ini ke dalam CSS Anda:
Dan tambahkan kelas "cb" ke div induk Anda:
Anda tidak perlu menambahkan apa pun ke kode asli Anda ...
sumber
sumber
Sudahkah Anda mencoba ini:
Saya tidak punya masalah dengan metode ini.
sumber
<div/>
adalah X (HT) ML compliant, tetapi tidak kompatibel dengan HTML , jadi untuk dokumen yang dilayani karenatext/html
semua browser akan memperlakukannya sebagai tag tidak tertutup. Sayangnya, tidak ada tag penutup untuktext/html
dokumen, terlepas dari jenis dokumennya .Metode Favorit Saya adalah membuat kelas clearfix dalam dokumen css / scss saya seperti di bawah ini
Dan kemudian menyebutnya di dokumen html saya seperti yang ditunjukkan di bawah ini
sumber
Ini adalah clearfix yang sangat sederhana untuk menyelesaikan masalah ketika kita menggunakan properti float di dalam elemen div. Jika kita menggunakan dua elemen div, float: left; dan yang lainnya sebagai float: right; kita bisa menggunakan clearfix untuk induk dari dua elemen div. Jika kami menolak menggunakan clearfix, ruang yang tidak perlu diisi dengan konten di bawah ini dan struktur situs akan rusak.
sumber