Làm thế nào tôi có thể làm cho một div không lớn hơn nội dung của nó?


2070

Tôi có một bố cục tương tự như:

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

Tôi muốn cho divchỉ mở rộng đến rộng như tôi tabletrở thành.


90
hiệu ứng này được gọi là "thu nhỏ" và như đã trả lời, có một số cách để thực hiện điều này (float, inline, min / max-width) tất cả đều có tác dụng phụ để lựa chọn
annakata

Câu trả lời:


2426

Giải pháp là để thiết lập của bạn divđể display: inline-block.


239
@ leif81 Bạn có thể sử dụng một spanhoặc một divhoặc ulbất cứ thứ gì khác, phần quan trọng là cho vùng chứa mà bạn muốn có chiều rộng tối thiểu có thuộc tính CSSdisplay: inline-block
miahelf 17/11/11

10
nếu ai đó thắc mắc: người ta có thể căn giữa cha mẹ của bảng bằng cách đặt "text-align: centre" trên đó là cha mẹ của nó và "text-align: left" trên đó (ví dụ: <body style = "text-align: centre"> < span style = "text-align: left; display: inline-block;"> <bảng> ... </ table> </ span> </ body>)
bernstein

12
Nó không hoạt động trên chrome đối với tôi với span, nhưng hoạt động bằng cách sử dụng khoảng trắng: nowrap;
albanx

57
Vui lòng lưu ý rằng một khi bạn có display: inline-blocktài sản, thiết lập margin: 0 auto;sẽ không hoạt động như mong đợi. Trong trường hợp đó nếu container cha có text-align: center;thì inline-blockphần tử sẽ được căn giữa theo chiều ngang.
Savas Vedova

12
inline-blockKHÔNG làm việc cho tôi, nhưng inline-flexDID.
mareoraft

331

Bạn muốn một phần tử khối có những gì CSS gọi là chiều rộng co lại vừa vặn và thông số kỹ thuật không cung cấp một cách may mắn để có được một thứ như vậy. Trong CSS2, thu nhỏ để phù hợp không phải là một mục tiêu, nhưng có nghĩa là để đối phó với một tình huống trong đó trình duyệt "phải" có được một chiều rộng ra khỏi không khí mỏng. Những tình huống đó là:

  • Phao nổi
  • yếu tố định vị tuyệt đối
  • yếu tố khối nội tuyến
  • yếu tố bảng

khi không có chiều rộng quy định. Tôi nghe nói họ nghĩ đến việc thêm những gì bạn muốn vào CSS3. Để bây giờ, hãy làm với một trong những điều trên.

Quyết định không để lộ trực tiếp tính năng này có vẻ lạ, nhưng có một lý do chính đáng. Nó đắt. Shrink-to-fit có nghĩa là định dạng ít nhất hai lần: bạn không thể bắt đầu định dạng một phần tử cho đến khi bạn biết chiều rộng của nó và bạn không thể tính chiều rộng sẽ đi qua toàn bộ nội dung. Thêm vào đó, người ta không cần yếu tố thu nhỏ để phù hợp thường xuyên như người ta có thể nghĩ. Tại sao bạn cần thêm div xung quanh bàn của bạn? Có lẽ chú thích bảng là tất cả những gì bạn cần.


34
Tôi muốn nói inline-blocklà chính xác dành cho việc này và giải quyết vấn đề một cách hoàn hảo.
miahelf

6
Tôi nghĩ rằng họ đang thêm vào css4 và nó sẽ làcontent-box, max-content, min-content, available, fit-content, auto
Muhammad Umer

4
fit-contentTừ khóa mới (không tồn tại khi câu trả lời này được viết lần đầu và vẫn chưa được hỗ trợ đầy đủ ) cho phép bạn áp dụng rõ ràng kích thước "thu nhỏ để vừa" cho một yếu tố, loại bỏ sự cần thiết của bất kỳ hack nào được đề xuất ở đây nếu bạn đủ may mắn để chỉ nhắm mục tiêu trình duyệt với sự hỗ trợ. Tuy nhiên +1; những điều này vẫn hữu ích cho đến bây giờ!
Đánh dấu Amery

floatđã làm những gì tôi cần làm!
nipunasudha

228

Tôi nghĩ rằng sử dụng

display: inline-block;

sẽ hoạt động, tuy nhiên tôi không chắc về khả năng tương thích của trình duyệt.


Một giải pháp khác là bọc bạn divtrong một cái khác div(nếu bạn muốn duy trì hành vi chặn):

HTML:

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

CSS:

.yourdiv
{
    display: inline;
}

23
Để trả lời câu hỏi tương thích trình duyệt: điều này sẽ không hoạt động với IE7 / 8 trên các phần tử DIV. Bạn phải sử dụng các yếu tố SPAN.
Matt Brock

@feeela - Tôi luôn đặt dấu * phía trước thu phóng, vd *display: inline; *zoom: 1;. Tôi chưa thử nghiệm cho tình huống cụ thể này, nhưng trước đây tôi luôn thấy rằng hack hasLayout chỉ được yêu cầu cho IE7 hoặc IE8 ở chế độ IE7 (hoặc IE8 theo yêu cầu!).
robocat

@robocat Có, đó thực sự là một cách giải quyết đã inline-blockđược kích hoạt trong IE 7.
feeela

@feela - bình luận của bạn không có ý nghĩa với tôi! Tôi đã đề nghị đặt * trước zoom cũng như Ie * zoom: 1;
robocat

4
Vui lòng giải thích lý do giải pháp khối nội tuyến của bạn hoạt động.
HelloWorldNoMore

220

display: inline-block thêm một lề cho yếu tố của bạn.

Tôi muốn giới thiệu điều này:

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

Phần thưởng: Bây giờ bạn cũng có thể dễ dàng trung tâm mà mới lạ mắt #elementchỉ bằng cách thêm margin: 0 auto.


14
+1 - Đây là giải pháp tốt nhất và sạch nhất cho các trình duyệt hiện đại cũng cho phép phần tử được căn giữa. Một nhận xét có điều kiện với position: absolutelà cần thiết cho <IE8.
uınbɐɥs

21
Chỉ định display: inline-blockkhông thêm bất kỳ lề. Nhưng CSS xử lý khoảng trắng được hiển thị giữa các phần tử nội tuyến.
feeela

Vui lòng giải thích tại sao giải pháp hiển thị của bạn: bảng hoạt động.
HelloWorldNoMore

2
Khối nội tuyến làm cho phần tử không thể định vị được trong phần tử mẹ của nó (ví dụ: nếu có một văn bản căn chỉnh: trung tâm, bạn không thể đặt nó ở bên trái) hiển thị: bảng là hoàn hảo :)
FlorianB

1
Đây là con đường để đi nếu bạn cóposition: absolute
m4heshd


86

Những gì làm việc cho tôi là:

display: table;

trong div. (Đã thử nghiệm trên FirefoxGoogle Chrome ).


4
Vâng, đặc biệt nếu bạn cần trung tâm với lề: tự động. Trường hợp đó khối nội tuyến không phải là giải pháp.
Zsolt Szatmari

1
Cũng lưu ý rằng, nếu bạn muốn phần đệm hoạt động bên trong phần tử này, bạn phải đặt border-collapse: separate;kiểu. Nó mặc định trong nhiều trình duyệt nhưng thường là các khung css như bootstrap đặt lại giá trị của nó collapse.
Ruslan Stelmachenko

Đã thử nghiệm trên MSIE 6 trên điện thoại Windows Mobile 6.5 được sản xuất vào năm 2009: nó biến đổi một cách duyên dáng thành div toàn chiều rộng (điều này dường như không phải là vấn đề trên điện thoại). Nếu bất cứ ai sử dụng phiên bản Internet Explorer dưới 8 trên máy tính để bàn, họ đang sử dụng hệ điều hành không được hỗ trợ (IE6 đi kèm với XP, IE7 đi kèm với Vista); Tôi sẽ chuyển hướng họ đến một trang bảo họ nâng cấp lên GNU / Linux nếu họ muốn tiếp tục sử dụng Internet an toàn trên máy đó.
Silas S. Brown

85

Có hai giải pháp tốt hơn

  1. display: inline-block;

    HOẶC LÀ

  2. display: table;

Trong số hai display:table;là tốt hơn, bởi vì display: inline-block;thêm một lề.

Đối với display:inline-block;bạn có thể sử dụng phương pháp lề âm để sửa không gian thừa


2
Bạn có phiền giải thích tại sao display:tabletốt hơn không?
Nathaniel Ford

1
Để hiển thị: khối nội tuyến, bạn phải sử dụng phương pháp lề âm để sửa khoảng cách bổ sung.
Shuvo Habib

8
@NathanielFord, display:tableđể phần tử trong ngữ cảnh Định dạng khối, do đó bạn có thể kiểm soát vị trí của nó bằng lề, v.v. như bình thường. display:-inline-*mặt khác, đặt phần tử vào ngữ cảnh định dạng Nội tuyến, khiến trình duyệt tạo trình bao bọc khối ẩn danh xung quanh nó, chứa hộp dòng với cài đặt phông chữ / chiều cao được kế thừa và chèn khối vào hộp dòng đó (căn chỉnh theo chiều dọc theo đường cơ sở theo mặc định). Điều này liên quan đến nhiều "ma thuật" hơn và do đó tiềm năng bất ngờ.
Ilya Streltsyn


43

Không biết trong những ngữ cảnh này sẽ xuất hiện, nhưng tôi tin rằng thuộc tính CSS kiểu floathoặc lefthoặc rightsẽ có hiệu ứng này. Mặt khác, nó cũng sẽ có các tác dụng phụ khác, chẳng hạn như cho phép văn bản nổi xung quanh nó.

Vui lòng sửa lại cho tôi nếu tôi sai, tôi không chắc chắn 100% và hiện tại tôi không thể tự kiểm tra.


1
Có, trong CSS 2.1. (CSS2.0 sẽ làm cho float toàn chiều rộng, nhưng chỉ IE5 / Mac thực sự làm điều đó). Bảng và phao là loại hiển thị duy nhất có thể thu nhỏ để phù hợp với nội dung của chúng.
bobince

41

Câu trả lời cho câu hỏi của bạn nằm trong tương lai bạn của tôi ...

cụ thể là "nội tại" đang đến với bản cập nhật CSS3 mới nhất

width: intrinsic;

Thật không may, IE đứng sau nó vì vậy nó chưa hỗ trợ

Thông tin thêm về nó: Mô-đun kích thước bên trong & bên ngoài CSS cấp 3tôi có thể sử dụng không? : Kích thước bên trong & bên ngoài .

Bây giờ bạn phải hài lòng với <span>hoặc <div>đặt thành

display: inline-block;

12
intrinsicnhư một giá trị là không chuẩn. Nó thực sự là width: max-content. Xem trang MDN trên đó hoặc bản nháp đã được liên kết.
maryonomead

34

Một giải pháp tương thích CSS2 là sử dụng:

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

Bạn cũng có thể thả nổi div của mình, điều này sẽ buộc nó càng nhỏ càng tốt, nhưng bạn sẽ cần sử dụng một mã xóa nếu mọi thứ bên trong div của bạn nổi:

.my-div
{
    float: left;
}

3
Nó nên. Bạn đang sử dụng loại tài liệu nào?
Soviut

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

làm việc tốt cho tôi :)


Nhưng một lần nữa trường hợp của tôi là văn bản bên trong div chứ không phải bảng như OP.
Rui Marques

đối với thanh trượt ui của jquery, điều này thật tuyệt vời vì bạn không cần đặt chiều rộng của mục nội dung
CoffeJunky

26

OK, trong nhiều trường hợp, bạn thậm chí không cần phải làm bất cứ điều gì như mặc định div có heightwidthtự động, nhưng nếu không phải là trường hợp của bạn, áp dụng inline-blockhiển thị sẽ hiệu quả với bạn ... hãy nhìn vào mã tôi tạo cho bạn và nó sẽ làm được những gì bạn đang tìm kiếm:

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>



19

Bạn có thể làm điều đó đơn giản bằng cách sử dụng display: inline;(hoặc white-space: nowrap;).

Tôi hy vọng bạn thấy nó hữu dụng.


18

Bạn có thể sử dụng inline-blocknhư @ user473598, nhưng hãy cẩn thận với các trình duyệt cũ hơn ..

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

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

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

Mozilla hoàn toàn không hỗ trợ chặn nội tuyến, nhưng họ có -moz-inline-stackcùng một nhóm

Một số trình duyệt chéo xung quanh inline-blockthuộc tính hiển thị: https://css-tricks.com/snippets/css/cross-browser-inline-block/

Bạn có thể xem một số thử nghiệm với thuộc tính này trong: https://robertnyman.com/2010/02/24/css-display-inline-block-why-it-rocks-and-why-it-sucks/


1
Bạn đang nói về cái gì vậy? Mozilla Firefox hỗ trợ inline-blocktừ 3.0 (2008). Nguồn: developer.mozilla.org/en-US/docs/Web/CSS/
Kẻ

18

Chỉ cần đặt một kiểu vào tệp CSS của bạn

div { 
    width: fit-content; 
}

1
Tôi không nghĩ rằng đây là một tùy chọn hỗ trợ nhiều trình duyệt.
David Hiệu trưởng

2
Hiện tại không hoạt động trong Edge: caniuse.com/#search=fit-content
molsson

Bạn có thể sử dụng -moz-fit-contentcho FF, có lẽ các tiền tố của nhà cung cấp khác sẽ cho phép riêng của họ ...
Ngày

1
Điều này giống như câu trả lời của Vitalii Fedorenko
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>

Tôi biết đôi khi mọi người không thích bàn, nhưng tôi phải nói với bạn rằng, tôi đã thử các bản hack nội tuyến css và họ đã làm việc trong một số div nhưng trong những người khác thì không, vì vậy, thực sự dễ dàng hơn để đưa div mở rộng vào một bảng ... và ... nó có thể có hoặc không có thuộc tính nội tuyến và bảng vẫn là bảng sẽ giữ tổng chiều rộng của nội dung. =)


2
Đó không phải là cách "phù hợp", nhưng IE6 / 7/8 thường không chơi đẹp khi mọi thứ hơi phức tạp, vì vậy tôi hoàn toàn hiểu tại sao bạn lại làm theo cách này. Bạn đã bỏ phiếu của tôi lên.
Craigo

Tôi sẽ làm điều này, nhưng tôi phải bao quanh mỗi hộp đầu vào, vì vậy đó là rất nhiều html.
NickSoft

15

Một bản demo hoạt động ở đây-

.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

Giải pháp flexbox CSS3 của tôi theo hai hương vị: Một ở phía trên hoạt động giống như một nhịp và một ở phía dưới hoạt động như một div, lấy hết chiều rộng với sự trợ giúp của trình bao bọc. Các lớp của họ lần lượt là "top", "bottom" và "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.


thanh danh cho display: inline-flex;. BTW này hoạt động mà không có tiền tố cho Chrome 62, firefox 57 và safari 11
Horacio

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

Điều này sẽ làm cho chiều rộng div cha giống như chiều rộng phần tử lớn nhất.


Có cách nào tôi chỉ có thể áp dụng điều này cho kích thước dọc để giảm thiểu và giữ chiều ngang lớn?
Yêu tinh

12

Hãy thử display: inline-block;. Để nó tương thích với trình duyệt, vui lòng sử dụng mã css bên dưới.

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

Giả mạo xung quanh với Fireorms Tôi đã tìm thấy giá trị -moz-fit-contentthuộc tính chính xác làm những gì OP muốn và có thể được sử dụng như sau:

width: -moz-fit-content;

Mặc dù nó chỉ hoạt động trên Firefox, tôi không thể tìm thấy bất kỳ tương đương cho các trình duyệt khác như Chrome.


Kể từ tháng 1 năm 2017, IE (bao gồm tất cả các phiên bản, Edge và di động) và Opera Mini không hỗ trợ fit-content. Firefox chỉ hỗ trợ chiều rộng. Các trình duyệt khác hỗ trợ nó tốt.
Gavin

11

Bạn có thể thử mã này. Thực hiện theo mã trong phần 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

Tôi đã giải quyết một vấn đề tương tự (nơi tôi không muốn sử dụng display: inline-blockvì mục này được căn giữa) bằng cách thêm một spanthẻ bên trong divthẻ và di chuyển định dạng CSS từ divthẻ bên ngoài sang spanthẻ bên trong mới . Chỉ cần ném nó ra khỏi đó như một ý tưởng khác nếu display: inline blockkhông phải là một câu trả lời phù hợp cho bạn.


7

Chúng ta có thể sử dụng bất kỳ một trong hai cách trên divphần tử:

display: table;

hoặc là,

display: inline-block; 

Tôi thích sử dụng display: table;, bởi vì nó xử lý, tất cả các không gian bổ sung trên chính nó. Trong khi display: inline-blockcần một số không gian sửa chữa thêm.


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

Điều này sẽ không hoạt động nếu div chứa các phần tử nội tuyến (hoặc khối nội tuyến) và chúng có kích thước phông chữ và chiều cao dòng khác nhau so với chính div.
trích dẫnBro

5

Nếu bạn có các dòng ngắt, sau nhiều giờ tìm kiếm một giải pháp CSS tốt và không tìm thấy, bây giờ tôi sử dụng 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>


Điều này rõ ràng bị phá vỡ trong đoạn trích cho tôi trong Chrome; nhấp vào nút sửa chữa lần thứ hai tạo ra các kết quả khác nhau để nhấp vào lần đầu tiên.
Đánh dấu Amery

@MarkAmery trên máy mac của tôi Tôi chỉ thử nó trên chrome, safari và firefox và tất cả đều ổn: không có lỗi hiển thị, không có gì trên bảng điều khiển, hành vi nhất quán. có lẽ đó là thứ gì đó có cửa sổ ...
cregox

5

Đã sửa đổi (hoạt động nếu bạn có nhiều con): Bạn có thể sử dụng jQuery (Xem liên kết JSFiddle)

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


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

Đừng quên bao gồm jQuery ...

Xem JSfiddle tại đây


Điều này bị phá vỡ nếu div của bạn có nhiều con; nó chỉ đơn giản là đặt chiều rộng div cho chiều rộng của đứa trẻ đầu tiên .
Đánh dấu Amery

@MarkAmery Trước hết, trước khi bạn bỏ phiếu tiêu cực, vui lòng đọc kỹ câu hỏi, họ đã yêu cầu một con. Nếu bạn thực sự tò mò làm thế nào nó có thể được thực hiện với nhiều trẻ em, hãy xem câu trả lời sửa đổi.
Bondsmith

4

Tôi đã thử div.classname{display:table-cell;}và nó đã làm việc!

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.