Saya ingin bertanya bagaimana ketinggian dan pelampung bekerja. Saya memiliki div luar dan div batin yang memiliki konten di dalamnya. Tingginya dapat bervariasi tergantung pada isi div bagian dalam tetapi tampaknya div bagian dalam saya akan meluap bagian luarnya. Apa cara yang tepat untuk melakukannya?
<html>
<body>
<div style="margin:0 auto;width: 960px; min-height: 100px; background-color:orange">
<div style="width:500px; height:200px; background-color:black; float:right"></div>
</div>
</body>
</html>
Jawaban:
Elemen melayang tidak menambah ketinggian elemen wadah, dan karenanya jika Anda tidak membersihkannya, tinggi wadah tidak akan meningkat ...
Saya akan menunjukkan kepada Anda secara visual:
Penjelasan Lebih Lanjut:
Anda juga dapat menambahkan
overflow: hidden;
elemen kontainer, tetapi saya sarankan Anda menggunakannyaclear: both;
sebagai gantinya.Juga jika Anda mungkin ingin membersihkan sendiri elemen yang dapat Anda gunakan
Bagaimana CSS Float Bekerja?
Apa itu float sebenarnya dan apa fungsinya?
The
float
properti disalahpahami oleh sebagian besar pemula. Apa yang sebenarnyafloat
dilakukan? Awalnya,float
properti itu diperkenalkan untuk mengalir teks di sekitar gambar, yang melayangleft
atauright
. Berikut penjelasan lain dari @Madara Uchicha.Jadi, apakah salah menggunakan
float
properti untuk menempatkan kotak berdampingan? Jawabannya adalah tidak ; tidak ada masalah jika Anda menggunakanfloat
properti untuk mengatur kotak berdampingan.Mengambang elemen
Demoinline
ataublock
level akan membuat elemen berperilaku sepertiinline-block
elemen.Jika Anda melayang elemen
left
atauright
,width
elemen akan terbatas pada konten yang dimilikinya, kecualiwidth
didefinisikan secara eksplisit ...Anda tidak dapat
float
sebuah elemencenter
. Ini adalah masalah terbesar yang selalu saya lihat dengan pemula, menggunakan, yang bukan nilai yang valid untukfloat: center;
float
properti.float
umumnya digunakan untukfloat
/ memindahkan konten ke paling kiri atau ke paling kanan . Hanya ada empat nilai yang valid untukfloat
yaitu propertileft
,right
,none
(default) daninherit
.Elemen induk runtuh, ketika mengandung elemen anak melayang, untuk mencegah hal ini, kami menggunakan
clear: both;
properti, untuk menghapus elemen melayang di kedua sisi, yang akan mencegah runtuhnya elemen induk. Untuk informasi lebih lanjut, Anda dapat merujuk jawaban saya yang lain di sini .(Penting) Pikirkan di mana kita memiliki tumpukan berbagai elemen. Ketika kita menggunakan
float: left;
ataufloat: right;
elemen bergerak di atas tumpukan dengan satu. Oleh karena itu elemen-elemen dalam aliran dokumen normal akan bersembunyi di balik elemen terapung karena berada di tingkat tumpukan di atas elemen terapung normal. (Tolong jangan menghubungkan iniz-index
karena itu sama sekali berbeda.)Mengambil kasus sebagai contoh untuk menjelaskan bagaimana CSS mengapung bekerja, dengan asumsi kita membutuhkan tata letak 2 kolom sederhana dengan header, footer, dan 2 kolom, jadi di sini seperti apa cetak biru itu terlihat ...
Dalam contoh di atas, kami hanya akan mengapungkan kotak merah, baik Anda bisa
float
keleft
, atau Anda bisafloat
keleft
, dan yang lainright
juga, tergantung pada tata letak, jika 3 kolom, Anda dapatfloat
2 kolom keleft
tempat lain satu ke yangright
tergantung, meskipun dalam contoh ini, kita memiliki tata letak 2 kolom yang disederhanakan sehinggafloat
satu keleft
dan yang lainnya keright
.Markup dan gaya untuk membuat tata letak dijelaskan lebih jauh ke bawah ...
Mari kita selangkah demi selangkah dengan tata letak dan melihat bagaimana float bekerja ..
Pertama-tama, kita menggunakan elemen pembungkus utama, Anda hanya bisa berasumsi bahwa itu Anda viewport, maka kita gunakan
header
dan menetapkanheight
dari50px
sehingga tidak ada yang mewah di sana. Itu hanya elemen level blok non floated normal yang akan memakan100%
ruang horisontal kecuali jika itu melayang atau kita tetapkaninline-block
untuk itu.Nilai valid pertama
float
adalahleft
sehingga dalam contoh kita, kita gunakanfloat: left;
untuk.floated_left
, jadi kami berniat untuk mengapung blok keleft
elemen kontainer kami.Kolom melayang ke kiri
Dan ya, jika Anda melihat, elemen induk, yang
.wrapper
runtuh, yang Anda lihat dengan perbatasan hijau tidak membesar, tetapi seharusnya benar? Akan kembali ke itu sebentar lagi, untuk saat ini, ada kolom yang sudah kami kirimleft
.Datang ke kolom kedua, biarkan yang
float
ini keright
Kolom lain melayang ke kanan
Di sini, kami memiliki
300px
kolom lebar yang kamifloat
keright
, yang akan duduk di samping kolom pertama saat melayang keleft
, dan karena itu melayang keleft
, itu menciptakan selokan kosong keright
, dan karena ada banyak ruang diright
, kamiright
elemen melayang duduk dengan sempurna di samping yangleft
satu.Tetap saja, elemen induknya diciutkan, yah, mari kita perbaiki sekarang. Ada banyak cara untuk mencegah elemen induk agar tidak runtuh.
clear: both;
sebelum elemen induk berakhir, yang menampung elemenclear
apung , sekarang yang ini adalah solusi murah untuk elemen apung Anda yang akan melakukan pekerjaan untuk Anda, tetapi, saya sarankan untuk tidak menggunakan ini.Tambahkan,
<div style="clear: both;"></div>
sebelum.wrapper
div
ujungnya, sepertiDemo
Nah, itu memperbaiki dengan sangat baik, tidak ada lagi orang tua yang runtuh, tetapi hal itu menambah markup yang tidak perlu ke DOM, jadi beberapa menyarankan, untuk digunakan
overflow: hidden;
pada elemen induk yang memegang elemen anak melayang yang berfungsi sebagaimana dimaksud.Gunakan
overflow: hidden;
pada.wrapper
Demo
Itu menyelamatkan kita sebuah elemen setiap kali kita perlu
clear
float
tetapi ketika saya menguji berbagai kasus dengan ini, itu gagal dalam satu kasus tertentu, yang digunakanbox-shadow
pada elemen anak.Demo (Tidak dapat melihat bayangan di keempat sisi,
overflow: hidden;
menyebabkan masalah ini)Jadi bagaimana sekarang? Simpan elemen, jangan
overflow: hidden;
gunakan hack fix yang jelas, gunakan snippet di bawah ini di CSS Anda, dan sama seperti yang Anda gunakanoverflow: hidden;
untuk elemen induk, panggil elemen diclass
bawah ini pada elemen induk untuk membersihkan sendiri.Demo
Di sini, bayangan berfungsi sebagaimana dimaksud, juga, membersihkan sendiri elemen induk yang mencegahnya runtuh.
Dan terakhir, kami menggunakan footer setelah kami
clear
elemen melayang.Demo
Kapan
float: none;
digunakan, karena ini adalah default, jadi ada gunanya untuk menyatakanfloat: none;
?Yah, itu tergantung, jika Anda pergi untuk desain responsif, Anda akan menggunakan nilai ini banyak kali, ketika Anda ingin elemen melayang Anda membuat satu di bawah yang lain pada resolusi tertentu. Untuk itu
float: none;
properti berperan penting di sana.Beberapa contoh dunia nyata tentang bagaimana
float
berguna.img
melayang di dalamp
yang akan memungkinkan konten kita untuk mengalir.Demo (Tanpa mengambang
img
)Demo 2 (
img
melayang keleft
)float
untuk membuat menu horisontal - DemoFloat elemen kedua juga, atau gunakan `margin`
Terakhir tetapi tidak sedikit, saya ingin menjelaskan kasus khusus ini di mana Anda
float
hanya elemen tunggal untukleft
tetapi Anda tidakfloat
yang lain, jadi apa yang terjadi?Misalkan jika kita menghapus
float: right;
dari kita.floated_right
class
, makadiv
akan diberikan dari ekstremleft
karena tidak melayang.Demo
Jadi dalam hal ini, Anda dapat
float
keleft
jugaATAU
Anda dapat menggunakan
margin-left
yang akan sama dengan ukuran kolom melayang kiri yaitu200px
lebar .sumber
clear: both;
, tapi tidak apa-apa jika Anda merasa suntingan dibenarkan jadi mari kita tetap seperti ituAnda perlu menambahkan
overflow:auto
div orang tua Anda agar dapat mencakup bagian dalam floated div:contoh jsFiddle
sumber
Anda menjumpai bug float (meskipun saya tidak yakin apakah itu bug secara teknis karena berapa banyak browser menunjukkan perilaku ini). Inilah yang terjadi:
Dalam keadaan normal, dengan asumsi bahwa tidak ada ketinggian eksplisit telah ditetapkan, elemen level blok seperti div akan mengatur ketinggiannya berdasarkan kontennya. Bagian bawah div induk akan melampaui elemen terakhir. Sayangnya, mengapung sebuah elemen menghentikan induk dari memperhitungkan elemen yang melayang saat menentukan tingginya. Ini berarti bahwa jika elemen terakhir Anda melayang, itu tidak akan "meregangkan" induknya seperti halnya elemen normal.
Membersihkan
Ada dua cara umum untuk memperbaikinya. Yang pertama adalah menambahkan elemen "kliring"; yaitu, elemen lain di bawah yang melayang yang akan memaksa orang tua untuk meregangkan. Jadi tambahkan html berikut sebagai anak terakhir:
Seharusnya tidak terlihat, dan dengan menggunakan clear: keduanya, Anda memastikan bahwa itu tidak akan duduk di sebelah elemen melayang, tetapi setelah itu.
Meluap:
Metode kedua, yang disukai oleh kebanyakan orang (saya pikir) adalah mengubah CSS dari elemen induk sehingga overflow sama sekali tidak "terlihat". Jadi pengaturan overflow ke "tersembunyi" akan memaksa orang tua untuk meregangkan bagian bawah anak melayang. Ini hanya benar jika Anda belum menetapkan ketinggian pada induknya, tentu saja.
Seperti yang saya katakan, metode kedua lebih disukai karena tidak mengharuskan Anda untuk pergi dan menambahkan elemen semantik yang tidak berarti ke markup Anda, tetapi ada kalanya Anda perlu
overflow
terlihat, dalam hal menambahkan elemen kliring lebih dari dapat diterima .sumber
Itu karena pelampung div. Tambahkan
overflow: hidden
pada elemen luar.Demo
sumber
Anda bingung bagaimana browser merender elemen ketika ada elemen mengambang. Jika satu elemen blok mengambang (div bagian dalam Anda dalam kasus Anda), elemen blok lainnya akan mengabaikannya karena browser menghapus elemen mengambang dari aliran normal halaman web. Kemudian, karena div yang melayang telah dihapus dari aliran normal, div luar diisi, seperti div bagian dalam tidak ada. Namun, elemen sebaris (gambar, tautan, teks, blackquote) akan menghormati batas-batas elemen mengambang. Jika Anda memperkenalkan teks di div luar, teks akan menempatkan arround de inner div.
Dengan kata lain, elemen blok (header, paragraf, div, dll) mengabaikan elemen mengambang dan mengisi, dan elemen sebaris (gambar, tautan, teks, dll) menghormati batas-batas elemen mengambang.
Contoh biola di sini
sumber
Coba yang ini
sumber
Anda dapat menggunakan properti overflow ke div kontainer jika Anda tidak memiliki div untuk ditampilkan di atas kontainer misalnya:
Berikut ini css berikut:
-----------------------ATAU-------------------------- ----
Berikut ini css berikut:
sumber