Mengapa butir item daftar saya tumpang tindih dengan elemen mengambang


166

Saya memiliki halaman (XHTML Strict) tempat saya melayang gambar di samping paragraf teks biasa. Semua berjalan dengan baik, kecuali ketika daftar digunakan sebagai pengganti paragraf. Peluru daftar tumpang tindih dengan gambar melayang.

Mengubah margin daftar atau item daftar tidak membantu. Margin dihitung dari kiri halaman, tetapi float mendorong item daftar ke kanan di dalam liitu sendiri. Jadi margin hanya membantu jika saya membuatnya lebih lebar dari gambar.

Mengambang daftar di sebelah gambar juga berfungsi, tetapi saya tidak tahu kapan daftar di sebelah float. Saya tidak ingin mengapung setiap daftar di konten saya hanya untuk memperbaikinya. Juga, melayang ke kiri mengacaukan tata letak ketika gambar melayang ke kanan, bukan ke kiri daftar.

Pengaturan li { list-style-position: inside }memang menggerakkan peluru bersama dengan konten, tetapi juga menyebabkan garis yang membungkus mulai menyelaraskan dengan peluru, bukannya sejalan dengan garis di atas.

Masalahnya jelas disebabkan oleh peluru yang diberikan di luar kotak, pelampung mendorong isi kotak ke kanan (bukan kotak itu sendiri). Ini adalah bagaimana IE dan FF menangani situasi, dan sejauh yang saya tahu, tidak salah menurut spesifikasi. Pertanyaannya adalah, bagaimana saya bisa mencegahnya?

Jawaban:


280

Saya telah menemukan solusi untuk masalah ini. Menerapkan suatu ul { overflow: hidden; }ke ulmemastikan bahwa kotak itu sendiri didorong ke samping oleh pelampung, bukan isi kotak.

Hanya IE6 yang membutuhkan ul { zoom: 1; }komentar bersyarat kami untuk memastikan ultata letak memiliki.


1
+1: CSS yang bagus, saya mencari seperti gila untuk solusi yang BERBAGAI BAIK dan ini dia di SO. Satu-satunya kelemahan kecil adalah bahwa properti zoom tidak memvalidasi CSS, tapi saya menguji dan pada IE7, IE8 tidak diperlukan, jadi mungkin hanya untuk IE6.
Marco Demaio

14
Agar ini benar-benar berfungsi, saya harus menerapkan: ul, ol {overflow: hidden; padding-left: 40px; margin-kiri: 0; } ol li, ul li {list-style-position: outside; bantalan-kiri: 0; } Ini memaksa rendering yang konsisten di seluruh browser dan memaksa IE6 untuk menunjukkan peluru. Peluru disembunyikan sebaliknya. Ul {zoom: 1; } masih diperlukan dalam pengaturan khusus ie6 juga.
Mandrake

1
Solusi yang sangat sederhana untuk BUG konyol di MSIE.
SF.

10
Itu bukan solusi yang sempurna. Seperti Blazemonger menyebutkan pukulan, jika gambar kecil dan daftar sangat panjang, daftar tidak akan mengalir di sekitar gambar mengambang. Daftar ini akan memiliki margin besar dari atas hingga akhir jika gambarnya sangat lebar.
yang

2
Bagus! Saya tidak bisa melihat bagaimana hal ini masuk akal, ketika membaca dokumen W3C tentang overflow: w3schools.com/cssref/pr_pos_overflow.asp
MSC

66

Menambahkan peningkatan pada solusi Glen E. Ivey :

ul {
    list-style: outside disc;
    margin-left: 1em;
}
ul li {
    position: relative;
    left: 1em;
    padding-right: 1em;    
}​

http://jsfiddle.net/mblase75/TJELt/

Saya lebih suka teknik ini, karena ini berfungsi ketika daftar perlu mengalir di sekitar gambar mengambang, sedangkan overflow: hiddentekniknya tidak. Namun, itu juga perlu untuk menambahkan padding-right: 1emke liuntuk menjaga mereka dari meluap kontainer mereka.


Saya lebih suka perbaikan ini juga karena yang teratas memecahkan drop-down Bootstrap Twitter saya dan saya butuh selamanya untuk mengetahui bahwa metode di atas adalah penyebabnya.
Ian Hoar

2
Terima kasih untuk ini. Menerapkan overflow: disembunyikan; ke wadah UL mencegah teks dalam item baris terpisah berjalan dengan benar di sekitar blok yang mengambang. Solusi ini berhasil!
jsdalton

1
Saya mengalami masalah kecil namun kritis dengan solusi ini, dan saya ingin menyarankan tambahan untuk peningkatan Anda. Saya tidak yakin mengapa, tetapi ketika Anda menambahkan position: relative;ke item baris, itu menciptakan masalah penumpukan dengan konten yang melayang. Saya menemukan (di Chrome dan Firefox) bahwa sulit untuk mengarahkan kursor dan mengklik tautan dalam konten yang melayang. Perbaikan untuk saya adalah menambahkan position: relative; z-index: 1;elemen melayang, yang tampaknya menyelesaikan masalah susun.
jsdalton

7
Sayangnya, pada IE 10, peluru tumpang tindih dengan elemen mengambang.
Munawwar

1
Sedangkan ul {overflow: hidden;}memecahkan masalah ini di semua browser, solusi di atas adalah satu-satunya obat yang berfungsi untuk masalah ini dengan Prince XML , XHTML + CSS3 ke PDF converter.
Serge Stroobandt

36

Di sinilah properti "display" menjadi miliknya. Atur CSS di bawah ini untuk membuat daftar berfungsi di samping konten yang di-floated.

display: table; bekerja di samping konten yang melayang (mengisi celah) tetapi tanpa menyembunyikan konten di belakangnya. Seperti halnya meja :-)

.img {
  float: left;
}

.table {
  display: table;
}
<img class="img" src="https://via.placeholder.com/350x350" alt="">
<ul>
  <li>Test content</li>
  <li>Test content</li>
  <li>Test content</li>
</ul>
<ul class="table">
  <li>Test content</li>
  <li>Test content</li>
  <li>Test content</li>
</ul>

EDIT: Ingatlah untuk menambahkan kelas untuk mengisolasi daftar yang Anda inginkan. Misalnya "konten ul.in" atau lebih umum ".konten ul"


29

Coba daftar-gaya-posisi: di dalam untuk mengubah tata letak peluru.


3
list-style-position:insideakan menjadi solusi yang bagus, tetapi menyebabkan garis yang membungkus mulai selaras dengan peluru, bukannya selaras dengan garis di atas.
Marco Demaio

overflow: disembunyikan; tidak berfungsi untuk gambar float kiri saya, tetapi list-style-position: inside melakukannya! terima kasih
menardmam

Ini adalah satu-satunya solusi yang masih membungkus konten di IE untuk saya. Terima kasih!
jordan314

Ini adalah solusi yang bagus untuk saat konten mengambang antara peluru Anda dan konten peluru.
TylersSN

Ini harus menjadi jawaban yang dipilih.
Sleek Geek

18

Di http://archivist.incutio.com/viewlist/css-discuss/106382 saya menemukan saran yang cocok untuk saya: gayakan elemen 'li' dengan:

position: relative;
left: 1em;

Di mana Anda mengganti "1em" dengan lebar bantalan / margin kiri yang akan dimiliki item daftar Anda jika float tidak ada. Ini bekerja sangat baik dalam aplikasi saya, bahkan menangani kasus di mana bagian bawah pelampung terjadi di tengah daftar - peluru-peluru bergeser kembali ke margin kiri (lokal) tepat.


2
Solusi fantastis, bekerja seperti pesona! Meskipun saya harus mendapatkan tangan saya kotor dengan IE7 karena gagal menampilkan nomor item daftar pada daftar yang tidak di sebelah elemen melayang.
maryisdead

@maryisdead Apa solusi Anda untuk IE7?
TJ.

IE7 membutuhkan margin-kiri tambahan pada daftar item. Lihat jsfiddle.net/maryisdead/wu6ew/5 biola ini dan perhatikan dua peretasan IE7. Maaf karena tidak menambahkan ini sebelumnya pada.
maryisdead

18

Mengapa overflow: hiddenbekerja

Solusinya semudah:

ul {overflow: hidden;}

Kotak blok dengan overflow:selain visible menetapkan konteks format blok baru untuk isinya. Rekomendasi W3C: http://www.w3.org/TR/CSS2/visuren.html#block-formatting

Contoh

Tombol-tombol di situs web saya , yang <li>menyamar, dibuat seperti ini. Jadikan viewport (jendela) browser Anda lebih kecil untuk melihat indentasi dalam aksi .

Situs web saya sebagai contoh

Jawaban terkait

Artikel dengan contoh


1
terima kasih telah menjelaskan mengapa ini berhasil (tidak disebutkan dalam solusi yang diterima)
schellmax

17

Dengan menambah karya overflow: auto;Anda ulsetidaknya untuk saya.

Memperbarui

Saya telah memperbarui jsfiddle saya untuk memvisualisasikan apa yang terjadi. Ketika memiliki di ulsamping mengambang img, konten ulakan didorong oleh pelampung, tetapi bukan wadah yang sebenarnya. Dengan menambahkan overflow: autoseluruh- ulkotak akan didorong oleh float, bukan hanya konten.


13

Anda dapat menetapkan position: relative; left: 10px;untuk li. (Anda mungkin juga ingin memberikannya margin-right: 10px;, jika tidak maka akan menjadi terlalu lebar di sisi kanan.)

Atau, jika Anda ingin menggunakan floatuntuk ul- seperti yang disarankan oleh orang lain - Anda mungkin dapat menghentikan sisanya dari mengambang kanan ul dengan menggunakan clear: leftpada elemen yang mengikuti ul.


terima kasih chris, posisi itu: relatif bekerja. masalah yang akan muncul dari membersihkan elemen setelah ul adalah bahwa elemen juga akan menghapus div yang mengambang kiri.
superTidak berjudul


7

Penolakan

Daftar di sebelah elemen melayang menyebabkan masalah. Menurut pendapat saya, cara terbaik untuk mencegah masalah mengambang semacam ini adalah dengan menghindari gambar mengambang yang bersinggungan dengan konten. Ini juga akan membantu ketika Anda harus mendukung desain yang responsif.

Desain sederhana yang memusatkan gambar di antara paragraf akan terlihat sangat menarik dan jauh lebih mudah didukung daripada mencoba menjadi terlalu mewah. Ini juga satu langkah dari a <figure>.

Tapi saya benar-benar ingin gambar melayang!

Ok, jadi jika Anda gila cukup gigih untuk terus menyusuri jalan ini, ada beberapa teknik yang dapat digunakan.

Yang paling sederhana adalah dengan menggunakan daftar overflow: hiddenatau overflow: scrollagar daftar itu pada dasarnya dibungkus dengan pembungkus yang menarik lapisan kembali ke tempat yang berguna:

img {
  float: left;
}
.wrapping-list {
  overflow: hidden;
  padding-left: 40px;
}
<img src="http://placehold.it/100x100"/>
<ul class="wrapping-list">
  <li>lorem</li>
  <li>ipsum</li>
  <li>dolor</li>
  <li>sit</li>
  <li>amet</li>
</ul>

Teknik ini memiliki beberapa masalah. Jika daftar menjadi panjang, itu tidak benar-benar membungkus gambar, yang cukup banyak mengalahkan seluruh tujuan penggunaan floatpada gambar.

img {
  float: left;
}
.wrapping-list {
  overflow: hidden;
  padding-left: 40px;
}
<img src="http://placehold.it/100x100"/>
<ul class="wrapping-list">
  <li>lorem</li>
  <li>ipsum</li>
  <li>dolor</li>
  <li>sit</li>
  <li>amet</li>
  <li>lorem</li>
  <li>ipsum</li>
  <li>dolor</li>
  <li>sit</li>
  <li>amet</li>
  <li>lorem</li>
  <li>ipsum</li>
  <li>dolor</li>
  <li>sit</li>
  <li>amet</li>
</ul>

Tetapi saya benar-benar ingin membungkus daftar!

Ok, jadi jika Anda lebih gila lagi dan Anda benar-benar harus melanjutkan jalan ini, ada teknik lain yang dapat digunakan untuk membungkus item daftar dan mempertahankan peluru.

Alih-alih melapisi <ul>dan mencoba membuatnya berperilaku baik dengan peluru (yang sepertinya tidak pernah ingin dilakukan), bawa peluru itu dari <ul>dan berikan ke <li>s. Peluru itu berbahaya, dan orang yang <ul>adil tidak cukup bertanggung jawab untuk menanganinya dengan benar.

img {
  float: left;
}
.wrapping-list {
  padding: 0;
  list-style-position: inside;
}
.wrapping-list li {
  overflow: hidden;
  padding-left: 25px;
}
<img src="http://placehold.it/100x100"/>
<ul class="wrapping-list">
  <li>lorem</li>
  <li>ipsum</li>
  <li>dolor</li>
  <li>sit</li>
  <li>amet</li>
  <li>lorem</li>
  <li>ipsum</li>
  <li>dolor</li>
  <li>sit</li>
  <li>amet</li>
  <li>lorem</li>
  <li>ipsum</li>
  <li>dolor</li>
  <li>sit</li>
  <li>amet</li>
</ul>

Perilaku pembungkus ini dapat melakukan hal-hal aneh pada konten yang kompleks, jadi saya tidak menyarankan untuk menambahkannya secara default. Jauh lebih mudah untuk mengaturnya sebagai sesuatu yang dapat dipilih daripada sesuatu yang harus diganti.


Saya suka pilihan kedua, tetapi teks sebenarnya dimulai dengan poin-poin pada teks yang lebih panjang (2 baris) :-(
Arany

4

Coba yang berikut ini pada tag UL Anda. Ini harus menangani peluru yang menutupi gambar Anda dan Anda tidak perlu mengacaukan perataan kiri Anda yang disebabkan oleh list-position: inside.

overflow: hidden; 
padding-left: 2em; 

Saya harus menggunakan ini dengan solusi Blazemonger (# 2 di atas). BLazemonger sendiri tidak berfungsi di IE 9-11 dan Opera. Dengan ini, ia berfungsi di semua browser. Solusi Kamiel (# 1) tidak bekerja untuk saya karena menyembunyikan peluru saya. Konflik dengan Bootstrap3 mungkin.
Leraa

3

Berjuang dengan ini sendiri. Yang terbaik yang saya kelola adalah sebagai berikut:

ul {
    list-style-position: inside;
    padding-left: 1em;
    text-indent: -1em;
}

Teks sebenarnya bukan indentasi tetapi peluru menunjukkan.


2

Diedit untuk memperbarui berdasarkan komentar OP

ok, lalu pisahkan menjadi 2 div yang disatukan

ul  {background: blue; position:static;}
.therest {position:relative; width:100%}
.indent {float:left; }

<div class="therest">
<p>
Est tincidunt doming iis nobis nibh. Ullamcorper eorum elit lius me delenit. 
</p>
<hr />
<h3>Lorem</h3>
<div class="indent">
<ul>
<li>list element</li>
<li>list element</li>
<li>list element</li>
</ul> 
<div>
the rest now under the UL
</div>

coba ubah ul li css ke

ul {float: left; latar belakang: biru; }


terima kasih, itu berhasil, namun, sekarang paragraf di bawah ini melayang di sisi kanan.
superUtitle

2

Setelah berjuang dengan masalah menarik ini di beberapa proyek, dan menyelidiki mengapa itu terjadi, saya akhirnya percaya saya menemukan keduanya: solusi yang bekerja dan 'responsif' .

Ini adalah trik sulap, contoh hidup: http://jsfiddle.net/superKalo/phabbtnx/

ul {
    list-style: none;
    position: relative;
    padding-left: 0; /* remove any left padding */
    margin-left: 0; /* remove any left margin */
    left: 35px;
}
li {
    padding-left: 0; /* remove any left padding */
    margin-left: 0; /* remove any left margin */
    text-indent: -19px; /* adjust as much as needed */
}
li:before {
    content: '•\00a0\00a0\00a0';
    color: #000; /* bonus: you can customize the bullet color */
}

Saya menambahkan display: flex;untuk li, sehingga bulletpoint yang vertikal terpusat, ketika saya mengubah font-size dari :beforebagian.
Arany

1

Bekerja di dalam LMS tanpa akses ke kepala dokumen, merasa lebih mudah digunakan margin-right: 20pxsebagai gaya inline untuk gambar. Yang saya berhutang ke situs ini .


0

coba ini:

li{
    margin-left:5px;
}

Jika Anda ingin mereka berbelok ke kiri, cukup beri nilai - ## px.


0

atau Anda bisa melakukan ini:

 #content ul {
        background:none repeat scroll 0 0 #AACCDD;
        float:left;
        margin-right:10px;
        padding:10px;

dan kemudian hapus semua styling dari li


1
mengambang ul memang menyelesaikan masalah, namun, masalah lain muncul ... semua elemen paragraf yang muncul setelah ul melayang di sebelah kanan ul.
superTidak berjudul

memberi Anda +1 untuk itu ... Saya membuat asumsi di sini dari melihat tautan yang terkait dengan pertanyaan ini bahwa <p> akan mengambang ke kanan <ul>. Tangkapan yang bagus.
Reece


0
width: 300px;
height: 30px;
margin-left: auto;
right: 10px;

margin-left: auto akan menyebabkan elemen itu sendiri menjadi rata kanan. Atur tinggi dan lebar elemen yang Anda inginkan - di dalam saya itu adalah gambar latar belakang di dalam div


0

Anda dapat mencoba juga melayang ulke kiri, dan menentukan yang sesuai widthuntuk itu, sehingga mengapung di sebelah gambar.

Sesuatu yang mirip jsfiddle ini ?




Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.