如何使 div 不大于其内容?

How can I make a div not larger than its contents?

提问人: 提问时间:1/17/2009 最后编辑:Peter Mortensen 更新时间:9/13/2023 访问量:1865064

问:

我的布局类似于:

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

我希望它只扩展到我变得尽可能宽的程度。divtable

HTML CSS 宽度

评论

109赞 annakata 1/17/2009
这种效果被称为“收缩包装”,正如所回答的那样,有几种方法可以做到这一点(浮点数、内联、最小/最大宽度),所有这些方法都有可供选择的副作用
0赞 David Spector 6/25/2023
对我不起作用,但我没有发现问题的回答方式有什么问题。
0赞 NVRM 10/20/2023
实际上,这是不可能的。语言、字体、不同宽度的 Unicode 字符、pixelDeviceRatio、浏览器版本等,等等,(...),CSS 是一种时间损失,因为它不够智能,无法处理所有这些。

答:

49赞 falstro 1/17/2009 #1

不知道这将在什么上下文中出现,但我相信 CSS 样式的属性要么或将会产生这种效果。另一方面,它也会有其他副作用,例如允许文本在其周围漂浮。floatleftright

如果我错了,请纠正我,我不是 100% 确定,目前无法自己测试。

39赞 Soviut 1/17/2009 #2

与 CSS2 兼容的解决方案是使用:

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

你也可以浮动你的 div,这将使它尽可能小,但如果你的 div 内的任何内容浮动,你需要使用 clearfix

.my-div
{
    float: left;
}
367赞 buti-oxa 1/17/2009 #3

你想要一个块元素,它具有CSS所谓的收缩宽度,而规范没有提供一种有福的方式来获得这样的东西。在 CSS2 中,缩小到适合不是目标,而是意味着处理浏览器“必须”凭空获得宽度的情况。这些情况是:

  • 绝对定位元素
  • inline-block 元素
  • table 元素

当未指定宽度时。我听说他们想在 CSS3 中添加你想要的东西。现在,请凑合使用上述方法之一。

不直接公开该功能的决定可能看起来很奇怪,但这是有充分理由的。它很贵。缩小以适应意味着至少格式化两次:在知道元素的宽度之前,您不能开始格式化元素,并且您无法计算没有穿过整个内容的宽度。此外,人们并不像人们想象的那样经常需要收缩以适应元件。为什么你的桌子周围需要额外的 div?也许表格标题就是您所需要的。

评论

40赞 miahelf 11/17/2011
我想说的是,正是为此而设计的,并完美地解决了问题。inline-block
0赞 thephpdev 11/30/2021
@miahelf – 著名的遗言,内联块在任何时候都不是完美的方式,也永远不会被认为是这样。
264赞 mbillard 1/17/2009 #4

我认为使用

display: inline-block;

可以工作,但是我不确定浏览器的兼容性。


另一种解决方案是将你的包装在另一个中(如果你想保持块行为):divdiv

HTML格式:

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

CSS:

.yourdiv
{
    display: inline;
}

评论

23赞 Matt Brock 2/18/2011
回答浏览器兼容性问题:这不适用于 DIV 元素上的 IE7/8。您必须使用 SPAN 元素。
0赞 Infigon 2/4/2023
caniuse.com/?search=inline-block 的链接说 99% 的浏览器支持无前缀版本,这是自 2008 年以来(当您切换日期相对时)浏览器。(这比 ES5 的支持还要多!
85赞 nikib3ro 8/26/2010 #5
display: -moz-inline-stack;
display: inline-block;
zoom: 1;
*display: inline;

Foo Hack – 跨浏览器支持内联块样式 (2007-11-19)。

2816赞 user473598 10/13/2010 #6

解决方案是将 你的 设置为 .divdisplay: inline-block

评论

247赞 miahelf 11/17/2011
@leif81 你可以使用 a 或 a 或 or 其他任何东西,重要的是对于你想要的容器,最小宽度具有 CSS 属性spandivuldisplay: inline-block
66赞 Savas Vedova 4/9/2014
请注意,一旦您设置了属性,将无法按预期工作。在这种情况下,如果父容器具有,则元素将水平居中。display: inline-blockmargin: 0 auto;text-align: center;inline-block
0赞 carloswm85 10/14/2021
添加到@SavasVedova注释中,请记住更改为(或您可能选择的任何值)。automargin: 0 auto;0
2赞 Coco Liliace 1/9/2023
如果我们希望我们的元素具有另一个显示属性,例如网格,这不是一个解决方案。@Vitalii Fedorenko 的解决方案使用较新的属性,该属性适用于任何显示属性,不添加边距,并且所有浏览器都支持fit-content
2赞 nullromo 1/13/2023
如果我希望我的组件以内联 XD 方式流动,那就太好了。 似乎是现代解决方案。fit-content
20赞 Edward 8/4/2011 #7
<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 内联技巧,它们在某些 div 中有点工作,但在其他 div 中则不行,所以,将扩展的 div 包含在表格中真的更容易......和。。。它可以有或没有 inline 属性,但表仍然是将包含内容总宽度的表。=)

40赞 Daft Wullie 8/26/2011 #8
width:1px;
white-space: nowrap;

对我来说效果很好:)

91赞 Sony Santos 1/11/2012 #9

对我有用的是:

display: table;

在。(在 FirefoxGoogle Chrome 上测试)。div

-4赞 DearWebby 4/30/2012 #10

这似乎在所有浏览器上都适用于我。示例是我在网上和时事通讯中使用的实际广告。只需更改 div 的内容即可。它将根据您指定的填充量进行调整和收缩包装。

<div style="float:left; border: 3px ridge red; background: aqua; padding:12px">
    <font color=red size=4>Need to fix a birth certificate? Learn <a href="http://www.example.com">Photoshop in a Day</a>!
    </font>
</div>

评论

2赞 zanlok 4/2/2013
字体已完全弃用。可能在任何当前引擎上都呈现为 <span>。
2赞 Pabbles 4/24/2014
@zanlok 他正在谈论时事通讯,尽管它被弃用了,但在电子邮件领域似乎仍然是公平的游戏(第二个答案):stackoverflow.com/questions/8012799/......<font>
251赞 Samuel Katz 5/13/2012 #11

display: inline-block为您的元素添加额外的边距。

我会推荐这个:

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

奖金:现在,您还可以通过添加 .#elementmargin: 0 auto

11赞 2hamed 6/6/2012 #12

篡改 Firebug 我找到了属性值,它完全符合 OP 的要求,可以按如下方式使用:-moz-fit-content

width: -moz-fit-content;

虽然它仅适用于 Firefox,但我找不到其他浏览器(例如 Chrome)的任何等效产品。

评论

0赞 Gavin 1/12/2017
截至 2017 年 1 月,IE(所有版本,包括 Edge 和移动设备)和 Opera Mini 不支持 .Firefox 仅支持 width。其他浏览器很好地支持它。fit-content
7赞 Jessica Brown 8/26/2012 #13

我通过在标签内添加标签并将 CSS 格式从外部标签移动到新的内部标签来解决类似的问题(我不想使用,因为项目居中)。如果不适合您,只是将其作为另一个替代想法扔在那里。display: inline-blockspandivdivspandisplay: inline block

4赞 unloco 3/8/2013 #14

我试过了,它奏效了!div.classname{display:table-cell;}

249赞 Vitalii Fedorenko 5/27/2013 #15

你可以试试fit-content(CSS3):

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

评论

39赞 Sava B. 3/7/2018
这太有道理了,当然它缺乏支持。
0赞 jnnnnn 2/10/2022
这就是我所选择的。margin: auto
10赞 jose920405 4/13/2022
这应该是公认的答案
0赞 David Spector 6/25/2023
完善。它永远不会得到广泛使用。
0赞 Luc 12/2/2023
为了给每个人节省一个 caniuse 查找:它现在得到了广泛的支持。很抱歉撞坏了上面的笑话线程,我确实很欣赏“这是有道理的——>它永远不会得到支持”的幽默:)
45赞 trojan 12/11/2013 #16

你问题的答案在于未来,我的朋友......

即“intrinsic”将随最新的 CSS3 更新一起推出

width: intrinsic;

不幸的是,IE落后了,所以它还不支持它

更多信息:CSS Intrinsic & Extrinsic Sizing Module Level 3 和 Can I Use?: Intrinsic & Extrinsic Sizing

现在,您必须满意或设置为<span><div>

display: inline-block;

评论

0赞 David Spector 7/15/2022
内在内容和拟合内容有何不同?
5赞 Bondsmith 9/29/2014 #17

修订(如果您有多个孩子,则有效): 您可以使用 jQuery(查看 JSFiddle 链接)

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


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

不要忘记包括 jQuery...

在此处查看 JSfiddle

评论

0赞 Mark Amery 9/29/2016
如果您的 div 有多个子级,则会损坏;它只是将 div 宽度设置为第一个子项的宽度。
0赞 Bondsmith 9/30/2016
@MarkAmery 首先,在你投反对票之前,请仔细阅读问题,他们要求一个孩子。如果您真的很好奇如何与多个孩子一起完成,请参阅修订后的答案。
20赞 miksiii 10/5/2014 #18

您可以简单地使用 (或 )。display: inline;white-space: nowrap;

我希望你觉得这有用。

1赞 Nicolas Talichet 5/24/2015 #19

就个人而言,我只是这样做:

HTML代码:

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

CSS代码:

div {
    display: inline;
}

如果你在 div 上应用浮点数,它也可以工作,但显然,你需要在下一个 HTML 元素上应用“清除两者”的 CSS 规则。

5赞 cregox 11/4/2015 #20

如果你有容器断行,在几个小时后寻找一个好的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>

评论

0赞 Mark Amery 9/29/2016
这在 Chrome 中的片段中明显被打破了;再次单击“修复”按钮会产生与第一次单击该按钮不同的结果。
0赞 cregox 9/29/2016
@MarkAmery在我的 Mac 上,我刚刚在 chrome、safari 和 firefox 上尝试了一下,一切都很好:没有可见的错误,控制台上没有任何内容,行为一致。也许是 Windows 的东西......
16赞 Abrar Jahin 3/23/2016 #21

工作演示在这里-

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

106赞 Shuvo Habib 5/11/2016 #22

有两种更好的解决方案

  1. display: inline-block;

  2. display: table;

在这两个 display:table; 中更好,因为增加了额外的边距。display: inline-block;

因为您可以使用负边距方法来修复多余的空间display:inline-block;

1赞 Zeke 6/24/2016 #23

只是

<div style="display: inline;">
    <table>
    </table>
</div>
12赞 user6558785 7/15/2016 #24

我的 CSS3 flexbox 解决方案有两种风格:顶部的 flexbox 行为类似于 span,底部的 flexbox 行为类似于 div,在包装器的帮助下获取所有宽度。它们的类分别是“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.

评论

0赞 Horacio 11/24/2017
点赞。顺便说一句,这适用于 Chrome 62、firefox 57 和 safari 11 没有前缀display: inline-flex;
7赞 Novice 9/30/2016 #25

我们可以在 div 元素上使用两种方式中的任何一种:

display: table;

display: inline-block; 

我更喜欢使用 ,因为它可以自行处理所有多余的空间。虽然需要一些额外的空间固定。display: table;display: inline-block

20赞 RPichioli 10/15/2016 #26

您可以@user473598使用,但要注意较旧的浏览器。inline-block

/* 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

一些跨浏览器的显示属性:https://css-tricks.com/snippets/css/cross-browser-inline-block/inline-block

您可以在以下位置看到一些具有此属性的测试: https://robertnyman.com/2010/02/24/css-display-inline-block-why-it-rocks-and-why-it-sucks/

3赞 NathanielSantley 10/22/2016 #27

我会设置padding: -whateverYouWantpx;

评论

3赞 Heretic Monkey 10/22/2016
欢迎来到 Stack Overflow!请添加一些解释,说明为什么此代码有助于 OP。这将有助于为未来的观众提供可以学习的答案。有关详细信息,请参阅如何回答
0赞 NathanielSantley 10/23/2016
它会拿走一些尺寸的盒子,这样他就可以使盒子“不比里面的东西大”。
0赞 David Rector 11/17/2016
否定填充不是无效的CSS吗?
0赞 NathanielSantley 11/19/2016
远非如此。事实上,我已经使用过很多次了,而且是完全合法的。
6赞 AJchandu 12/7/2016 #28
div{
  width:auto;
  height:auto;
}

评论

0赞 quotesBro 2/13/2018
如果 div 包含内联(或内联块)元素,并且它们的字体大小和行高与 div 本身不同,则这将不起作用。
11赞 Jaimin Dave 2/22/2017 #29
<div class="parentDiv" style="display:inline-block">
    // HTML elements
</div>

这将使父 div 宽度与最大元素宽度相同。

评论

0赞 Gobliins 2/22/2018
有没有办法仅将其应用于垂直尺寸以最小化和保持水平大?
30赞 Alireza 6/17/2017 #30

好的,在许多情况下,您甚至不需要做任何事情,因为默认情况下 div has 和 auto,但如果不是您的情况,应用显示将为您工作......看看我为你创建的代码,它正在做你想要的:heightwidthinline-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>

11赞 James 6/22/2017 #31

尝试。为了使其跨浏览器兼容,请使用以下 css 代码。display: inline-block;

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>

30赞 Hamza 4/22/2018 #32

只需在CSS文件中加入样式即可

div { 
    width: fit-content; 
}

评论

0赞 David Spector 6/25/2023
我很困惑为什么 SO 允许这么多几乎重复的答案。
33赞 youngrrrr 6/8/2018 #33

这在评论中已经提到过,很难在其中一个答案中找到,所以:

如果您出于任何原因使用,则可以改用:display: flex

div {
    display: inline-flex;
}

这在浏览器中也得到了广泛支持。

评论

0赞 Infigon 2/4/2023
终于有参考了!caniuse
4赞 ZhenyaUsenko 7/30/2018 #34

您可以将其用于父元素display: flex

#parentElement {
   display: flex;
   flex-direction: column;
   align-items: flex-start;
 }
1赞 Harshana 3/26/2019 #35

如果我们定义一个全局变量并将其用于两者会怎样?

:root {
    --table-width: 400px;
}

.container{
     width:var(--table-width);
     border: 1px solid black;   // easy visualization
}
.inner-table {
     width:var(--table-width);
     border: 1px solid red;   // easy visualization
}
<div class="container">
    <table class="inner-table">
       <tr>
           <td>abc</td>
       </tr>
    </table>
</div>

3赞 Vinay Mehta 6/4/2019 #36

我有一个内部,只是设置容器对我有用。spandivmargin: autodiv

评论

0赞 Andrei Gătej 9/19/2021
任何线索为什么会这样?
28赞 Showrin Barua 7/11/2019 #37

您可以尝试此代码。按照 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>

-5赞 Rehan Rabbani 9/15/2019 #38

您可以使用 和 宽度供您选择。这使得 div 不大于其内容。height: 100%

评论

4赞 nalm 11/5/2019
如果将高度设置为 100%,则为窗口总大小的 100%
22赞 Codemaker2015 8/31/2020 #39

尝试使用 property 根据其内容大小调整 div 的宽度。width: max-content

试试这个例子,

<!DOCTYPE html>
<html>
<head>
<style>
div.ex1 {
  width:500px;
  margin: auto;
  border: 3px solid #73AD21;
}

div.ex2 {
  width: max-content;
  margin: auto;
  border: 3px solid #73AD21;
}
</style>
</head>
<body>

<div class="ex1">This div element has width 500px;</div>
<br>
<div class="ex2">Width by content size</div>

</body>
</html>
11赞 Awabil George 11/25/2020 #40

div{
width:fit-content;
}
<div>
    <table>
    </table>
</div>

评论

1赞 Mooncake 3/22/2021
必须在Firefox上工作。width: -moz-fit-content;
10赞 Trupti M Panchal 4/6/2021 #41
    .outer{
          width:fit-content;   
          display: flex;
          align-items: center;
    }
    .outer .content{
         width: 100%;
    }
        
        
        
        
<div class=outer>
    <div class=content>
       Add your content here


    </div>
        
</div>
29赞 Coder_Naveed 10/18/2021 #42

只需将宽度和高度设置为 fit-content。这很简单。

div {

    width: fit-content;
    height: fit-content;
    padding: 10px;

}

我正在添加填充:10px;。如果省略它,div 元素将完全粘在表格上,看起来会有点笨拙。填充将在元素的边框和其内容之间创建给定的空间。但这是你的愿望,不是强制性的。

评论

0赞 Mark Stewart 10/19/2021
除了部分之外,这与发布于 May 27 '13 at 0:41 的答案相同adding: 10px;
0赞 Chanrithisak Phok 3/30/2023
宽度:“适合内容”,
-3赞 Rajilesh Panoli 7/5/2022 #43

似乎这是一个 13 年前的问题。

.div{
display:inline-block;
}

.div{
display:inline-flex;
}

现在可以工作几天,没有任何兼容性问题。

2赞 uvi 9/13/2023 #44

解决方案是将 .table-badge 类设置为显示:inline-block