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 ...
/* CSS: */*{/* Not related to floats / clear both, used it for demo purpose only */box-sizing: border-box;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;}
header, footer {border:5px solid #000;height:100px;}
aside {float: left;width:30%;border:5px solid #000;height:300px;}
section {float: left;width:70%;border:5px solid #000;height:300px;}.clear {clear: both;}
<!-- HTML --><header>
Header
</header><aside>
Aside (Floated Left)
</aside><section>
Content (Floated Left, Can Be Floated To Right As Well)
</section><!-- Clearing Floating Elements--><divclass="clear"></div><footer>
Footer
</footer>
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.
Jadi seperti yang Anda perhatikan, sayap melayang divmembuat ruang di sebelah kanannya tidak digunakan, yang akan memungkinkan ruang divsetelahnya bergeser di ruang yang tersisa.
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 ..
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.
(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.
Setelah menggunakan clear: both;, elemen kontainer akan ditarik ke dimensi elemen apung.
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.
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.
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 .
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(FloatedLeft)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(FloatedLeft)------------------<div style="clear: both;"><!--This<div> acts as a separator--></div>----------------------------------Other div renders here now
----------------------------------
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.
@ 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
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.
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.
float
dan ingin elemen berikutnya di bawah, bukan di kanan atau kiri.Jawaban:
Saya tidak akan menjelaskan bagaimana float bekerja di sini (secara rinci), karena pertanyaan ini umumnya berfokus pada Mengapa menggunakan
clear: both;
ATAU apa yangclear: 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 ...
Contoh langsung dari gambar demo.
Kode Untuk Demo
Tampilkan cuplikan kode
Catatan: Anda mungkin harus menambahkan
header
,footer
,aside
,section
(dan elemen HTML5 lainnya) sebagaidisplay: 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 adalahaside
tag yang akan saya gunakan untuk bilah sisi situs web saya, jadi saya akan melayang elemen ke kiri.Jadi seperti yang Anda perhatikan, sayap melayang
div
membuat ruang di sebelah kanannya tidak digunakan, yang akan memungkinkan ruangdiv
setelahnya bergeser di ruang yang tersisa.div
Akan membuat satu demi satu jika mereka TIDAK mengambangdiv
akan bergeser berdampingan jika melayang ke kiri atau kananOk, 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
.clear
dan memegang properti yang disebutclear
dengan nilaiboth
. Jadi mari kita lihat mengapa perluboth
.Saya sudah melayang
aside
dansection
elemen ke kiri, jadi anggap skenario, di mana kita memiliki kolam, di manaheader
tanah padat,aside
dansection
mengambang di kolam renang dan catatan kaki adalah tanah padat lagi, sesuatu seperti ini ..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.
(Rujuk [Clearfix] jawaban ini untuk cara yang rapi untuk melakukan ini. Saya menggunakan
div
contoh kosong dengan sengaja untuk tujuan penjelasan)Saya telah memberikan 3 contoh di atas, 1 adalah aliran dokumen normal di mana
red
latar 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.
Setelah menggunakan
clear: both;
, elemen kontainer akan ditarik ke dimensi elemen apung.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.
div
Melayang ke kiri mengakibatkansection
pindah ke ruang yang tersisadiv
dihapus sehinggasection
tag akan ditampilkan di bawah floateddiv
sContoh 1
Contoh ke-2
Terakhir tetapi tidak kalah pentingnya,
footer
tag akan diberikan setelah elemen terapung karena saya telah menggunakanclear
kelas sebelum mendeklarasikanfooter
tag 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
div
elemen kosong yang bukan merupakandiv
elemen 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
Perhatikan
:after
elemen pseudo yang digunakan oleh saya untuk ituclass
. 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.Jadi jika Anda lihat, itu diberikan setelah anak melayang di
div
mana kami membersihkan mengapung yang tidak lain adalah memilikidiv
elemen kosong denganclear: both;
properti yang kami gunakan untuk ini juga. Sekarang mengapadisplay: table;
dan dicontent
luar 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
:after
pseudo .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:
Sekarang bagaimana jika Anda ingin membuat div lain di bawah
div1
, jadi Anda akan menggunakannyaclear: both;
sehingga akan memastikan Anda menghapus semua pelampung, kiri atau kanansumber
display: inline-block
elemen, dan pada induk yang dapat Anda gunakantext-align: left
,text-align: center
atautext-align: right
misalnya.The
clear
properti 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 melayangTampilkan cuplikan kode
clear: left;
Elemen didorong di bawah elemen melayang kiriTampilkan cuplikan kode
clear: right;
Elemen didorong di bawah elemen melayang kananTampilkan cuplikan kode
clear: both;
Elemen didorong di bawah semua elemen melayangTampilkan cuplikan kode
clear
tidak mempengaruhi mengapung di luar konteks pemformatan blok saat iniTampilkan cuplikan kode
sumber
display: inline-block;
properti css dari skenario ini? Ini akan meregangkaninline-block
elemen induk ke elemen saudara yang memiliki kelasfloat-left
. Yang membuat pernyataan "jelas tidak mempengaruhi mengapung di luar konteks pemformatan blok saat ini" salah. Bisakah seseorang menjelaskan tolong?display: inline-block
berarti 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).CSS mengambang dan jelas
Contoh biola
Coba hapus
clear:both
properti daridiv
withclass
sample
dan lihat caranya berikut mengambangdivs
.sumber
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 kosongdiv
dalam hal struktur dan semantik yang buruk, ini juga membuat kode Anda tidak fleksibel. Di beberapa browser div ini menyebabkan ketinggian tambahan dan Anda harus menambahkanheight: 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.sumber
clearfix
: stackoverflow.com/questions/211383/…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:
sumber