CSS เพื่อหยุดการตัดข้อความใต้รูปภาพ


87

ฉันมีมาร์กอัปต่อไปนี้:

<li id="CN2787">
  <img class="fav_star" src="images/fav.png">
  <span>Text, text and more text</span>
</li>

ฉันต้องการให้ถ้าข้อความห่อหุ้มมันจะไม่เข้าไปใน 'คอลัมน์' ของรูปภาพ ฉันรู้ว่าฉันสามารถทำได้ด้วยtable(ซึ่งฉันกำลังทำอยู่) แต่มันใช้ไม่ได้ด้วยเหตุผลนี้

ฉันได้ลองทำสิ่งต่อไปนี้แล้ว แต่ไม่ประสบความสำเร็จ:

li span {width: 100px; margin-left: 20px}
.fav_star {width: 20px}

float: rightฉันยังพยายาม

ขอบคุณ.

แก้ไข: ฉันต้องการให้มีลักษณะดังนี้:

IMG   Text starts here and keeps going... and
      wrap starts here.

ไม่เหมือน:

IMG   Text starts here and keeps going... and 
wrap starts in the space left for the image.

1
ใส่รหัสลงใน jsfiddle ได้ไหม
Hardik

ฉันคิดว่าคุณต้องชัดเจนมากขึ้นเกี่ยวกับความตั้งใจของคุณที่นี่ หากคุณไม่ต้องการให้ข้อความที่จะตัดแล้วคุณก็สามารถใช้white-space: nowrap;ในli span {...}แต่ฉันได้รับความประทับใจที่คุณกำลังพยายามที่จะทำอย่างอื่น
หัวของฉันเจ็บ

@MyHeadHurts ขอโทษ - ดูเหมือนจะชัดเจนสำหรับฉัน :) ฉันต้องการสองคอลัมน์ในบรรทัด 20px ทางซ้ายสำหรับรูปภาพ ส่วนที่เหลือเป็นข้อความ ถ้าข้อความห่อตัวฉันต้องการให้มันเริ่มบรรทัดที่สองของการตัด 20px จากด้านซ้าย (ใต้จุดเริ่มต้นของข้อความเริ่มต้น)
นิค

1
สำหรับผู้สัญจรไปมาคุณไม่จำเป็นต้องจัดการกับความกว้างตามที่คำตอบที่ยอมรับแนะนำ มันเป็นเรื่องง่ายมาก: สร้างสิ่งที่เรียกว่าบริบทการจัดรูปแบบใหม่ ดูคำตอบของ Joe Conlin สำหรับพื้นหลังเพิ่มเติมโปรดดูของฉัน
hqcasanova

1
@hqcasanova สำหรับบันทึกคำตอบของแดนได้รับการยอมรับเมื่อ 9 เดือนก่อนที่โจจะโพสต์ของเขาและ 16 เดือนก่อนคุณของคุณ ฉันจะไม่ยอมรับคำตอบของ Dan แม้ว่าจะขอบคุณที่เพิ่มทางเลือกอื่น
นิค

คำตอบ:


35

เนื่องจากคำถามนี้มีผู้เข้าชมจำนวนมากและนี่เป็นคำตอบที่ได้รับการยอมรับฉันจึงจำเป็นต้องเพิ่มข้อจำกัดความรับผิดชอบต่อไปนี้:

คำตอบนี้เฉพาะสำหรับคำถามของ OP (ซึ่งมีการกำหนดความกว้างในตัวอย่าง) ในขณะที่ใช้งานได้คุณต้องมีความกว้างสำหรับแต่ละองค์ประกอบรูปภาพและย่อหน้า เว้นแต่เป็นความต้องการของคุณฉันขอแนะนำให้ใช้โซลูชันของ Joe Conlinซึ่งโพสต์ไว้เป็นคำตอบอื่นสำหรับคำถามนี้

spanองค์ประกอบเป็นองค์ประกอบแบบอินไลน์คุณจะไม่สามารถเปลี่ยนความกว้างใน CSS

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

display: block;

อีกวิธีหนึ่งซึ่งมักจะทำให้รู้สึกมากขึ้นคือการใช้องค์ประกอบเป็นผู้ปกครองสำหรับคุณ<p><span>

<li id="CN2787">
  <img class="fav_star" src="images/fav.png">
  <p>
     <span>Text, text and more text</span>
  </p>
</li>

เนื่องจาก<p>เป็นblockองค์ประกอบคุณสามารถตั้งค่าความกว้างโดยใช้ CSS โดยไม่ต้องเปลี่ยนแปลงอะไร

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

li p{width: 100px; margin-left: 20px}
.fav_star {width: 20px;float:left}

PS แทนที่จะfloat:leftในภาพคุณยังสามารถใส่float:rightในli pแต่ในกรณีที่คุณยังจะต้องมีtext-align:leftการปรับเปลี่ยนข้อความได้อย่างถูกต้อง

PSS หากคุณดำเนินการแก้ปัญหาแรกในการไม่เพิ่ม<p>องค์ประกอบ CSS ของคุณควรมีลักษณะดังนี้:

li span{width: 100px; margin-left: 20px;display:block}
.fav_star {width: 20px;float:left}

นี่เป็นประโยชน์จริงๆ ฉันเปลี่ยนspanเป็นpองค์ประกอบ li p {margin-left: 40px} .fav_star {float: left}แล้วก็ทั้งสองดูเหมือนจะทำเคล็ดลับ: ความกว้างของรูปภาพถูกกำหนดโดยรูปภาพเองpองค์ประกอบจะเป็น a โดยอัตโนมัติblockและฉันปล่อยความกว้างไว้เพียงอย่างเดียว ขอบคุณสำหรับสิ่งนี้.
นิค

2
หากคุณจะใช้display:blockคุณอาจใช้ a divเพราะนั่นคือสิ่งที่มีไว้เพื่อ (หรือใช้pตามที่คุณแนะนำ) ไม่จำเป็นต้องตัดข้อความซ้ำสองครั้ง - หากคุณใช้pไฟล์span.
Gareth

IMO คุณไม่ควรใช้ HTML เพื่อเปลี่ยนการออกแบบหน้าเว็บของคุณ นี่คืองานสำหรับ CSS (แน่นอนว่ามีข้อยกเว้นโดยเฉพาะเมื่อคุณต้องการความเข้ากันได้ข้ามเบราว์เซอร์) ฉันเชื่อว่าการใช้ HTML ที่เหมาะสมและการมี "ความหมายที่ดี" นั้นสำคัญกว่า ดังนั้นฉันจะไม่ใช้ a divในกรณีนี้มันpสมเหตุสมผลกว่า การสูญเสียสิ่งspanนี้เป็นเรื่องเล็กน้อยสำหรับฉันและขึ้นอยู่กับว่าคุณจัดวางเนื้อหาของคุณอย่างไร
แดน

ห่อ<span>ใน<p>เป็นคาถาออกตรงของ Hogwartz! ทำงานได้อย่างสวยงาม!
Janus

254

คำตอบง่ายๆสำหรับปัญหานี้ที่ดูเหมือนจะดึงดูดผู้คนจำนวนมาก:

<img src="url-to-image">
<p>Nullam id dolor id nibh ultricies vehicula ut id elit.</p>

    img {
        float: left;
    }
    p {
        overflow: hidden;
    }

ดูตัวอย่าง: http://jsfiddle.net/vandigroup/upKGe/132/


11
นี่คือคำตอบที่ถูกต้องสำหรับคำถามนี้ เทคนิคนี้ไม่จำเป็นต้องตั้งค่าความกว้างคงที่ให้กับย่อหน้า วิธีแก้ปัญหาที่ง่ายและสะดวกกว่ามาก ทำงานได้อย่างสมบูรณ์แม้ใน IE8
chocolata

4
อันที่จริงสิ่งนี้จะใช้ไม่ได้หากองค์ประกอบที่มีข้อความเป็น a span(กรณีของ OP) จะจำเป็นสำหรับdisplay: block spanแต่การประหยัดนั้นฉันยอมรับว่ามันเป็นวิธีที่ดีกว่ามาก ในกรณีที่ใครสงสัยว่าเวทมนตร์เบื้องหลังoverflow: hiddenคืออะไรดูคำตอบของฉันด้านล่าง
hqcasanova

8
ไม่ใช่พฤติกรรมที่ฉันคาดหวัง แต่นี่ยอดเยี่ยมมาก
Gavin

2
สำหรับบันทึกคำตอบนี้เกิดขึ้น 8 เดือนหลังจากที่ฉันเลือก :)
นิค

2
ว้าว. ทำงานได้อย่างสมบูรณ์แบบ ไม่อยากจะเชื่อเลยว่าฉันไม่เคยรู้เรื่องนี้มาก่อน
SFlagg

25

สำหรับผู้ที่ต้องการข้อมูลพื้นฐานนี่คือบทความสั้น ๆ ที่อธิบายว่าเหตุใดจึงoverflow: hiddenใช้ได้ มันจะทำอย่างไรกับสิ่งที่เรียกว่าบริบทการจัดรูปแบบบล็อก นี่เป็นส่วนหนึ่งของข้อมูลจำเพาะของ W3C (กล่าวคือไม่ใช่แฮ็ก) และโดยพื้นฐานแล้วเป็นภูมิภาคที่ถูกครอบครองโดยองค์ประกอบที่มีโฟลว์ประเภทบล็อก

ทุกครั้งที่ใช้overflow: hiddenจะสร้างบริบทการจัดรูปแบบบล็อกใหม่ แต่ไม่ใช่คุณสมบัติเดียวที่สามารถกระตุ้นพฤติกรรมนั้นได้ อ้างถึงงานนำเสนอโดย Fiona Chan จาก Sydney Web Apps Group:

  • ลอย: ซ้าย / ขวา
  • ล้น: ซ่อน / อัตโนมัติ / เลื่อน
  • display: table-cell และค่าที่เกี่ยวข้องกับตาราง / inline-block
  • ตำแหน่ง: แน่นอน / คงที่

1
คุณสามารถเพิ่มรายละเอียดบางส่วนจากบทความนั้นลงในคำตอบของคุณได้หรือไม่ในกรณีที่ลิงก์นั้นเสีย

สวัสดีตอนเช้าออสเตรเลีย! ขอบคุณสำหรับความคิดเห็น
hqcasanova

สิ่งนี้ยอดเยี่ยมสำหรับการแสดงบล็อกโค้ดที่อาจต้องต่อสู้กับรูปภาพหรือแถบด้านข้างที่ลอยอยู่ใกล้ ๆ
AlexMA

เทคนิคตามที่อธิบายไว้ในตอนแรกใช้งานได้ดีแม้ว่าจะเป็นอย่างที่คนอื่นพูด แต่ก็ไม่ใช่พฤติกรรมที่ฉันคาดหวัง อย่างไรก็ตามฉันไม่เห็นว่า float หรือ inline-block ทำงานโดยไม่มีการโอเวอร์โฟลว์และแน่นอนว่าค่าการแสดงผลที่เกี่ยวข้องกับตารางและตำแหน่งสัมบูรณ์หรือคงที่มีผลลัพธ์ของเค้าโครงอื่น ๆ ที่อาจยอมรับหรือไม่อาจยอมรับได้ในบริบท
ปริศนา

3

หากคุณต้องการmargin-leftให้ทำงานกับspanองค์ประกอบคุณจะต้องสร้างมันขึ้นมาdisplay: inline-blockหรือdisplay:blockเช่นกัน


อาจจำเป็นต้องvertical-align: top;มีภาพนี้ด้วยเช่นกัน
ThinkingStiff

2

การตั้งค่าdisplay:flexสำหรับข้อความใช้ได้ผลสำหรับฉัน


ดูเหมือนว่าจะเป็นการตั้งค่าที่ทันสมัยoverflow:autoกว่า ฉันแน่ใจว่ามันไม่ได้ผลเหมือนกันในทุกสถานการณ์ แต่มันก็ใช้ได้ผลเช่นกัน
Matt Browne

1

ตัด div รอบรูปภาพและช่วงและเพิ่มสิ่งต่อไปนี้ใน CSS ดังนี้:

HTML

        <li id="CN2787">
          <div><img class="fav_star" src="images/fav.png"></div>
          <div><span>Text, text and more text</span></div>
        </li>

CSS

            #CN2787 > div { 
                display: inline-block;
                vertical-align: top;
            }

            #CN2787 > div:first-of-type {
                width: 35%;
            }

            #CN2787 > div:last-of-type {
                width: 65%;
            }

น้อย

        #CN2787 {
            > div { 
                display: inline-block;
                vertical-align: top;
            }

            > div:first-of-type {
                width: 35%;
            }
            > div:last-of-type {
                width: 65%;
            }
        }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.