Apa yang aturan CSS “hapus: lakukan”?

293

Apa yang dilakukan aturan CSS berikut:

.clear { clear: both; }

Dan mengapa kita perlu menggunakannya?

Peter Mortensen
sumber
22
Saat Anda menggunakan CSS floatdan ingin elemen berikutnya di bawah, bukan di kanan atau kiri.
Riz
Tidak ada elemen apung yang diizinkan di sisi kiri dan kanan elemen yang ditentukan saat elemen digunakan dengan jelas: keduanya
JackXu 9'15

Jawaban:

687

Saya tidak akan menjelaskan bagaimana float bekerja di sini (secara rinci), karena pertanyaan ini umumnya berfokus pada Mengapa menggunakan clear: both;ATAU apa yang clear: both;sebenarnya dilakukan ...

Saya akan membuat jawaban ini sederhana, dan to the point, dan akan menjelaskan kepada Anda secara grafis mengapa clear: both;diperlukan atau apa fungsinya ...

Umumnya desainer mengapung elemen, kiri atau ke kanan, yang menciptakan ruang kosong di sisi lain yang memungkinkan elemen lain untuk mengambil ruang yang tersisa.

Mengapa mereka mengapung elemen?

Elemen melayang ketika desainer membutuhkan 2 elemen tingkat blok berdampingan. Misalnya katakanlah kami ingin merancang situs web dasar yang memiliki tata letak seperti di bawah ini ...

masukkan deskripsi gambar di sini

Contoh langsung dari gambar demo.

Kode Untuk Demo

Catatan: Anda mungkin harus menambahkan header, footer, aside, section(dan elemen HTML5 lainnya) sebagai display: block;dalam stylesheet Anda untuk secara eksplisit menyebutkan bahwa unsur-unsur adalah elemen tingkat blok.

Penjelasan:

Saya memiliki tata letak dasar, 1 tajuk, 1 bilah samping, 1 area konten, dan 1 catatan kaki.

Tanpa mengapung header, berikutnya adalah asidetag yang akan saya gunakan untuk bilah sisi situs web saya, jadi saya akan melayang elemen ke kiri.

Catatan: Secara default, elemen level blok membutuhkan lebar dokumen 100%, tetapi ketika melayang ke kiri atau kanan, ia akan mengubah ukuran sesuai dengan konten yang dipegangnya.

  1. Perilaku Normal Elemen Tingkat Blok
  2. Perilaku Floated Elemen Tingkat Blok

Jadi seperti yang Anda perhatikan, sayap melayang divmembuat ruang di sebelah kanannya tidak digunakan, yang akan memungkinkan ruang divsetelahnya bergeser di ruang yang tersisa.

  1. divAkan membuat satu demi satu jika mereka TIDAK mengambang
  2. div akan bergeser berdampingan jika melayang ke kiri atau kanan

Ok, jadi ini adalah bagaimana elemen-elemen level blok berperilaku ketika melayang ke kiri atau kanan, jadi sekarang mengapa clear: both;diperlukan dan mengapa?

Jadi, jika Anda perhatikan di demo tata letak - dalam kasus Anda lupa, di sini itu ..

Saya menggunakan kelas yang dipanggil .cleardan memegang properti yang disebut cleardengan nilai both. Jadi mari kita lihat mengapa perlu both.

Saya sudah melayang asidedan sectionelemen ke kiri, jadi anggap skenario, di mana kita memiliki kolam, di mana headertanah padat, asidedan sectionmengambang di kolam renang dan catatan kaki adalah tanah padat lagi, sesuatu seperti ini ..

Tampilan Terapung

Jadi air biru tidak tahu berapa luas elemen terapung itu, mereka bisa lebih besar dari kolam atau lebih kecil, jadi inilah masalah umum yang menyulitkan 90% pemula CSS: mengapa latar belakang elemen wadah tidak direntangkan ketika memegang elemen melayang. Itu karena elemen penampung adalah POOL di sini dan POOL tidak tahu berapa banyak benda yang melayang, atau berapa panjang atau luasnya elemen melayang itu, sehingga tidak akan meregang.

  1. Aliran Normal Dokumen
  2. Bagian Melayang Ke Kiri
  3. Elemen Apung Yang Dihapus Untuk Meregangkan Warna Latar Belakang Wadah

(Rujuk [Clearfix] jawaban ini untuk cara yang rapi untuk melakukan ini. Saya menggunakan divcontoh kosong dengan sengaja untuk tujuan penjelasan)

Saya telah memberikan 3 contoh di atas, 1 adalah aliran dokumen normal di mana redlatar belakang hanya akan merender seperti yang diharapkan karena wadah tidak memegang benda melayang.

Dalam contoh kedua, ketika objek melayang ke kiri, elemen wadah (POOL) tidak akan tahu dimensi elemen yang melayang dan karenanya tidak akan meregang ke ketinggian elemen melayang.

masukkan deskripsi gambar di sini

Setelah menggunakan clear: both;, elemen kontainer akan ditarik ke dimensi elemen apung.

masukkan deskripsi gambar di sini

Alasan lain yang clear: both;digunakan adalah untuk mencegah elemen bergeser ke atas di ruang yang tersisa.

Katakanlah Anda ingin 2 elemen berdampingan dan elemen lain di bawahnya ... Jadi Anda akan mengapung 2 elemen ke kiri dan Anda ingin yang lain di bawahnya.

  1. divMelayang ke kiri mengakibatkan sectionpindah ke ruang yang tersisa
  2. Floated divdihapus sehingga sectiontag akan ditampilkan di bawah floated divs

Contoh 1

masukkan deskripsi gambar di sini


Contoh ke-2

masukkan deskripsi gambar di sini

Terakhir tetapi tidak kalah pentingnya, footertag akan diberikan setelah elemen terapung karena saya telah menggunakan clearkelas sebelum mendeklarasikan footertag saya , yang memastikan bahwa semua elemen terapung (kiri / kanan) dibersihkan hingga titik itu.


Clearfix

Datang ke clearfix yang terkait dengan pelampung. Seperti yang sudah ditentukan oleh @Elky , cara kita membersihkan float ini bukanlah cara yang bersih untuk melakukannya karena kita menggunakan divelemen kosong yang bukan merupakan divelemen yang dimaksudkan untuk itu. Oleh karena itu inilah clearfix.

Anggap saja sebagai elemen virtual yang akan membuat elemen kosong untuk Anda sebelum elemen induk Anda berakhir. Ini akan membersihkan sendiri elemen pembungkus Anda yang memegang elemen mengambang. Elemen ini tidak akan ada di DOM Anda secara harfiah tetapi akan melakukan pekerjaan.

Untuk menghapus sendiri elemen pembungkus yang memiliki elemen apung, kita dapat menggunakan

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

Perhatikan :afterelemen pseudo yang digunakan oleh saya untuk itu class. Itu akan membuat elemen virtual untuk elemen pembungkus tepat sebelum menutup sendiri. Jika kita melihat dom Anda bisa melihat bagaimana itu muncul di pohon dokumen.

Clearfix

Jadi jika Anda lihat, itu diberikan setelah anak melayang di divmana kami membersihkan mengapung yang tidak lain adalah memiliki divelemen kosong dengan clear: both;properti yang kami gunakan untuk ini juga. Sekarang mengapa display: table;dan di contentluar ruang lingkup jawaban ini tetapi Anda dapat mempelajari lebih lanjut tentang elemen semu di sini .

Perhatikan bahwa ini juga akan berfungsi di IE8 karena IE8 mendukung :afterpseudo .


Jawaban asli:

Sebagian besar pengembang mengapung konten mereka ke kiri atau kanan di halaman mereka, mungkin div memegang logo, sidebar, konten dll., Div ini melayang ke kiri atau kanan, meninggalkan sisa ruang yang tidak digunakan dan karenanya jika Anda menempatkan wadah lain, itu akan mengapung juga di ruang yang tersisa, jadi untuk mencegahnya clear: both; digunakan, itu menghapus semua elemen melayang ke kiri atau kanan.

Demonstrasi:

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

Sekarang bagaimana jika Anda ingin membuat div lain di bawah div1, jadi Anda akan menggunakannya clear: both;sehingga akan memastikan Anda menghapus semua pelampung, kiri atau kanan

------------------
div1(Floated Left)
------------------
<div style="clear: both;"><!--This <div> acts as a separator--></div>
----------------------------------
Other div renders here now
----------------------------------
Pak Alien
sumber
3
Jika Anda belum pernah mendengar tentang pelampung, saya sarankan Anda terlebih dahulu membaca pengantar pelampung --- misalnya, lihat tautan di jawaban berikutnya. Kemudian kembali dan baca jawaban ini - itu akan masuk akal.
Osa
37
Perhatikan, mengapung awalnya tidak diciptakan untuk memiliki dua elemen tingkat blok berdampingan, itu hanya efek samping! Tujuan awalnya adalah untuk memungkinkan teks mengalir di sekitar gambar inline, sehingga Anda melayang gambar di kedua arah.
Hantu Madara
3
Terkait jawaban singkat untuk merujuk sebelum membaca ini, hanya untuk mendapatkan ide umum .. stackoverflow.com/questions/16568272/…
Tn. Alien
@ mr-alien Contoh yang baik, namun dalam kasus jsfiddle.net/N82UD/1 ketika Anda mengecilkan layar, ada masalah dengan float dan elemen "dibersihkan" tidak mengikuti aliran: jsfiddle.net/N82UD/138 It mengambil ruang item melayang 2
Omar
1
@Carlo: Alternatif yang banyak digunakan dalam template seperti Twitter Bootstrap misalnya; adalah untuk memakai display: inline-blockelemen, dan pada induk yang dapat Anda gunakan text-align: left, text-align: centeratau text-align: rightmisalnya.
Daan
39

The clearproperti menunjukkan bahwa kiri, kanan atau kedua sisi elemen tidak bisa berdekatan dengan elemen sebelumnya melayang dalam konteks format blok yang sama. Elemen yang dibersihkan didorong di bawah elemen melayang yang sesuai. Contoh:

clear: none; Elemen tetap berdekatan dengan elemen melayang

clear: left; Elemen didorong di bawah elemen melayang kiri

clear: right; Elemen didorong di bawah elemen melayang kanan

clear: both; Elemen didorong di bawah semua elemen melayang

clear tidak mempengaruhi mengapung di luar konteks pemformatan blok saat ini

Salman A
sumber
1
Luar biasa. Ini jawaban terbaik. Saya bertanya-tanya mengapa jawaban lain diterima.
sawa
Apa yang akan terjadi jika kita menghapus display: inline-block;properti css dari skenario ini? Ini akan meregangkan inline-blockelemen induk ke elemen saudara yang memiliki kelas float-left. Yang membuat pernyataan "jelas tidak mempengaruhi mengapung di luar konteks pemformatan blok saat ini" salah. Bisakah seseorang menjelaskan tolong?
Sashrika Waidyarathna
@SashrikaWaidyarathna: elemen induk tidak harus menghasilkan konteks format blok untuk anak-anaknya. Dalam contoh Anda (a) menghapus display: inline-blockberarti itu tidak lagi menghasilkan konteks format blok (b) float / membersihkan di dalam elemen itu dan float pertama semua menjadi bagian dari konteks format blok yang sama (viewport).
Salman A
@SalmanA, terima kasih atas penjelasan yang merujuk pada spesifikasi css. Saya tidak mengetahui definisi konteks pemformatan blok.
Sashrika Waidyarathna
2
Sundar Pichai doppelganger?
Manoj Kumar
13

Jawaban Pak Alien sempurna, tapi bagaimanapun saya tidak merekomendasikan untuk menggunakannya <div class="clear"></div>karena ini hanya peretasan yang membuat markup Anda kotor. Ini tidak berguna kosong divdalam hal struktur dan semantik yang buruk, ini juga membuat kode Anda tidak fleksibel. Di beberapa browser div ini menyebabkan ketinggian tambahan dan Anda harus menambahkan height: 0;yang lebih buruk. Tapi masalah sebenarnya dimulai ketika Anda ingin menambahkan latar belakang atau perbatasan di sekitar elemen melayang Anda - itu hanya akan runtuh karena web dirancang dengan buruk . Saya merekomendasikan untuk membungkus elemen apung ke dalam wadah yang memiliki aturan CSS clearfix . Ini juga hack, tetapi indah, lebih fleksibel untuk digunakan dan dapat dibaca untuk robot manusia dan SEO.

elky
sumber
Posting lain ini memiliki detail lebih lanjut tentang clearfix: stackoverflow.com/questions/211383/…
Bill Hoag
2

Ketika Anda ingin satu elemen ditempatkan di bagian bawah elemen lain Anda menggunakan kode ini di CSS. Digunakan untuk mengapung.

Jika Anda melayang konten, Anda dapat melayang kiri atau kanan ... jadi dalam tata letak umum Anda mungkin memiliki nav kiri, div konten dan footer.

Untuk memastikan footer tetap di bawah kedua mengapung ini (jika Anda melayang kiri dan kanan) maka Anda meletakkan footer sebagai clear: both.

Dengan cara ini akan tetap berada di bawah kedua pelampung.

(Jika Anda hanya membersihkan kiri maka Anda hanya benar-benar perlu clear: left;.)

Ikuti tutorial ini:

Saeed
sumber
3
Tutorial apa?
Peter Mortensen