ฉันจะทำให้ div ไม่ใหญ่กว่าเนื้อหาได้อย่างไร


2070

ฉันมีเค้าโครงคล้ายกับ:

<div>
    <table>
    </table>
</div>

ฉันต้องการdivขยายให้กว้างเท่าที่ฉันtableต้องการ


90
เอฟเฟกต์นี้เรียกว่า "shrinkwrapping" และตามที่ได้รับคำตอบมีสองวิธีในการทำเช่นนี้ (float, inline, min / max-width) ซึ่งทั้งหมดมีผลข้างเคียงให้เลือก
annakata

คำตอบ:


2426

การแก้ปัญหาคือการตั้งค่าของคุณจะdivdisplay: inline-block


239
@ leif81 คุณสามารถใช้spanหรือdivหรือulหรือสิ่งอื่นใดในส่วนที่สำคัญสำหรับภาชนะที่คุณอยากจะเป็นขั้นต่ำกว้างมี CSS ทรัพย์สินdisplay: inline-block
miahelf

10
หากมีคนสงสัยว่า: เราสามารถจัดวางพาเรนต์ของตารางโดยการตั้งค่า "text-align: center" บนพาเรนต์และ "text-align: left" ที่มัน (เช่น <body style = "text-align: center"> < span style = "จัดเรียงข้อความ: ซ้ายแสดง: inline-block;"> <table> ... </table> </span> </body>)
bernstein

12
มันใช้งานไม่ได้กับ chrome สำหรับฉันด้วย span แต่ใช้ได้กับ white-space: nowrap;
albanx

57
โปรดทราบว่าเมื่อคุณdisplay: inline-blockตั้งค่าคุณสมบัติแล้วmargin: 0 auto;จะไม่ทำงานอย่างที่คาดไว้ ในกรณีที่ว่าถ้าคอนเทนเนอร์หลักได้text-align: center;แล้วinline-blockองค์ประกอบที่จะเป็นศูนย์กลางในแนวนอน
Savas Vedova

12
inline-blockไม่ทำงานสำหรับฉัน แต่inline-flexไม่ได้
mareoraft

331

คุณต้องการองค์ประกอบบล็อกที่มีสิ่งที่ CSS เรียกว่าลดขนาดให้พอดีกับความกว้างและสเป็คไม่ได้ให้วิธีการที่มีความสุขที่จะได้รับสิ่งดังกล่าว ใน CSS2 การย่อขนาดไม่ได้เป็นเป้าหมาย แต่หมายถึงการจัดการกับสถานการณ์ที่เบราว์เซอร์ "ต้อง" รับความกว้างจากอากาศที่บาง สถานการณ์เหล่านั้นคือ:

  • ลอย
  • องค์ประกอบตำแหน่งอย่างแน่นอน
  • องค์ประกอบแบบอินไลน์บล็อก
  • องค์ประกอบตาราง

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

การตัดสินใจไม่เปิดเผยคุณสมบัติโดยตรงอาจดูแปลก แต่มีเหตุผลที่ดี มันแพง. ย่อขนาดให้พอดีหมายถึงการจัดรูปแบบอย่างน้อยสองครั้ง: คุณไม่สามารถเริ่มการจัดรูปแบบองค์ประกอบจนกว่าคุณจะทราบความกว้างและคุณไม่สามารถคำนวณความกว้างที่ไม่มีเนื้อหาทั้งหมด นอกจากนี้องค์ประกอบหนึ่งไม่จำเป็นต้องมีองค์ประกอบที่หดตัวได้บ่อยเท่าที่คิด ทำไมคุณต้องการ div พิเศษรอบโต๊ะของคุณ บางทีคำบรรยายตารางเป็นสิ่งที่คุณต้องการ


34
ฉันจะบอกinline-blockว่ามีจุดมุ่งหมายเพื่อสิ่งนี้และแก้ไขปัญหาได้อย่างสมบูรณ์แบบ
เอง

6
ฉันคิดว่าพวกเขากำลังเพิ่มใน css4 และมันจะเป็นcontent-box, max-content, min-content, available, fit-content, auto
Muhammad Umer

4
fit-contentคำหลักใหม่(ไม่มีอยู่จริงเมื่อคำตอบนี้ถูกเขียนขึ้นครั้งแรกและยังไม่ได้รับการสนับสนุนอย่างเต็มที่ ) ช่วยให้คุณสามารถปรับขนาด "ลดขนาดให้พอดี" กับองค์ประกอบได้อย่างชัดเจนโดยไม่จำเป็นต้องใช้แฮ็คใด ๆ โชคดีพอที่จะกำหนดเป้าหมายเบราว์เซอร์ด้วยการสนับสนุนเท่านั้น +1 อย่างไรก็ตาม สิ่งเหล่านี้ยังคงมีประโยชน์สำหรับตอนนี้!
Mark Amery

floatทำในสิ่งที่ฉันต้องทำ!
nipunasudha

228

ฉันคิดว่าใช้

display: inline-block;

จะทำงานได้ แต่ฉันไม่แน่ใจเกี่ยวกับความเข้ากันได้ของเบราว์เซอร์


อีกวิธีหนึ่งคือการห่อของคุณdivในอีกdiv(ถ้าคุณต้องการรักษาพฤติกรรมบล็อก):

HTML:

<div>
    <div class="yourdiv">
        content
    </div>
</div>

CSS:

.yourdiv
{
    display: inline;
}

23
เพื่อตอบคำถามความเข้ากันได้ของเบราว์เซอร์: สิ่งนี้จะไม่ทำงานกับ IE7 / 8 บนองค์ประกอบ DIV คุณต้องใช้องค์ประกอบ SPAN
Matt Brock

@feeela - ฉันใส่เครื่องหมาย * หน้าซูม*display: inline; *zoom: 1;เสมอ ฉันยังไม่ได้ทดสอบสถานการณ์นี้โดยเฉพาะ แต่ฉันพบว่าแฮ็ก hasLayout ในอดีตนั้นจำเป็นสำหรับ IE7 เท่านั้นหรือ IE8 ในโหมด IE7 (หรือ IE8 ใน quirks!)
robocat

@robocat ใช่มันเป็นวิธีแก้ปัญหาที่ได้inline-blockเปิดใช้งานใน IE 7
feeela

@feela - ความคิดเห็นของคุณไม่สมเหตุสมผลสำหรับฉัน! ฉันแนะนำให้วาง * หน้าซูมเช่นกันเช่น * ซูม: 1;
robocat

4
โปรดอธิบายสาเหตุที่วิธีแก้ปัญหาของคุณสำหรับบล็อกแบบอินไลน์
HelloWorldNoMore

220

display: inline-block เพิ่มระยะขอบพิเศษให้กับองค์ประกอบของคุณ

ฉันอยากจะแนะนำสิ่งนี้:

#element {
    display: table; /* IE8+ and all other modern browsers */
}

โบนัส:คุณยังสามารถนี้ได้อย่างง่ายดายศูนย์แฟนซีที่ใหม่เพียงโดยการเพิ่ม#elementmargin: 0 auto


14
+1 - นี่คือทางออกที่ดีที่สุดและสะอาดที่สุดสำหรับเบราว์เซอร์สมัยใหม่ที่ช่วยให้องค์ประกอบอยู่กึ่งกลาง ความคิดเห็นแบบมีเงื่อนไขที่position: absoluteจำเป็นสำหรับ <IE8
uınbɐɥs

21
การระบุdisplay: inline-blockไม่เพิ่มระยะขอบใด ๆ แต่ CSS จัดการช่องว่างที่จะแสดงระหว่างองค์ประกอบแบบอินไลน์
feeela

โปรดอธิบายสาเหตุที่โซลูชันการแสดงผลของคุณ: ตารางทำงาน
HelloWorldNoMore

2
บล็อกแบบอินไลน์ทำให้องค์ประกอบเป็นไปไม่ได้ที่จะวางตำแหน่งในพาเรนต์ของมัน (เช่นหากมีการจัดเรียงข้อความ: กึ่งกลางที่คุณไม่สามารถวางไว้ทางซ้าย) จอแสดงผล: ตารางสมบูรณ์ :)
FlorianB

1
นี่คือวิธีที่จะไปหากคุณมีposition: absolute
m4heshd

90

คุณสามารถลองfit-content(CSS3):

div {
  width: fit-content; 
  /* To adjust the height as well */ 
  height: fit-content;
}

1
@BartlomiejSkwira ทดแทนใด ๆ ที่ทำงานใน IE หรือ Eclipse? โซลูชันอื่น ๆ เช่น inline-block ไม่ทำงานกับฉัน .. \
DAVIDBALAS1

8
มันสมเหตุสมผลมากเกินไปแน่นอนว่าขาดการสนับสนุน
Sava B.

86

อะไรที่เหมาะกับฉันคือ:

display: table;

divใน (ทดสอบบนFirefoxและGoogle Chrome )


4
ใช่โดยเฉพาะอย่างยิ่งถ้าคุณจำเป็นต้องตั้งศูนย์ด้วยระยะขอบ: อัตโนมัติ กรณีนั้นบล็อกแบบอินไลน์ไม่ใช่วิธีแก้ปัญหา
Zsolt Szatmari

1
โปรดทราบด้วยว่าหากคุณต้องการให้การเติมเต็มภายในองค์ประกอบนี้คุณต้องกำหนดborder-collapse: separate;สไตล์ มันเริ่มต้นของเบราว์เซอร์จำนวนมาก แต่มักจะกรอบ CSS collapseเช่นบูตรีเซ็ตมูลค่าให้กับ
Ruslan Stelmachenko

ทดสอบกับ MSIE 6 บนโทรศัพท์ Windows Mobile 6.5 ที่ทำในปี 2009: มันลดระดับลงเป็น div เต็มความกว้าง (ซึ่งไม่น่าจะเป็นปัญหาในโทรศัพท์) หากใครก็ตามที่ใช้ Internet Explorer รุ่นน้อยกว่า 8 บนเดสก์ท็อปพวกเขากำลังใช้ระบบปฏิบัติการที่ไม่รองรับ (IE6 มาพร้อมกับ XP, IE7 มาพร้อมกับ Vista); ฉันจะพาพวกเขาไปยังหน้าที่บอกให้อัพเกรดเป็น GNU / Linux หากพวกเขาต้องการใช้อินเทอร์เน็ตอย่างปลอดภัยในเครื่องนั้นต่อไป
สิลาสเอส. บราวน์

85

มีสองวิธีที่ดีกว่า

  1. display: inline-block;

    หรือ

  2. display: table;

จากสองdisplay:table;สิ่งนี้ดีกว่าเพราะdisplay: inline-block;เพิ่มระยะขอบพิเศษ

สำหรับdisplay:inline-block;คุณสามารถใช้วิธีการมาร์จิ้นติดลบเพื่อแก้ไขพื้นที่พิเศษ


2
คุณคิดว่าทำไมการอธิบายถึงdisplay:tableดีกว่า
Nathaniel Ford

1
สำหรับการแสดงผล: บล็อกแบบอินไลน์คุณต้องใช้วิธีการมาร์จิ้นติดลบเพื่อแก้ไขระยะห่างพิเศษ
Shuvo Habib

8
@NathanielFord display:tableออกจากองค์ประกอบในบริบทการจัดรูปแบบบล็อกเพื่อให้คุณสามารถควบคุมตำแหน่งด้วยระยะขอบ ฯลฯ ตามปกติ display:-inline-*ในทางกลับกันวางองค์ประกอบลงในบริบทการจัดรูปแบบอินไลน์ทำให้เบราว์เซอร์เพื่อสร้าง wrapper บล็อกที่ไม่ระบุชื่อโดยรอบประกอบด้วยกล่องบรรทัดที่มีการตั้งค่าแบบอักษร / ความสูงบรรทัดที่สืบทอดและแทรกบล็อกลงในกล่องบรรทัดนั้น มันเป็นแนวตั้งตามค่าเริ่มต้น) เรื่องนี้เกี่ยวข้องกับ "เวทมนตร์" มากขึ้นและอาจทำให้ประหลาดใจ
Ilya Streltsyn

84

3
ใครก็ตามที่มีปัญหานี้ควรเพิ่มสไตล์เหล่านี้ทั้งหมด Firefox เพิ่มระยะขอบเมื่อไม่ได้ใช้งาน-moz-inline-stack
Justin

43

ไม่ทราบว่าในบริบทนี้สิ่งที่จะปรากฏ แต่ผมเชื่อว่าคุณสมบัติ CSS สไตล์floatอย่างใดอย่างหนึ่งleftหรือrightจะมีผลกระทบนี้ ในทางกลับกันก็จะมีผลข้างเคียงอื่น ๆ เช่นการอนุญาตให้ข้อความลอยอยู่รอบ ๆ

โปรดแก้ไขให้ฉันถ้าฉันคิดผิดฉันไม่แน่ใจ 100% และไม่สามารถทดสอบด้วยตัวเองได้ในขณะนี้


1
ใช่ใน CSS 2.1 (CSS2.0 จะทำให้การลอยเต็มความกว้าง แต่มีเพียง IE5 / Mac เท่านั้นที่ทำได้) ตารางและลอยเป็นประเภทการแสดงผลเดียวที่สามารถย่อขนาดให้พอดีกับเนื้อหา
464 bobince

41

คำตอบสำหรับคำถามของคุณวางในอนาคตเพื่อนของฉัน ...

กล่าวคือ "ภายใน" กำลังมาพร้อมกับการอัปเดต CSS3 ล่าสุด

width: intrinsic;

น่าเสียดายที่IEอยู่ข้างหลังมันดังนั้นจึงยังไม่รองรับ

เพิ่มเติมเกี่ยวกับมัน: CSS Intrinsic & Extrinsic Sizing Module Level 3และฉันสามารถใช้ได้หรือไม่? : ภายในและภายนอกขนาด

สำหรับตอนนี้คุณต้องพอใจ<span>หรือ<div>ตั้งค่าให้

display: inline-block;

12
intrinsicเป็นค่าที่ไม่ได้มาตรฐาน width: max-contentมันเป็นจริง ดูหน้า MDN บนหน้านั้นหรือแบบร่างที่เชื่อมโยงแล้ว
maryisdead

34

โซลูชันที่เข้ากันได้กับ CSS2 คือการใช้:

.my-div
{
    min-width: 100px;
}

คุณสามารถลอย div ของคุณซึ่งจะบังคับให้เล็กที่สุดเท่าที่จะเป็นไปได้ แต่คุณจะต้องใช้clearfixหากมีอะไรใน div ของคุณลอย:

.my-div
{
    float: left;
}

3
มันควรจะ. คุณใช้ doctype ประเภทใดอยู่
Soviut

34
width:1px;
white-space: nowrap;

ทำงานได้ดีสำหรับฉัน :)


แต่แล้วกรณีของฉันคือข้อความใน div ไม่ใช่ตารางอย่าง OP
Rui Marques

สำหรับแถบเลื่อน ui ของ jquery นี่เป็นเรื่องที่น่ายินดีเพราะคุณไม่จำเป็นต้องตั้งค่าความกว้างของรายการเนื้อหา
CoffeJunky

26

ตกลงในหลายกรณีคุณไม่จำเป็นต้องทำสิ่งใดตามค่าเริ่มต้น div heightและwidthอัตโนมัติ แต่ถ้าไม่ใช่กรณีของคุณการใช้inline-blockจอแสดงผลจะเหมาะกับคุณ ... ดูรหัสที่ฉันสร้างให้คุณและมันทำ สิ่งที่คุณมองหา:

div {
  display: inline-block;
}
<div>
  <table>
    <tr>
      <td>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi ultrices feugiat massa sed laoreet. Maecenas et magna egestas, facilisis purus quis, vestibulum nibh.</td>
      <td>Nunc auctor aliquam est ac viverra. Sed enim nisi, feugiat sed accumsan eu, convallis eget felis. Pellentesque consequat eu leo nec pharetra. Aenean interdum enim dapibus diam.</td>
      <td>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi ultrices feugiat massa sed laoreet. Maecenas et magna egestas, facilisis purus quis, vestibulum nibh.</td>
    </tr>
  </table>
</div>


22

สิ่งนี้ถูกกล่าวถึงในความคิดเห็นและหายากในคำตอบข้อหนึ่งดังนี้:

หากคุณใช้display: flexด้วยเหตุผลใดก็ตามคุณสามารถใช้:

div {
    display: inline-flex;
}

สิ่งนี้ได้รับการสนับสนุนอย่างกว้างขวางในเบราว์เซอร์


นี่คือสิ่งที่ฉันต้องการเมื่อใช้ไปแล้วdisplay: flex;
Denny

19

คุณสามารถทำได้โดยใช้display: inline;(หรือwhite-space: nowrap;)

ฉันหวังว่าคุณจะพบว่ามีประโยชน์นี้


18

คุณสามารถใช้inline-blockเป็น @ user473598 แต่ระวังเบราว์เซอร์รุ่นเก่า ..

/* Your're working with */
display: inline-block;

/* For IE 7 */
zoom: 1;
*display: inline;

/* For Mozilla Firefox < 3.0 */
display:-moz-inline-stack;

Mozilla ไม่สนับสนุนการบล็อกแบบอินไลน์เลย แต่มันก็มีคุณสมบัติ-moz-inline-stackที่เหมือนกัน

บางเบราว์เซอร์รอบinline-blockคุณลักษณะการแสดงผล: https://css-tricks.com/snippets/css/cross-browser-inline-block/

คุณสามารถดูการทดสอบบางอย่างด้วยคุณลักษณะนี้ใน: https://robertnyman.com/2010/02/24/css-display-inline-block-why-it-rocks-and-why-it-sucks/


1
คุณกำลังพูดเรื่องอะไร Mozilla Firefox รองรับinline-blockตั้งแต่ 3.0 (2008) ที่มา: developer.mozilla.org/en-US/docs/Web/CSS/…
Chazy Chaz

18

เพียงใส่สไตล์ในไฟล์ CSS ของคุณ

div { 
    width: fit-content; 
}

1
ฉันไม่คิดว่านี่เป็นตัวเลือกที่รองรับข้ามเบราว์เซอร์
David Rector

2
ขณะนี้ใช้งานไม่ได้ใน Edge: caniuse.com/#search=fit-content
molsson

คุณสามารถใช้-moz-fit-contentสำหรับ FF สันนิษฐานว่านำหน้าผู้ผลิตอื่น ๆ จะช่วยให้พวกเขาเอง ...
Benj

1
นี่เป็นคำตอบ
mfluehr

18
<table cellpadding="0" cellspacing="0" border="0">
    <tr>
        <td>
            <div id="content_lalala">
                this content inside the div being inside a table, needs no inline properties and the table is the one expanding to the content of this div =)
            </div>
        </td>
    </tr>
</table>

ฉันรู้ว่าผู้คนไม่ชอบโต๊ะบางครั้ง แต่ฉันต้องบอกคุณฉันลองแฮ็กแบบอินไลน์ css และพวกเขาก็ทำงานใน divs บางส่วน แต่คนอื่นไม่ได้ดังนั้นมันง่ายกว่าที่จะใส่ div ที่ขยายใน ตาราง ... และ ... สามารถมีคุณสมบัติแบบอินไลน์หรือไม่และยังเป็นตารางที่จะเก็บความกว้างทั้งหมดของเนื้อหา =)


2
มันไม่ใช่วิธีที่ "ถูกต้อง" แต่ IE6 / 7/8 มักจะไม่เล่นได้ดีเมื่อสิ่งต่าง ๆ มีความซับซ้อนเล็กน้อยดังนั้นฉันจึงเข้าใจว่าทำไมคุณถึงทำแบบนี้ คุณได้รับการโหวตของฉัน
Craigo

ฉันจะทำเช่นนี้ แต่ฉันต้องล้อมรอบทุกช่องป้อนข้อมูลเดียวดังนั้นมันจึงเป็น html ที่พิเศษมาก
NickSoft

15

ตัวอย่างการทำงานอยู่ที่นี่ -

.floating-box {
    display:-moz-inline-stack;
    display: inline-block;

    width: fit-content; 
    height: fit-content;

    width: 150px;
    height: 75px;
    margin: 10px;
    border: 3px solid #73AD21;  
}
<h2>The Way is using inline-block</h2>

Supporting elements are also added in CSS.

<div>
   <div class="floating-box">Floating box</div>
   <div class="floating-box">Floating box</div>
   <div class="floating-box">Floating box</div>
   <div class="floating-box">Floating box</div>
   <div class="floating-box">Floating box</div>
   <div class="floating-box">Floating box</div>
   <div class="floating-box">Floating box</div>
   <div class="floating-box">Floating box</div>
</div>


13

โซลูชัน flexbox CSS3 ของฉันมีสองรสชาติ: ตัวที่อยู่ด้านบนมีลักษณะเหมือนช่วงและตัวที่ด้านล่างจะทำงานเหมือนตัวหารโดยใช้ความกว้างทั้งหมดด้วยความช่วยเหลือของเสื้อคลุม คลาสของพวกเขาคือ "top", "bottom" และ "bottomwrapper" ตามลำดับ

body {
    font-family: sans-serif;
}
.top {
    display: -webkit-inline-flex;
    display: inline-flex;
}
.top, .bottom {
    background-color: #3F3;
    border: 2px solid #FA6;
}
/* bottomwrapper will take the rest of the width */
.bottomwrapper {
    display: -webkit-flex;
    display: flex;
}
table {
    border-collapse: collapse;
}
table, th, td {
    width: 280px;
    border: 1px solid #666;
}
th {
    background-color: #282;
    color: #FFF;
}
td {
    color: #444;
}
th, td {
    padding: 0 4px 0 4px;
}
Is this
<div class="top">
	<table>
        <tr>
            <th>OS</th>
            <th>Version</th> 
        </tr>
        <tr>
            <td>OpenBSD</td>
            <td>5.7</td> 
        </tr>
        <tr>
            <td>Windows</td>
            <td>Please upgrade to 10!</td> 
        </tr>
    </table>
</div>
what you are looking for?
<br>
Or may be...
<div class="bottomwrapper">
    <div class="bottom">
    	<table>
            <tr>
                <th>OS</th>
                <th>Version</th> 
            </tr>
            <tr>
                <td>OpenBSD</td>
                <td>5.7</td> 
            </tr>
            <tr>
                <td>Windows</td>
                <td>Please upgrade to 10!</td> 
            </tr>
        </table>
    </div>
</div>
this is what you are looking for.


display: inline-flex;รุ่งโรจน์สำหรับ BTW ใช้งานได้โดยไม่มีคำนำหน้าสำหรับ Chrome 62, firefox 57 และ safari 11
Horacio

12
<div class="parentDiv" style="display:inline-block">
    // HTML elements
</div>

สิ่งนี้จะทำให้ความกว้าง div หลักเหมือนกับความกว้างองค์ประกอบที่ใหญ่ที่สุด


มีวิธีที่ฉันสามารถใช้นี้เฉพาะขนาดแนวตั้งเพื่อลดและรักษาแนวนอนขนาดใหญ่?
Gobliins

12

ลองdisplay: inline-block;ดู เพื่อให้สามารถใช้งานร่วมกับเบราว์เซอร์ข้ามได้โปรดใช้รหัส css ด้านล่าง

div {
  display: inline-block;
  display:-moz-inline-stack;
  zoom:1;
  *display:inline;
  border-style: solid;
  border-color: #0000ff;
}
<div>
  <table>
    <tr>
      <td>Column1</td>
      <td>Column2</td>
      <td>Column3</td>
    </tr>
  </table>
</div>


11

การเข้าไปยุ่งเกี่ยวกับ Firebug ฉันพบมูลค่าทรัพย์สิน-moz-fit-contentซึ่งทำตามที่ OP ต้องการและสามารถใช้ดังนี้

width: -moz-fit-content;

แม้ว่ามันจะใช้งานได้เฉพาะบน Firefox แต่ฉันไม่พบสิ่งที่เทียบเท่าเบราว์เซอร์อื่น ๆ เช่น Chrome


เมื่อวันที่มกราคม 2017, IE (ทุกรุ่นขอบและโทรศัพท์มือถือรวม) และ Opera Mini fit-contentมีการสนับสนุนไม่มี Firefox รองรับความกว้างเท่านั้น เบราว์เซอร์อื่นรองรับได้ดี
Gavin

11

คุณสามารถลองรหัสนี้ ติดตามรหัสในส่วน CSS

div {
  display: inline-block;
  padding: 2vw;
  background-color: green;
}

table {
  width: 70vw;
  background-color: white;
}
<div>
    <table border="colapsed">
      <tr>
        <td>Apple</td>
        <td>Banana</td>
        <td>Strawberry</td>
      </tr>
      <tr>
        <td>Apple</td>
        <td>Banana</td>
        <td>Strawberry</td>
      </tr>
      <tr>
        <td>Apple</td>
        <td>Banana</td>
        <td>Strawberry</td>
      </tr>

    </table>
</div>


7

ฉันได้รับการแก้ไขปัญหาที่คล้ายกัน (ที่ผมไม่ได้ต้องการที่จะใช้display: inline-blockเนื่องจากรายการเป็นศูนย์กลาง) โดยการเพิ่มspanแท็กภายในdivแท็กและการเคลื่อนย้ายการจัดรูปแบบ CSS จากนอกdivแท็กภายในใหม่spanแท็ก เพียงแค่ทิ้งสิ่งนี้ไว้ในความคิดอื่นหากdisplay: inline blockไม่ใช่คำตอบที่เหมาะสมสำหรับคุณ


7

เราสามารถใช้วิธีใดก็ได้จากสองวิธีในdivองค์ประกอบ:

display: table;

หรือ,

display: inline-block; 

ฉันชอบที่จะใช้display: table;เพราะมันจัดการพื้นที่พิเศษทั้งหมดด้วยตัวเอง ในขณะที่display: inline-blockต้องการแก้ไขพื้นที่เพิ่มเติม


6
div{
  width:auto;
  height:auto;
}

สิ่งนี้จะไม่ทำงานหาก div มีองค์ประกอบแบบอินไลน์ (หรือบล็อกแบบอินไลน์) และมีขนาดแบบอักษรและความสูงบรรทัดแตกต่างจากตัว div
quotesBro

5

หากคุณมีตู้คอนเทนเนอร์ที่ใช้งานไม่ได้หลายชั่วโมงหลังจากมองหาโซลูชัน CSS ที่ดีและไม่พบสิ่งใดเลยตอนนี้ฉันใช้ jQuery แทน:

$('button').click(function(){

  $('nav ul').each(function(){
    
    $parent = $(this).parent();
    
    $parent.width( $(this).width() );
    
  });
});
nav {
  display: inline-block;
  text-align: left; /* doesn't do anything, unlike some might guess */
}
ul {
  display: inline;
}

/* needed style */
ul {
  padding: 0;
}
body {
  width: 420px;
}

/* just style */
body {
  background: #ddd;
  margin: 1em auto;
}
button {
  display: block;
}
nav {
  background: #bbb;
  margin: 1rem auto;
  padding: 0.5rem;
}
li {
  display: inline-block;
  width: 40px;
  height: 20px;
  border: solid thin #777;
  margin: 4px;
  background: #999;
  text-align: center;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<button>fix</button>

<nav>
  <ul>
    <li>3</li>
    <li>.</li>
    <li>1</li>
    <li>4</li>
  </ul>
</nav>

<nav>
  <ul>
    <li>3</li>
    <li>.</li>
    <li>1</li>
    <li>4</li>
    <li>1</li>
    <li>5</li>
    <li>9</li>
    <li>2</li>
    <li>6</li>
    <li>5</li>
    <li>3</li>
    <li>5</li>
  </ul>
</nav>


สิ่งนี้เห็นได้อย่างชัดเจนในตัวอย่างสำหรับฉันใน Chrome การคลิกปุ่มแก้ไขในครั้งที่สองจะให้ผลลัพธ์ที่แตกต่างกันเพื่อคลิกในครั้งแรก
Mark Amery

@ MarkAmery บน mac ของฉันฉันลองใช้กับ Chrome, Safari และ firefox และมันก็ดี: ไม่มีข้อผิดพลาดที่มองเห็นไม่มีอะไรในคอนโซลพฤติกรรมที่สอดคล้องกัน บางทีมันอาจจะเป็นสิ่งที่มีหน้าต่าง ...
cregox

5

แก้ไขแล้ว (ใช้ได้ถ้าคุณมีลูกหลายคน): คุณสามารถใช้ jQuery (ดูที่ลิงก์ JSFiddle)

var d= $('div');
var w;


d.children().each(function(){
 w = w + $(this).outerWidth();
 d.css('width', w + 'px')
});

อย่าลืมรวม jQuery ...

ดู JSfiddle ที่นี่


สิ่งนี้หักถ้า div ของคุณมีลูกหลายคน เพียงตั้งค่าความกว้าง div ให้กับลูกคนแรก
Mark Amery

@MarkAmery ก่อนอื่นคุณต้องโหวตให้เป็นลบโปรดอ่านคำถามอย่างละเอียดพวกเขาถามลูกหนึ่งคน หากคุณสงสัยจริงๆว่าจะทำอย่างไรกับเด็กหลายคนให้ดูคำตอบที่แก้ไขแล้ว
Bondsmith

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