Tại sao các mục trong danh sách của tôi lại chồng lên các phần tử nổi


166

Tôi có một trang (XHTML Strict) nơi tôi nổi một hình ảnh bên cạnh các đoạn văn bản thông thường. Tất cả đều tốt, ngoại trừ khi một danh sách được sử dụng thay vì đoạn văn. Các viên đạn của danh sách chồng lên hình ảnh nổi.

Thay đổi lề của danh sách hoặc các mục danh sách không giúp ích. Chênh lệch được tính từ bên trái của trang, nhưng phao đẩy các mục danh sách bên phải trong các lichính nó. Vì vậy, lề chỉ giúp nếu tôi làm cho nó rộng hơn hình ảnh.

Nổi danh sách bên cạnh hình ảnh cũng hoạt động, nhưng tôi không biết khi nào danh sách bên cạnh nổi. Tôi không muốn nổi mọi danh sách trong nội dung của mình chỉ để sửa lỗi này. Ngoài ra, nổi bên trái làm rối bố cục khi một hình ảnh được thả sang bên phải thay vì bên trái của danh sách.

Cài đặt li { list-style-position: inside }sẽ di chuyển các viên đạn cùng với nội dung, nhưng nó cũng khiến các đường bao bọc bắt đầu thẳng hàng với viên đạn, thay vì căn chỉnh với dòng trên.

Vấn đề rõ ràng là do viên đạn được đưa ra bên ngoài hộp, phao đẩy nội dung của hộp sang bên phải (không phải chính hộp). Đây là cách IE và FF xử lý tình huống, và theo như tôi biết, không sai theo thông số kỹ thuật. Câu hỏi là, làm thế nào tôi có thể ngăn chặn nó?

Câu trả lời:


280

Tôi đã tìm thấy một giải pháp cho vấn đề này. Áp dụng một ul { overflow: hidden; }để ulđảm bảo rằng hộp được đẩy sang một bên bởi phao, thay vì nội dung của hộp.

Chỉ IE6 cần một ul { zoom: 1; }nhận xét có điều kiện của chúng tôi để đảm bảo ulbố cục có bố cục.


1
+1: CSS tuyệt vời, tôi đã tìm kiếm một cách điên rồ cho một giải pháp VERSATILE TỐT và đây là trên SO. Hạn chế nhỏ duy nhất là thuộc tính thu phóng không xác thực CSS, nhưng tôi đã thử nghiệm và trên IE7, IE8 không cần thiết, vì vậy có lẽ nó chỉ dành cho IE6.
Marco Demaio

14
Để làm cho điều này thực sự hoạt động, tôi cũng phải áp dụng: ul, ol {overflow: hidden; đệm-trái: 40px; lề trái: 0; } ol li, ul li {list-style-location: bên ngoài; đệm-trái: 0; } Điều này buộc kết xuất nhất quán trên các trình duyệt và buộc IE6 hiển thị các viên đạn. Những viên đạn được giấu khác. Các ul {zoom: 1; } vẫn được yêu cầu trong cài đặt cụ thể tức là6.
Mandrake

1
Vì vậy, giải pháp đơn giản đến nực cười cho BUG lố bịch như vậy trong MSIE.
SF.

10
Nó không phải là một giải pháp hoàn hảo. Như Blazemonger đã đề cập, nếu hình ảnh nhỏ và danh sách rất dài, danh sách sẽ không chảy xung quanh hình ảnh nổi. Danh sách sẽ có một lề rất lớn từ đầu đến cuối nếu hình ảnh rất rộng.
dương

2
Đẹp! Tuy nhiên, tôi không thể thấy điều này có ý nghĩa như thế nào, khi đọc tài liệu W3C khi tràn: w3schools.com/cssref/pr_pose_overflow.asp
MSC

66

Thêm một cải tiến cho giải pháp của 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/

Tôi thích kỹ thuật này, vì nó hoạt động khi danh sách cần chảy xung quanh hình ảnh nổi, trong khi overflow: hiddenkỹ thuật thì không. Tuy nhiên, cũng cần phải thêm padding-right: 1emvào liđể giữ cho chúng không bị tràn ra khỏi thùng chứa của chúng.


Tôi cũng thích cách khắc phục này vì cái trên cùng đã phá vỡ các thả xuống Bootstrap Twitter của tôi và tôi phải mất mãi mãi để nhận ra rằng phương pháp trên là thủ phạm.
Ian Hoar

2
Cảm ơn vì điều đó. Áp dụng tràn: ẩn; đến bộ chứa UL đã ngăn văn bản trong các chi tiết đơn hàng riêng lẻ chạy xung quanh khối nổi. Giải pháp này đã làm được mẹo!
jsdalton

1
Tôi gặp phải một vấn đề nhỏ nhưng quan trọng với giải pháp này và tôi muốn đề xuất một bổ sung cho sự cải thiện của bạn. Tôi không chắc tại sao, nhưng khi bạn thêm position: relative;vào chi tiết đơn hàng, nó sẽ tạo ra vấn đề xếp chồng với nội dung nổi. Tôi thấy (trong Chrome và Firefox) rất khó để di chuột và nhấp vào các liên kết trong nội dung nổi. Cách khắc phục đối với tôi là thêm position: relative; z-index: 1;vào phần tử nổi, dường như để giải quyết vấn đề xếp chồng.
jsdalton

7
Thật không may, trên IE 10, các viên đạn trùng với phần tử nổi.
Munawwar

1
Trong khi ul {overflow: hidden;}giải quyết vấn đề này trong tất cả các trình duyệt, giải pháp trên là biện pháp khắc phục duy nhất cho vấn đề này với Prince XML , trình chuyển đổi XHTML + CSS3 sang PDF.
Serge Stroobandt

36

Đây là nơi mà tài sản "hiển thị" trở thành của riêng nó. Đặt CSS bên dưới để làm cho danh sách hoạt động cùng với nội dung nổi.

hiển thị: bảng; hoạt động cùng với nội dung nổi (lấp đầy khoảng trống) nhưng không che giấu nội dung đằng sau nó. Giống như một cái bàn :-)

.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: Hãy nhớ thêm một lớp để cô lập danh sách mà bạn muốn làm điều này cho. Ví dụ: "ul.in-content" hoặc nói chung hơn là ".content ul"


29

Hãy thử list-style-location: bên trong để thay đổi cách bố trí các viên đạn.


3
list-style-position:insidesẽ là một giải pháp tuyệt vời, nhưng làm cho các đường bao bọc bắt đầu căn chỉnh với viên đạn, thay vì căn chỉnh với dòng trên.
Marco Demaio

tràn: ẩn; không làm việc cho hình ảnh nổi bên trái của tôi, nhưng danh sách kiểu-phong cách: bên trong đã làm điều đó! cảm ơn
menardmam

Đây là giải pháp duy nhất vẫn bao bọc nội dung trong IE đối với tôi. Cảm ơn!
jordan314

Đây là một giải pháp tuyệt vời khi nội dung nổi giữa đạn của bạn và nội dung đạn.
TylersSN

Đây nên là câu trả lời được lựa chọn.
Kiểu dáng đẹp Geek

18

Tại http://archivist.incutio.com/viewlist/css-discuss/106382 tôi đã tìm thấy một đề xuất phù hợp với tôi: tạo kiểu cho các yếu tố 'li' với:

position: relative;
left: 1em;

Nơi bạn thay thế "1em" bằng chiều rộng của phần đệm / lề trái mà các mục trong danh sách của bạn sẽ có nếu phần nổi không xuất hiện. Điều này hoạt động rất tốt trong ứng dụng của tôi, thậm chí xử lý trường hợp đáy phao xảy ra ở giữa danh sách - các viên đạn dịch ngược về lề trái (cục bộ) ngay bên phải.


2
Giải pháp tuyệt vời, hoạt động như một cơ duyên! Mặc dù tôi đã bị bẩn tay với IE7 vì nó không thể hiển thị số mục danh sách trong danh sách không nằm cạnh phần tử nổi.
quản lý

@mary thẩmead Giải pháp cho IE7 của bạn là gì?
TJ.

IE7 cần thêm một lề trái trên các mục danh sách. Xem fiddle jsfiddle.net/mary thẩmead / wu6ew/5 này và lưu ý về hai bản hack IE7. Xin lỗi vì đã không thêm điều này sớm hơn.
maryonomead 28/03 '

18

Tại sao overflow: hiddenlàm việc

Giải pháp dễ như:

ul {overflow: hidden;}

Một hộp khối overflow:khác với visible việc thiết lập bối cảnh định dạng khối mới cho nội dung của nó. Đề xuất của W3C: http://www.w3.org/TR/CSS2/visuren.html#block-formatted

Thí dụ

Các nút trên trang web của tôi , được <li>ngụy trang, được làm như thế này. Làm cho khung nhìn (cửa sổ) của trình duyệt của bạn nhỏ hơn để thấy sự thụt lề trong hành động .

Trang web của tôi là một ví dụ

Câu trả lời liên quan

Bài viết với ví dụ


1
cảm ơn vì đã giải thích lý do tại sao điều này hoạt động (không được đề cập trong giải pháp được chấp nhận)
schellmax

17

Bằng cách thêm overflow: auto;vào các ultác phẩm của bạn cho tôi ít nhất.

Cập nhật

Tôi đã cập nhật jsfiddle của mình để hình dung những gì đang diễn ra. Khi có phần ulnổi bên cạnh img, nội dung của phần nổi ulsẽ được đẩy bởi phần nổi, nhưng không phải là phần chứa thực tế. Bằng cách thêm overflow: autotoàn bộ hộp ulsẽ được đẩy bằng float thay vì chỉ nội dung.


13

Bạn có thể gán position: relative; left: 10px;cho li. (Bạn cũng có thể muốn cung cấp cho nó margin-right: 10px;, nếu không nó có thể trở nên quá rộng ở phía bên phải.)

Hoặc, nếu bạn muốn sử dụng floatcho ul- như được đề xuất bởi người khác - bạn có thể ngăn phần còn lại nổi bên phải của ul bằng cách sử dụng clear: lefttrên phần tử theo sau ul.


cảm ơn chris, vị trí đó: tương đối làm việc vấn đề sẽ phát sinh từ việc xóa phần tử sau ul là phần tử cũng sẽ xóa div nổi bên trái.
superUntitle

7

Tôi đang sử dụng điều này để giải quyết vấn đề này:

ul {
   display: table;
}

7

Khước từ

Danh sách bên cạnh các yếu tố nổi gây ra vấn đề. Theo tôi, cách tốt nhất để ngăn chặn các loại vấn đề nổi này là tránh các hình ảnh nổi giao nhau với nội dung. Nó cũng sẽ giúp ích khi bạn phải hỗ trợ thiết kế đáp ứng.

Một thiết kế đơn giản có hình ảnh trung tâm giữa các đoạn sẽ trông rất hấp dẫn và dễ hỗ trợ hơn nhiều so với cố gắng để trở nên quá lạ mắt. Đó cũng là một bước đi từ a <figure>.

Nhưng tôi thực sự muốn hình ảnh nổi!

Ok, vì vậy nếu bạn đủ điên rồ để tiếp tục con đường này, có một số kỹ thuật có thể được sử dụng.

Đơn giản nhất là làm cho danh sách được sử dụng overflow: hiddenhoặc overflow: scrollsao cho danh sách về cơ bản được thu nhỏ lại, điều đó kéo phần đệm trở lại nơi hữu ích:

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>

Kỹ thuật này có một vài vấn đề mặc dù. Nếu danh sách dài, nó không thực sự bao quanh hình ảnh, điều này đánh bại khá nhiều mục đích sử dụng floattrên hình ảnh.

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>

Nhưng tôi thực sự muốn danh sách gói!

Ok, vì vậy nếu bạn thậm chí còn điên rồ hơn và bạn nhất định phải tiếp tục đi theo con đường này, có một kỹ thuật khác có thể được sử dụng để bọc các mục danh sách và duy trì đạn.

Thay vì đệm <ul>và cố gắng làm cho nó hoạt động tốt với những viên đạn (điều mà dường như không bao giờ muốn làm), hãy lấy những viên đạn đó ra khỏi <ul>và đưa chúng cho <li>s. Đạn rất nguy hiểm và <ul>không đủ trách nhiệm để xử lý chúng đúng cách.

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>

Hành vi gói này có thể làm những điều kỳ lạ đối với nội dung phức tạp, vì vậy tôi không khuyên bạn nên thêm nó theo mặc định. Dễ dàng hơn nhiều để thiết lập nó như một thứ có thể được chọn tham gia thay vì một cái gì đó phải được ghi đè.


Tôi thích tùy chọn thứ hai, nhưng văn bản thực sự bắt đầu bằng các gạch đầu dòng trên các văn bản dài hơn (2 hàng) :-(
Arany

4

Hãy thử làm như sau trên thẻ UL của bạn. Điều này sẽ quan tâm đến các viên đạn che phủ hình ảnh của bạn và bạn không phải làm rối tung sự phân bổ bên trái của mình gây ra list-position: inside.

overflow: hidden; 
padding-left: 2em; 

Tôi đã phải sử dụng điều này với giải pháp của Blazemonger (số 2 ở trên). BLazemonger một mình không hoạt động trong IE 9-11 và Opera. Với điều này, nó hoạt động trong tất cả các trình duyệt. Giải pháp của Kamiel (# 1) không hiệu quả với tôi vì nó giấu đạn của tôi. Xung đột với Bootstrap3 có lẽ.
Leraa

3

Đấu tranh với bản thân mình Tốt nhất tôi đã quản lý là như sau:

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

Các văn bản không thực sự thụt lề nhưng đạn cho thấy.


2

Đã chỉnh sửa để cập nhật dựa trên nhận xét của OP

ok, sau đó chỉ cần chia nó thành 2 div lồng vào nhau

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>

thử thay đổi ul li css thành

ul {float: trái; nền: màu xanh; }


cảm ơn, điều đó hoạt động, tuy nhiên, bây giờ các đoạn bên dưới đang nổi lên phía bên phải.
siêu tiêu đề

2

Sau khi đấu tranh với vấn đề thú vị này trong một số dự án và điều tra lý do tại sao nó xảy ra, cuối cùng tôi tin rằng tôi đã tìm thấy cả hai: một giải pháp hiệu quả và 'đáp ứng' .

Đây là trò ảo thuật, ví dụ trực tiếp: 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 */
}

Tôi đã thêm display: flex;vào li, để dấu đầu dòng được căn giữa theo chiều dọc, khi tôi thay đổi kích thước phông chữ của :beforephần.
Arany

1

Làm việc bên trong một LMS mà không có quyền truy cập vào phần đầu của tài liệu, nhận thấy nó dễ dàng hơn với margin-right: 20pxkiểu kiểu nội tuyến cho hình ảnh. Mà tôi nợ trang web này .


0

thử cái này:

li{
    margin-left:5px;
}

Nếu bạn muốn chúng đi bên trái, chỉ cần đặt giá trị - ## px.


0

hoặc bạn có thể làm điều này:

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

và sau đó loại bỏ tất cả các kiểu dáng từ li


1
nổi ul thực sự giải quyết được vấn đề, tuy nhiên, một vấn đề khác phát sinh ... tất cả các yếu tố đoạn đến sau khi ul được thả sang bên phải của ul.
siêu tiêu đề

đã cho bạn +1 cho điều đó ... Tôi đã đưa ra một giả định ở đây khi nhìn vào liên kết liên quan đến câu hỏi này rằng <p> sẽ nổi bên phải <ul>. Nắm bắt tốt.
Reece


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

lề trái: tự động sẽ làm cho chính phần tử được căn phải. Đặt chiều cao và chiều rộng của phần tử bạn muốn - trong đó là hình nền trong div bên trong


0

Bạn cũng có thể thử nổi ulbên trái và xác định một mức thích hợp widthcho nó, để nó nổi bên cạnh hình ảnh.

Một cái gì đó giống như jsfiddle này ?




-1

Thêm display:table; vào ul:

ul{display:table;}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.