ทำไมรายการในรายการกระสุนของฉันทับซ้อนกันองค์ประกอบลอย


166

ฉันมีหน้า (XHTML Strict) ที่ฉันลอยรูปภาพควบคู่ไปกับย่อหน้าข้อความปกติ ทุกอย่างเป็นไปด้วยดียกเว้นเมื่อมีการใช้รายการแทนย่อหน้า สัญลักษณ์แสดงหัวข้อย่อยของรายการซ้อนทับภาพลอย

การเปลี่ยนระยะขอบของรายการหรือรายการไม่ช่วยได้ อัตรากำไรขั้นต้นจะถูกคำนวณจากซ้ายของหน้า แต่ลอยผลักดันให้รายการไปทางขวาภายในliตัวเอง ดังนั้นระยะขอบจะช่วยถ้าฉันทำให้มันกว้างกว่าภาพ

การลอยรายการที่อยู่ถัดจากรูปภาพก็ใช้งานได้ แต่ฉันไม่รู้ว่าเมื่อใดที่รายการถัดจากโฟลต ฉันไม่ต้องการลอยทุกรายการในเนื้อหาของฉันเพียงเพื่อแก้ไขปัญหานี้ นอกจากนี้การลอยซ้ายจะทำให้เลย์เอาต์เสียหายเมื่อรูปภาพลอยไปทางขวาแทนที่จะซ้ายของรายการ

การตั้งค่าli { list-style-position: inside }จะย้ายสัญลักษณ์แสดงหัวข้อย่อยพร้อมกับเนื้อหา แต่ยังทำให้บรรทัดที่ตัดเพื่อเริ่มจัดตำแหน่งด้วยสัญลักษณ์แสดงหัวข้อย่อยแทนการจัดแนวกับบรรทัดด้านบน

เห็นได้ชัดว่าปัญหานี้เกิดจากกระสุนแสดงผลนอกกล่องลอยลอยผลักเนื้อหาของกล่องไปทางขวา (ไม่ใช่กล่องตัวเอง) นี่คือวิธีที่ IE และ FF จัดการกับสถานการณ์และเท่าที่ฉันรู้ไม่ผิดตามข้อมูลจำเพาะ คำถามคือฉันจะป้องกันได้อย่างไร

คำตอบ:


280

ฉันพบวิธีแก้ไขปัญหานี้แล้ว การนำไปใช้ul { overflow: hidden; }เพื่อสร้างความulมั่นใจว่ากล่องลอยถูกผลักไปด้วยกันแทนที่จะเป็นเนื้อหาของกล่อง

เฉพาะ IE6 เท่านั้นที่จำเป็นต้องมีul { zoom: 1; }ในความเห็นแบบมีเงื่อนไขของเราเพื่อให้แน่ใจว่าulมีเค้าโครง


1
+1: CSS ที่ยอดเยี่ยมฉันค้นหาอย่างบ้าคลั่งสำหรับการแก้ปัญหา GOOD VERSATILE ที่ดีและนี่ก็เป็นเช่นนั้น ข้อด้อยเพียงอย่างเดียวคือคุณสมบัติการซูมไม่ได้ตรวจสอบความถูกต้องของ CSS แต่ฉันทดสอบและใน IE7, IE8 ไม่จำเป็นดังนั้นมันอาจจะเป็นแค่สำหรับ IE6
Marco Demaio

14
เพื่อให้มันใช้งานได้จริงฉันต้องสมัครด้วย: ul, ol {ล้น: ซ่อนเร้น; padding-left: 40px; ระยะขอบซ้าย: 0; } ol li, ul li {list-style-position: outside; padding-left: 0; } สิ่งนี้บังคับให้แสดงผลที่สอดคล้องกันในเบราว์เซอร์และบังคับให้ IE6 แสดงสัญลักษณ์แสดงหัวข้อย่อย กระสุนถูกซ่อนไว้เป็นอย่างอื่น ul {zoom: 1; } ยังคงต้องการในการตั้งค่าเฉพาะ ie6 เช่นกัน
Mandrake

1
วิธีง่ายๆในการแก้ปัญหา BUG ที่ไร้สาระเช่น MSIE
เอสเอฟ

10
มันไม่ใช่ทางออกที่สมบูรณ์แบบ ตามที่ Blazemonger กล่าวถึงการระเบิดหากภาพมีขนาดเล็กและรายการมีความยาวมากรายการจะไม่ไหลไปรอบ ๆ ภาพลอย รายการจะมีระยะห่างจากด้านบนสุดถึงสุดถ้าภาพกว้างมาก
หยาง

2
ดี! ฉันไม่เห็นว่าสิ่งนี้มีเหตุผล แต่เมื่ออ่าน W3C doc บนโอเวอร์โฟลว์
MSC

66

การปรับปรุงการแก้ไขปัญหาของ 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/

ฉันชอบเทคนิคนี้เพราะมันทำงานเมื่อรายการต้องการไหลไปรอบ ๆ ภาพลอยในขณะที่overflow: hiddenเทคนิคจะไม่ อย่างไรก็ตามจำเป็นต้องเพิ่มpadding-right: 1emในliเพื่อป้องกันไม่ให้คอนเทนเนอร์ล้น


ฉันชอบการแก้ไขนี้ด้วยเช่นกันเพราะอันดับหนึ่งของ Twitter Bootstrap ของฉันหล่นลงและมันทำให้ฉันตลอดไปคิดออกว่าวิธีการข้างต้นเป็นผู้กระทำผิด
Ian Hoar

2
ขอบคุณสำหรับสิ่งนี้. ใช้ล้น: ซ่อนอยู่; กับคอนเทนเนอร์ UL ป้องกันข้อความในรายการโฆษณาแต่ละรายการไม่ให้ทำงานอย่างถูกต้องในบล็อกลอย วิธีนี้แก้ปัญหาได้!
jsdalton

1
ฉันพบปัญหาเล็กน้อย แต่สำคัญกับการแก้ไขปัญหานี้และฉันขอแนะนำให้คุณเพิ่มการปรับปรุงของคุณ ฉันไม่แน่ใจว่าทำไม แต่เมื่อคุณเพิ่มลงposition: relative;ในรายการโฆษณามันจะสร้างปัญหาการซ้อนกับเนื้อหาลอย ฉันพบ (ใน Chrome และ Firefox) ว่ามันยากที่จะวางตัวและคลิกลิงก์ในเนื้อหาที่ลอย การแก้ไขสำหรับฉันคือการเพิ่มposition: relative; z-index: 1;องค์ประกอบลอยซึ่งดูเหมือนจะแก้ไขปัญหาการซ้อน
jsdalton

7
น่าเสียดายที่บน IE 10 กระสุนถูกทับซ้อนกับองค์ประกอบลอย
Munawwar

1
ในขณะที่ul {overflow: hidden;}แก้ไขปัญหานี้ในเบราว์เซอร์ทั้งหมดการแก้ปัญหาข้างต้นเป็นวิธีแก้ไขปัญหาการทำงานเพียงอย่างเดียวสำหรับPrince XMLซึ่งเป็นตัวแปลง XHTML + CSS3 เป็น PDF
Serge Stroobandt

36

นี่คือที่ที่คุณสมบัติ "แสดง" เป็นของตัวเอง ตั้งค่า CSS ด้านล่างเพื่อให้รายการทำงานควบคู่ไปกับเนื้อหาลอย

แสดง: ตาราง; ทำงานร่วมกับเนื้อหาที่ลอยอยู่ (เติมช่องว่าง) แต่ไม่ต้องซ่อนเนื้อหาที่อยู่ด้านหลัง เหมือนกับที่โต๊ะทำ :-)

.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>

แก้ไข: อย่าลืมเพิ่มชั้นเรียนเพื่อแยกรายการที่คุณต้องการทำเช่นนี้ เช่น "ul.in-content" หรืออื่น ๆ โดยทั่วไป ". เนื้อหา ul"


29

ลองlist-style-position: ข้างในเพื่อเปลี่ยนเลย์เอาต์ของกระสุน


3
list-style-position:insideจะเป็นวิธีแก้ปัญหาที่ดี แต่ทำให้บรรทัดที่ตัดเพื่อเริ่มจัดตำแหน่งด้วยสัญลักษณ์แสดงหัวข้อย่อยแทนการจัดตำแหน่งกับบรรทัดด้านบน
Marco Demaio

ล้น: ซ่อนอยู่; ไม่ทำงานกับรูปลอยด้านซ้ายของฉัน แต่ list-style-position: inside ทำแล้ว! ขอบคุณ
menardmam

นี่เป็นทางออกเดียวที่ยังห่อเนื้อหาใน IE สำหรับฉัน ขอบคุณ!
jordan314

นี่เป็นทางออกที่ดีสำหรับเมื่อเนื้อหาลอยอยู่ระหว่างกระสุนของคุณและเนื้อหากระสุน
TylersSN

นี่ควรเป็นคำตอบที่เลือก
เงา Geek

18

ที่http://archivist.incutio.com/viewlist/css-discuss/106382ฉันพบข้อเสนอแนะที่เหมาะกับฉัน: จัดรูปแบบองค์ประกอบ 'li' ด้วย:

position: relative;
left: 1em;

โดยที่คุณแทนที่ "1em" ด้วยความกว้างของช่องว่างภายใน / ขอบซ้ายที่รายการในรายการของคุณจะมีหากไม่มีการลอยอยู่ มันใช้งานได้ดีในแอปพลิเคชันของฉันแม้กระทั่งจัดการกับกรณีที่ด้านล่างของโฟลตเกิดขึ้นกลางรายการ - กระสุนเปลี่ยนกลับไปเป็นระยะขอบซ้าย (ขวา) เพียงขวา


2
ทางออกที่ยอดเยี่ยมใช้งานได้อย่างมีเสน่ห์! แม้ว่าฉันจะต้องทำให้มือสกปรกด้วย IE7 เนื่องจากไม่สามารถแสดงหมายเลขรายการในรายการที่ไม่ติดกับองค์ประกอบที่ลอย
maryisdead

@maryisdead ทางออกของคุณสำหรับ IE7 คืออะไร?
TJ

IE7 ต้องการอัตรากำไรขั้นต้นที่เหลือจากรายการ ดูซอนี้jsfiddle.net/maryisdead/wu6ew/5และรับทราบการแฮ็กสอง IE7 ขออภัยที่ไม่ได้เพิ่มสิ่งนี้ก่อนหน้านี้ใน
maryisdead

18

ทำไมต้องoverflow: hiddenทำงาน

การแก้ปัญหาเป็นเรื่องง่ายเหมือน:

ul {overflow: hidden;}

กล่องบล็อกที่overflow:ไม่ใช่visible สร้างบริบทการจัดรูปแบบบล็อกใหม่สำหรับเนื้อหา คำแนะนำ W3C: http://www.w3.org/TR/CSS2/visuren.html#block-formatting

ตัวอย่าง

ปุ่มบนเว็บไซต์ของฉันซึ่ง<li>ปลอมตัวทำขึ้นมาเช่นนี้ ทำให้วิวพอร์ต (หน้าต่าง) ของเบราว์เซอร์ของคุณเล็กลงเพื่อดูเยื้องในการดำเนินการ

เว็บไซต์ของฉันเป็นตัวอย่าง

คำตอบที่เกี่ยวข้อง

บทความพร้อมตัวอย่าง


1
ขอบคุณที่อธิบายว่าทำไมงานนี้ (ไม่ได้กล่าวถึงในโซลูชันที่ยอมรับ)
schellmax

17

โดยการเพิ่มผลงานoverflow: auto;ของคุณulให้ฉันอย่างน้อย

ปรับปรุง

ฉันได้อัปเดตjsfiddleเพื่อให้เห็นภาพว่าเกิดอะไรขึ้น เมื่อมีการulลอยอยู่ข้างimgเนื้อหาของulจะถูกผลักโดยลอย แต่ไม่ได้ภาชนะจริง โดยการเพิ่มoverflow: autoทั้งกล่องulจะถูกผลักโดยการลอยแทนเนื้อหาเท่านั้น


13

คุณสามารถกำหนดให้กับposition: relative; left: 10px; li(คุณอาจต้องการให้มันเพิ่มเติมmargin-right: 10px;มิฉะนั้นอาจกว้างเกินไปทางด้านขวา)

หรือถ้าคุณต้องการที่จะใช้floatสำหรับul- ตามที่คนอื่นแนะนำ - คุณสามารถหยุดที่เหลือจากการลอยอยู่ด้านขวาของ ul โดยการใช้clear: leftองค์ประกอบที่ตาม ul


ขอบคุณคริสตำแหน่งนั้น: สัมพัทธ์ทำงาน ปัญหาที่จะเกิดขึ้นจากการล้างองค์ประกอบหลังจาก ul คือองค์ประกอบจะล้าง div ซ้ายลอย
superUtitled


7

คำปฏิเสธ

รายการถัดจากองค์ประกอบลอยทำให้เกิดปัญหา ในความคิดของฉันวิธีที่ดีที่สุดในการป้องกันปัญหาการลอยตัวเหล่านี้คือการหลีกเลี่ยงภาพลอยที่ตัดกับเนื้อหา นอกจากนี้ยังจะช่วยเมื่อคุณต้องสนับสนุนการออกแบบที่ตอบสนอง

การออกแบบที่เรียบง่ายของการมีภาพที่อยู่ตรงกลางระหว่างย่อหน้าจะดูน่าสนใจและให้การสนับสนุนได้ง่ายกว่าการพยายามจินตนาการให้มากเกินไป <figure>นอกจากนี้ยังเป็นหนึ่งในขั้นตอนออกไปจาก

แต่ฉันต้องการภาพลอยจริงๆ!

ตกลงดังนั้นหากคุณคลั่งไคล้หนักแน่นพอที่จะเดินไปตามเส้นทางนี้ได้มีเทคนิคสองสามอย่างที่สามารถใช้ได้

วิธีที่ง่ายที่สุดคือการทำให้รายการใช้งานoverflow: hiddenหรือoverflow: scrollเพื่อให้รายการถูกห่อหุ้มเป็นหลักซึ่งดึงการเติมกลับไปยังตำแหน่งที่เป็นประโยชน์:

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>

เทคนิคนี้มีปัญหาเล็กน้อยว่า หากรายการมีความยาวแสดงว่ามันไม่ได้ล้อมรอบรูปภาพซึ่งจะเอาชนะจุดประสงค์ทั้งหมดของการใช้floatภาพ

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>

แต่ฉันต้องการห่อรายการจริงๆ!

ตกลงดังนั้นถ้าคุณบ้าคลั่งยิ่งกว่าเดิมและคุณต้องเดินไปตามเส้นทางนี้ต่อไปจะมีอีกเทคนิคหนึ่งที่สามารถใช้ห่อรายการและบำรุงรักษากระสุน

แทนที่จะช่องว่างภายใน<ul>และพยายามที่จะได้รับมันจะประพฤติอย่างด้วยกระสุน (ซึ่งมันไม่น่าจะต้องการที่จะทำ) ใช้กระสุนเหล่านั้นออกไปจาก<ul>และให้พวกเขาไป<li>s สัญลักษณ์แสดงหัวข้อย่อยเป็นอันตรายและ<ul>เพียงแค่ไม่รับผิดชอบพอที่จะจัดการอย่างถูกต้อง

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>

พฤติกรรมการห่อนี้สามารถทำสิ่งแปลก ๆ กับเนื้อหาที่ซับซ้อนดังนั้นฉันไม่แนะนำให้เพิ่มโดยค่าเริ่มต้น มันง่ายกว่ามากในการตั้งค่าเป็นสิ่งที่สามารถเลือกได้มากกว่าสิ่งที่จะต้องถูกแทนที่


ฉันชอบตัวเลือกที่สอง แต่ข้อความเริ่มต้นด้วยสัญลักษณ์แสดงหัวข้อย่อยบนข้อความที่ยาวขึ้น (2 แถว) :-(
Arany

4

ลองทำสิ่งต่อไปนี้บนแท็ก UL ของคุณ นี้ควรดูแลกระสุนซ้อนทับภาพของคุณและคุณจะได้ไม่ต้องเลอะ Allignment list-position: insideซ้ายของคุณที่เกิดจากการ

overflow: hidden; 
padding-left: 2em; 

ฉันต้องใช้สิ่งนี้กับโซลูชันของ Blazemonger (# 2 ด้านบน) BLazemonger เพียงอย่างเดียวไม่ทำงานใน IE 9-11 และ Opera ด้วยวิธีนี้มันจะทำงานได้ในทุกเบราว์เซอร์ ทางออกของ Kamiel (# 1) ไม่ได้ผลสำหรับฉันเพราะมันซ่อนกระสุนของฉันไว้ อาจขัดแย้งกับ Bootstrap3
Leraa

3

ดิ้นรนกับตัวเอง ดีที่สุดที่ฉันจัดการคือ:

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

ข้อความไม่ได้เว้าแหว่งจริง แต่กระสุนแสดงให้เห็น


2

แก้ไขเพื่ออัปเดตตามความคิดเห็นของ OP

ตกลงแล้วก็แบ่งมันออกเป็น 2 กองซ้อนกัน

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>

ลองเปลี่ยน ul li css เป็น

ul {float: left; พื้นหลัง: สีน้ำเงิน }


ขอบคุณที่ใช้งานได้ตอนนี้ย่อหน้าด้านล่างลอยขึ้นมาทางด้านขวา
superUtitled

2

หลังจากการต่อสู้กับปัญหานี้น่าสนใจในหลายโครงการและการตรวจสอบทำไมมันเกิดขึ้นในที่สุดผมก็เชื่อว่าผมพบว่าทั้งสองคือการทำงานและ 'ตอบสนอง'วิธีการแก้ปัญหา

นี่คือเคล็ดลับมายากลตัวอย่างสด: 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 */
}

ฉันเพิ่มลงdisplay: flex;ไปliเพื่อให้กระสุนอยู่กึ่งกลางในแนวตั้งเมื่อฉันเปลี่ยนขนาดตัวอักษรของชิ้น:beforeส่วน
Arany

1

การทำงานภายใน LMS โดยไม่ต้องเข้าถึงส่วนหัวของ doc พบว่าง่ายกว่าที่จะใช้margin-right: 20pxเป็นสไตล์อินไลน์สำหรับรูปภาพ ซึ่งฉันเป็นหนี้กับเว็บไซต์นี้



0

หรือคุณสามารถทำสิ่งนี้:

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

จากนั้นลบสไตล์ทั้งหมดออกจาก li


1
การลอยตัวของ ul ช่วยแก้ปัญหาได้อย่างไร แต่มีปัญหาอีกอย่างเกิดขึ้น ... องค์ประกอบย่อหน้าทั้งหมดที่เกิดขึ้นหลังจาก ul ได้ถูกลอยไปทางขวาของ ul
superUtitled

ให้ +1 แก่คุณ ... ฉันกำลังสมมุติที่นี่จากการดูลิงค์ที่เกี่ยวข้องกับคำถามนี้ว่า <p> จะลอยไปทางขวาของ <ul> จับดี.
Reece


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

ระยะขอบซ้าย: อัตโนมัติจะทำให้องค์ประกอบอยู่ในแนวเดียวกัน ตั้งค่าความสูงและความกว้างขององค์ประกอบที่คุณต้องการ - ฉันเป็นภาพพื้นหลังใน div ข้างใน


0

คุณสามารถลองลอยulไปทางซ้ายและกำหนดความเหมาะสมwidthเพื่อให้มันลอยไปข้างๆภาพ

มีอะไรบางอย่างที่เหมือนกับjsfiddle นี้หรือไม่?




โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.