如何使div不大于其内容?

1960 html css width

我的布局类似于:

<div>
    <table>
    </table>
</div>
Run Code Online (Sandbox Code Playgroud)

我希望div只扩展到我的范围table.

小智 2322

解决方案是将您设置divdisplay: inline-block.

  • @ leif81你可以使用`span`或`div`或`ul`或其他任何东西,重要的部分是你希望最小宽度的容器有CSS属性`display:inline-block` (235认同)
  • 请注意,一旦你有`display:inline-block`属性设置`margin:0 auto;`将无法按预期工作.在这种情况下,如果父容器具有`text-align:center;`,那么`inline-block`元素将水平居中. (52认同)
  • 对于带有span的我来说,它不适用于chrome,但使用white-space:nowrap; (11认同)
  • 如果有人想知道:那么可以通过在其父级上设置"text-align:center"并在其上设置"text-align:left"来使表格的父级居中(例如<body style ="text-align:center"> < span style ="text-align:left; display:inline-block;"> <table> ... </ table> </ span> </ body>) (10认同)
  • `inline-block`对我不起作用,但`inline-flex` DID. (9认同)
  • 请解释为什么你的内联块解决方案有效. (3认同)
  • 如果我们希望元素具有另一个显示属性(例如网格),这不是一个解决方案。[@Vitalii Fedorenko 的解决方案](/sf/answers/1173552131/) 使用更新的 `fit-content` 属性,该属性适用于任何显示属性,不添加边距,并且 [在所有浏览器](https://developer.mozilla.org/en-US/docs/Web/CSS/fit-content#browser_compatibility)。 (3认同)
  • 如果我希望我的组件能够内联流动,那就太好了 XD。“fit-content”似乎是现代的解决方案。 (2认同)

but*_*oxa 325

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

  • 浮动
  • 绝对定位元素
  • 内联块元素
  • 表元素

没有指定宽度时.我听说他们想在CSS3中添加你想要的东西.现在,请使用以上其中一项.

不直接公开该功能的决定可能看起来很奇怪,但有一个很好的理由.它是昂贵的.缩小到适合意味着格式化至少两次:在知道元素的宽度之前,不能开始格式化元素,并且无法计算整个内容的宽度.另外,人们可能不会像人们想象的那样经常使用缩小到合适的元素.为什么你需要额外的桌子?也许你只需要表格标题.

  • 我会说`inline-block`正是为了这个目的而完美地解决了这个问题. (34认同)
  • 我认为他们正在添加css4,它将是`content-box,max-content,min-content,available,fit-content,auto` (6认同)
  • 新的[`fit-content`](https://www.w3.org/TR/css-sizing-3/#fit-content)关键字(首次编写此答案时不存在,仍然[不完整]支持](http://caniuse.com/#feat=intrinsic-width))允许您明确地将"缩小到适合"大小调整应用于元素,如果您幸运的话,无需使用此处建议的任何黑客足以只支持具有支持的浏览器.尽管如此; 这些仍然有用! (4认同)

mbi*_*ard 221

我觉得用

display: inline-block;
Run Code Online (Sandbox Code Playgroud)

会工作,但我不确定浏览器的兼容性.


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

HTML:

<div>
    <div class="yourdiv">
        content
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

CSS:

.yourdiv
{
    display: inline;
}
Run Code Online (Sandbox Code Playgroud)

  • 要回答浏览器兼容性问题:这不适用于DIV元素上的IE7/8.您必须使用SPAN元素. (23认同)
  • 请解释为什么你的内联块解决方案有效. (4认同)

Sal*_*bas 212

display: inline-block 为您的元素添加额外的余量.

我会推荐这个:

#element {
    display: table; /* IE8+ and all other modern browsers */
}
Run Code Online (Sandbox Code Playgroud)

奖励:你现在也可以#element通过添加来轻松地将这个花哨的新东西放在中心位置margin: 0 auto.

  • 指定`display:inline-block`不会添加任何边距.但CSS处理内联元素之间显示的空白. (21认同)
  • +1 - 这是现代浏览器的最佳,最干净的解决方案,它也允许元素居中.对于<IE8,需要使用`position:absolute`的条件注释. (14认同)
  • inline-block使元素无法在其父元素中定位(例如,如果有文本对齐:中心,则无法将其固定在左侧)显示:table is perfect :) (2认同)

nik*_*3ro 85

display: -moz-inline-stack;
display: inline-block;
zoom: 1;
*display: inline;
Run Code Online (Sandbox Code Playgroud)

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

  • 任何有此问题的人都应该添加所有这些样式.不使用`-moz-inline-stack`时Firefox增加了利润 (3认同)

Son*_*tos 83

对我有用的是:

display: table;
Run Code Online (Sandbox Code Playgroud)

div.(在Firefox谷歌浏览器上测试过).

  • 是的,特别是如果你需要以保证金为中心:auto.那种情况内联块不是解决方案. (3认同)

Vit*_*nko 80

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

div {
  width: fit-content; 
  /* To adjust the height as well */ 
  height: fit-content;
}
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案 (10认同)
  • 这太有意义了,当然它缺乏支持。 (5认同)
  • @BartlomiejSkwira 在 IE 或 Eclipse 中工作的任何替代品?其他解决方案作为内联块对我不起作用..\ (2认同)
  • 对我来说“宽度:-moz-fit-content;宽度:fit-content;” 工作了。否则它无法在 Firefox 中运行(2020 年 11 月)。 (2认同)

Shu*_*bib 73

有两个更好的解决方案

  1. display: inline-block;

    要么

  2. display: table;

这两个display:table;更好.

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

  • @NathanielFord,`display:table`将元素保留在块格式化上下文中,因此您可以像往常一样用边距等控制其位置.另一方面,`display:-inline-*`将元素放入Inline格式化上下文,导致浏览器在其周围创建匿名块包装器,包含带有继承字体/行高设置的行框,并插入块进入该行框(默认情况下按基线垂直对齐).这涉及更多"魔力",因此潜在的惊喜. (7认同)
  • 您介意解释“ display:table”为什么更好吗? (2认同)

tro*_*jan 42

你的问题的答案在未来奠定了我的朋友......

即"内在"即将推出最新的CSS3更新

width: intrinsic;
Run Code Online (Sandbox Code Playgroud)

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

更多关于它:CSS内在和外在大小模块3级,我可以使用吗?:内在和外在尺寸.

现在你必须满意<span><div>设置为

display: inline-block;
Run Code Online (Sandbox Code Playgroud)

  • `intrinsic`作为一个值是非标准的.它实际上是`width:max-content`.请参阅[MDN页面](https://developer.mozilla.org/en/docs/Web/CSS/width#max-content)或已链接的草稿. (12认同)

fal*_*tro 40

不知道在什么情况下,这将出现,但我相信,CSS-style属性float要么left还是right会产生这样的效果.另一方面,它也会产生其他副作用,例如允许文本在其周围浮动.

如果我错了,请纠正我,我不是百分百肯定,目前无法自己测试.


小智 35

width:1px;
white-space: nowrap;
Run Code Online (Sandbox Code Playgroud)

对我来说很好:)


Sov*_*iut 34

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

.my-div
{
    min-width: 100px;
}
Run Code Online (Sandbox Code Playgroud)

你也可以浮动你的div,这将迫使它尽可能小,但如果你的div内的任何东西是浮动的,你需要使用一个clearfix:

.my-div
{
    float: left;
}
Run Code Online (Sandbox Code Playgroud)

  • min-width在Firefox 3和IE 8中不起作用. (3认同)
  • 这应该.您使用的是哪种doctype? (3认同)

小智 29

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

div {

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

}
Run Code Online (Sandbox Code Playgroud)

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


Ali*_*eza 26

好吧,在许多情况下你甚至不需要做任何事情,因为默认div heightwidthauto 都有,但如果不是你的情况,应用inline-block显示将为你工作...看看我为你创建的代码,它是做的你在找什么:

div {
  display: inline-block;
}
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)


you*_*rrr 22

这已在评论中提及,很难在其中一个答案中找到:

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

div {
    display: inline-flex;
}
Run Code Online (Sandbox Code Playgroud)

这也得到了浏览器的广泛支持.


Sho*_*rua 21

你可以试试这个代码。按照 CSS 部分中的代码进行操作。

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

table {
  width: 70vw;
  background-color: white;
}
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)


mik*_*iii 20

您只需使用display: inline;(或white-space: nowrap;)即可.

希望这个对你有帮助.


Cod*_*ker 20

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

试试这个例子,

<!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>
Run Code Online (Sandbox Code Playgroud)


Edw*_*ard 19

<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>
Run Code Online (Sandbox Code Playgroud)

我知道人们有时候不喜欢桌子,但是我得告诉你,我尝试过css inline hacks,他们有点在一些div中工作但是在其他人没有,所以,真的只是更容易将扩展div放入一个表......并且......它可以具有或不具有内联属性,并且表仍然是将保持内容总宽度的表.=)

  • 这不是"正确的"方式,但是当事情变得有点复杂时,IE6/7/8通常不会很好玩,所以我完全明白为什么你会这样做.你得到了我的投票. (2认同)

RPi*_*oli 19

您可以使用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;
Run Code Online (Sandbox Code Playgroud)

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/


Abr*_*hin 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;  
}
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)


小智 15

只需将样式放入CSS文件即可

div { 
    width: fit-content; 
}
Run Code Online (Sandbox Code Playgroud)

  • 目前在Edge中不起作用:https://caniuse.com/#search=fit-content (2认同)

小智 13

我的CSS3 flexbox解决方案有两种形式:顶部的那个表现得像一个跨度,底部的表现就像一个div,在包装器的帮助下占据所有宽度.他们的课程分别是"顶部","底部"和"底部包装".

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;
}
Run Code Online (Sandbox Code Playgroud)
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.
Run Code Online (Sandbox Code Playgroud)


Jai*_*ave 12

<div class="parentDiv" style="display:inline-block">
    // HTML elements
</div>
Run Code Online (Sandbox Code Playgroud)

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


小智 12

试试display: inline-block;.要使其与浏览器兼容,请使用以下css代码.

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


Ham*_*eni 10

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

width: -moz-fit-content;
Run Code Online (Sandbox Code Playgroud)

虽然它只适用于Firefox,但我找不到任何与Chrome等其他浏览器相同的功能.

  • -webkit-fit-content for chrome 31+.http://caniuse.com/#search=fit-content (3认同)

Jes*_*own 7

display: inline-block通过在span标签内添加div标签,并将CSS格式从外部div标签移动到新的内部span标签,解决了类似的问题(我不想使用,因为项目居中).如果display: inline block对你来说不合适,那就把它当作另一种选择.


Nov*_*ice 7

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

display: table;
Run Code Online (Sandbox Code Playgroud)

要么,

display: inline-block; 
Run Code Online (Sandbox Code Playgroud)

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


AJc*_*ndu 6

div{
  width:auto;
  height:auto;
}
Run Code Online (Sandbox Code Playgroud)


Tru*_*hal 6

    .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>
Run Code Online (Sandbox Code Playgroud)


Ogd*_*ila 5

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

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


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

别忘了包含jQuery ......

在这里查看JSfiddle


cre*_*gox 5

如果你有容器破线,在几小时后寻找一个好的CSS解决方案并找不到,我现在使用 jQuery代替:

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

  $('nav ul').each(function(){
    
    $parent = $(this).parent();
    
    $parent.width( $(this).width() );
    
  });
});
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)