บล็อกการแสดงผลที่ไม่มีความกว้าง 100%


98

ฉันต้องการตั้งค่าองค์ประกอบช่วงให้ปรากฏด้านล่างองค์ประกอบอื่นโดยใช้คุณสมบัติการแสดงผล ฉันลองใช้อินไลน์บล็อก แต่ไม่ประสบความสำเร็จและคิดว่าฉันสามารถใช้บล็อกได้หากฉันพยายามหลีกเลี่ยงไม่ให้องค์ประกอบมีความกว้าง 100% (ฉันไม่ต้องการให้องค์ประกอบ "ยืดออก") สิ่งนี้สามารถทำได้หรือถ้าไม่ praxis ที่ดีสำหรับการแก้ปัญหาประเภทนี้คืออะไร?

ตัวอย่าง: รายการข่าวที่ฉันต้องการตั้งค่าลิงก์ "อ่านเพิ่มเติม" ที่ส่วนท้ายของแต่ละโพสต์ (หมายเหตุ: <a>แทน<span>)

<li>
<span class="date">11/15/2012</span>
<span class="title">Lorem ipsum dolor</span>
<a class="read-more">Read more</a> 
</li>


อัปเดต: แก้ไขแล้ว ใน CSS ใช้

li {
    clear: both;
}
li a {
    display: block;
    float: left;
    clear: both;
}

1
คุณมีมาร์กอัป (HTML หรือ CSS) ที่จะแสดงให้เราเห็นหรือไม่? เป็นการยากที่จะแก้ไขปัญหาโดยไม่มีอะไรให้ใช้งานได้จริง นอกจากนี้การสาธิตเกี่ยวกับjsfiddleก็น่าจะดี
Tom Oakley

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

คุณสามารถลดมาร์กอัปทั้งหมดได้อย่างจริงจังโดยใช้โค้ดเพียงบรรทัดเดียวตามที่ฉันกล่าวไว้ด้านล่าง
ha404

คำตอบ:


76

หากฉันเข้าใจคำถามของคุณอย่างถูกต้อง CSS ต่อไปนี้จะลอยอยู่ใต้ช่วงและป้องกันไม่ให้มีความกว้าง 100%:

a {
    display: block; 
    float: left; 
    clear: left; 
}

ฉันลองใช้สิ่งนี้ แต่เนื่องจากองค์ประกอบช่วง (ชื่อเรื่องและวันที่ในตัวอย่าง) ไม่มีลอยลิงก์จึงถูกวางตำแหน่งก่อนช่วงสุดท้าย เดาวิธีแก้ปัญหาอย่างหนึ่งคือทำให้องค์ประกอบลูกทั้งหมดใน Li ลอย
Staffan Estberg

สิ่งนี้ใช้ได้ผลถ้าฉันใช้ clearfix สำหรับผู้ปกครอง li จะไปกับโซลูชันนี้ขอบคุณ PJ
Staffan Estberg

158

ใช้display: table.

คำตอบนี้ต้องมีอย่างน้อย 30 อักขระ ฉันอายุ 20 แล้วนี่คือข้อมูลเพิ่มเติมเล็กน้อย


13
โซลูชันอัจฉริยะ margin: 0 auto;หากคุณต้องการให้อยู่กึ่งกลาง
Mafia

4
ฉันคิดว่าคุณยอดเยี่ยมมาก
billynoah

1
display: table;ใช้งานได้ แต่ไม่ยอมรับช่องว่างภายในใด ๆ
donquixote

@ ha404 คุณพูดถูกช่องว่าง! jsfiddle.net/wgj7xvLe/4อย่างน้อยในเบราว์เซอร์ของฉัน (Chromium)
donquixote

3
@donquixote ควรยอมรับช่องว่างภายในตราบใดที่คุณใช้ border-ยุบ: แยก เพิ่งมีปัญหานั้น
Brad

32

คุณสามารถใช้ได้:

width: max-content;

หมายเหตุ: การสนับสนุนมี จำกัดตรวจสอบรายละเอียดทั้งหมดของเบราว์เซอร์ที่รองรับได้ที่นี่


ฉันไม่เคยได้ยินเรื่องนี้มาก่อน! น่าสนใจ.
Ryan

เป็นสิ่งที่ดีตั้งแต่ Chrome 46 และ FF 66 ควรได้รับคำตอบ inline-blockและคณะทำลายเค้าโครงของฉัน
i336_

1
@ i336_ ณ วันนี้เบราว์เซอร์ Edge ยังไม่รองรับ
ChrisW

Edge หรือ Chromium Edge? (เพื่อความชัดเจนอดีตกำลังจะเปลี่ยนผ่านไปสักพัก ... )
i336_

อ้างอิงจาก caniuse.com ได้รับการสนับสนุนใน Edge ณ Edge 79 ที่เผยแพร่ในวันที่ 14 มกราคม 2020 โดยรวมแล้วมีคะแนนสนับสนุน 92% caniuse.com/?search=max-contentนี่คือการต้อนรับที่ดีสำหรับฉัน เมื่อฉันได้ยินเรื่องนี้ครั้งแรกเมื่อเกือบ 2 ปีที่แล้วมันไม่มีการรองรับที่กว้างพอสำหรับฉันที่จะใช้ในการผลิต แต่ตอนนี้มันทำได้แล้ว
Xandor

7

ฉันจะให้แต่ละแถวเป็น div ของตัวเองดังนั้น ...

<div class="row">
    <div class="cell">Content</div>
</div>
<div class="row">
    <div class="cell">Content</div>
</div>

จากนั้นสำหรับ CSS:

.cell{display:inline-block}

เป็นการยากที่จะให้คำตอบแก่คุณโดยไม่ต้องดูรหัสเดิมของคุณ


1
ขอบคุณ แต่ฉันไม่ต้องการผสมในองค์ประกอบ div ใด ๆ
Staffan Estberg

5

อีกครั้ง: คำตอบที่อาจจะสายไปหน่อย (แต่สำหรับผู้ที่พบหน้านี้เพื่อหาคำตอบ)

แทนที่จะ display:block;ใช้display:inline-block;



2

คุณสามารถใช้สิ่งต่อไปนี้:

display: inline-block;

ทำงานได้ดีกับลิงก์และองค์ประกอบอื่น ๆ


1

ฉันมีปัญหานี้ฉันแก้ไขได้ดังนี้:

.parent {
  white-space: nowrap;
  display: table;
}

.child {
  display: block;
}

"white-space: nowrap" ตรวจสอบให้แน่ใจว่าส่วนย่อยของเด็ก (ถ้ามี) จะไม่ห่อขึ้นบรรทัดใหม่หากมีพื้นที่ไม่เพียงพอ

ไม่มี "white-space: nowrap":

ป้อนคำอธิบายภาพที่นี่

ด้วย "white-space: nowrap":

ป้อนคำอธิบายภาพที่นี่


แก้ไข: ดูเหมือนว่ามันจะใช้งานได้โดยไม่มีส่วนบล็อกลูกสำหรับฉันดังนั้นแค่นี้ดูเหมือนจะใช้ได้ดี

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