How to make div not larger than its contents?
我的布局类似于:
| 1 2 |     <table> </table> | 
我希望
- 这种效果称为"收缩包装",正如所回答的,有两种方法可以做到这一点(浮动、内联、最小/最大宽度),所有这些方法都有副作用可供选择。
解决方案是将您的
- @leif81您可以使用span 或div 或ul 或其他任何东西,重要的是对于您希望成为最小宽度的容器,具有css属性display: inline-block 的容器。
- 即使包含的元素具有"display:block;float:left;",Visual Studio 2010设计视图也无法正确呈现此效果-它们都将垂直显示,其中的div宽度等于最宽的元素。但是浏览器都正确地显示了这一点(甚至IE)。
- 如果有人想知道:然后可以通过将"text-align:center"设置为它的父级,并将"text-align:left"设置为它的父级(例如,
 … ) 
- @Miahelf似乎不适用,只适用于。这是IE8和FF 12中使用的代码。浏览器是否特定?
- 它不适用于我的Chrome和Span,而是使用空白:nowrap;
- 这似乎仍然支持在Firefox中进行包装。其他人也遇到过这个问题吗?我有一个具有100%宽度的内联块的跨度,里面有两个元素,一个向左浮动,另一个向右浮动。有人有解决方案吗?我快疯了!
- 请注意,一旦拥有
display: inline-block 属性set,margin: 0 auto; 将无法按预期工作。在这种情况下,如果父容器具有text-align: center; ,那么inline-block 元素将水平居中。
- @用户473598:这不起作用。内容超出了分区的宽度。
- 如果你仍然需要元素后的换行符呢?内联块将删除此项。
- 以东十一〔0〕没有为我工作,但以东十一〔16〕为我工作。
- 如果您正在使用Twitter引导(在3.0中测试)和"要将某个内容置于.row的中心位置,则可以使用网格系统中的.offset*类将列缩进n列。"如果这会破坏设计,请调整内容的边距和填充。参考:github.com/twbs/bootstrap/issues/399
- 请解释您的内联块解决方案的工作原理。
- 如果
div 的内容溢出到下一行,这就不起作用。您需要一个块元素,它具有CSS所调用的收缩以适应宽度,而规范并没有提供一个获得这种东西的好方法。在CSS2中,收缩以适应不是一个目标,而是处理浏览器"必须"从稀薄空气中获得宽度的情况。这些情况包括: - 浮动
- 绝对定位元件
- 内联块元素
- 表元素
 当没有指定宽度时。我听说他们想在CSS3中添加你想要的内容。现在,用上面的其中一个做吧。 不直接公开特性的决定可能看起来很奇怪,但有一个很好的理由。它很贵。收缩到合适意味着至少要格式化两次:在知道元素的宽度之前,不能开始格式化元素,并且不能计算整个内容的宽度w/o。另外,我们不需要像想象的那样经常收缩来适应元素。为什么你的桌子周围需要额外的隔板?也许你只需要表标题。 - 我想说,inline-block 正是为了这个目的,并且完美地解决了这个问题。
- 我认为他们在增加CSS4,这将是content-box, max-content, min-content, available, fit-content, auto 。
- 新的fit-content 关键字(在首次编写此答案时不存在,但仍然不完全支持)允许您显式地对元素应用"收缩以适应"大小调整,如果您幸运地只针对支持的浏览器,则无需使用此处建议的任何黑客。+尽管如此,这些仍然是有用的!
- 江户十一〔三〕做了我该做的!
 我想用 1display: inline-block;可以,但是我不确定浏览器的兼容性。 另一种解决方案是将您的 div 包装在另一个div 中(如果您希望保持块行为):HTML: 1contentCSS: 1
 2
 3
 4.yourdiv
 {
 display: inline;
 }- 回答浏览器兼容性问题:这在DIV元素上不适用于IE7/8。必须使用跨度元素。
- @Feeela-我总是在变焦前放一个*例如*display: inline; *zoom: 1; 。我还没有测试过这种特殊情况,但我过去总是发现hasLayout hack只需要用于IE7或IE7模式下的IE8(或奇怪的IE8!).
- @robocat是的,在IE 7中启用inline-block 确实是一种解决方案。
- @感觉-你的评论对我来说毫无意义!我建议把*放在变焦前,也就是说*变焦:1;
- 请解释您的内联块解决方案的工作原理。
 display: inline-block 为元素添加了额外的空白。我建议这样做: 1
 2
 3#element {
 display: table; /* IE8+ and all other modern browsers */
 }额外的好处:你现在也可以通过添加 margin: 0 auto ,轻松地将新的#element 居中。- +1-这是现代浏览器的最佳、最干净的解决方案,也允许元素居中。- 指定
display: inline-block 不会增加任何利润。但css处理要在内联元素之间显示的空白。
- 请解释一下为什么您的显示解决方案:表格有效。
- 内联块使元素无法定位在其父元素中(例如,如果有文本对齐:居中,则无法使其保持在左侧)显示:表是完美的:)
- 如果你有
position: absolute 的话,这就是你要走的路。
- 指定
 
 1
 2
 3
 4display: -moz-inline-stack;
 display: inline-block;
 zoom: 1;
 *display: inline;foo hack–对内联块样式的跨浏览器支持(2007-11-19)。 - 任何有此问题的人都应该添加所有这些样式。firefox在不使用-moz-inline-stack 时增加了利润。
 对我有用的是: 1display: table;在 div 中。(在火狐和谷歌浏览器上测试)。- 是的,特别是当你需要以边缘为中心时:自动。这种情况下,内联块不是解决方案。
- 另外请注意,如果您希望在这个元素中进行填充工作,则必须设置border-collapse: separate; 样式。在许多浏览器中,它是默认的,但通常CSS框架(如bootstrap)会将其值重置为collapse 。
- 在2009年生产的WindowsMobile6.5手机上对msie 6进行了测试:它优雅地降为全宽DIV(这在手机上不太可能是问题)。如果有人在桌面上使用低于8的Internet Explorer版本,他们使用的是不受支持的操作系统(IE6随XP提供,IE7随Vista提供);我会将他们重定向到一个页面,告诉他们如果想继续安全使用该计算机上的Internet,可以升级到GNU/Linux。
 您可以试用 fit-content (css3):1
 2
 3
 4
 5div {
 width: fit-content;
 /* To adjust the height as well */
 height: fit-content;
 }- 浏览器支持
- 规范
 - IE canius.com/search=fit内容不支持:(
- @Bartlomiejskwira有在IE或Eclipse中工作的替代者吗?其他解决方案作为内联块对我不起作用。
- 这太有道理了,当然它缺乏支持。
 有两个更好的解决方案 display: inline-block; 或 display: table; 在这两个 display:table; 中,display: inline-block; 增加了额外的利润,因此更好。对于 display:inline-block; ,可以使用负边缘法来固定额外的空间。- 你能解释一下为什么display:table 更好吗?
- 对于display:inline块,必须使用负边距方法来固定额外的间距。
- @nathanielford,display:table 将元素保留在块格式上下文中,因此您可以像往常一样使用页边距等控制其位置。另一方面,display:-inline-* 将元素放入内联格式上下文中,使浏览器围绕它创建匿名块包装器,其中包含具有继承的字体/行高设置的行框,并将块插入该行框(默认情况下按基线垂直对齐)。这涉及到更多的"魔法",因此可能带来惊喜。
 你的问题的答案将在未来,我的朋友… 也就是说,最新的CSS3更新提供了"固有"功能。 1width: intrinsic;不幸的是,IE落后了,所以还不支持它。 关于它的更多信息:CSS内部和外部分级模块级别3,我可以使用吗?:内部和外部大小调整。 现在你必须对 或 的设置感到满意。 1display: inline-block;- intrinsic 作为一个值是不标准的。实际上是- width: max-content 。请参阅该或已链接草稿上的MDN页。
 不知道在什么上下文中会出现这种情况,但我相信CSS样式的属性 float 或者left 或者right 都会产生这种效果。另一方面,它也会有其他副作用,比如允许文本在它周围浮动。不过,如果我错了,请纠正我,我不能100%确定,目前不能自己测试。 - 是的,在CSS 2.1中。(css2.0将使浮点全宽,但实际上只有ie5/mac可以做到这一点)。表和浮动是唯一可以收缩以适应其内容的显示类型。
 
 1
 2width:1px;
 white-space: nowrap;对我来说很好:) - 但是,我的案例是一个DIV中的文本,而不是像OP这样的表格。
- 对于jquery的ui滑块,这是灰色的,因为您不需要设置内容项的宽度。
 CSS2兼容的解决方案是使用: 1
 2
 3
 4.my-div
 {
 min-width: 100px;
 }您也可以浮动您的DIV,这将使其尽可能小,但如果DIV中有任何内容是浮动的,则需要使用ClearFix: 1
 2
 3
 4.my-div
 {
 float: left;
 }- 最小宽度在firefox 3和ie 8中不起作用。
- 它应该。您使用的是哪种doctype?
 好吧,在很多情况下,您甚至不需要做任何事情,因为默认情况下,DIV将 height 和width 作为auto,但如果不是您的情况,应用inline-block 显示将对您起作用…看看我为你创建的代码,它就是你想要的:1
 2
 3div {
 display: inline-block;
 }1
 2
 3
 4
 5
 6
 7<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>您只需使用 display: inline; 或white-space: nowrap; 即可完成。希望你觉得这个有用。 您可以使用 inline-block 作为@user473598,但要注意旧的浏览器。1
 2
 3
 4
 5
 6
 7
 8
 9/* 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中看到一些具有此属性的测试/ - 你在说什么?Mozilla Firefox自3.0(2008)起支持inline-block 。来源:developer.mozilla.org/en-us/docs/web/css/&hellip;
 这一点已在评论中提到,很难在其中一个答案中找到,因此: 如果您出于任何原因使用 display: flex ,您可以使用:1
 2
 3div {
 display: inline-flex;
 }这在浏览器中也得到了广泛的支持。 
 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11<table cellpadding="0" cellspacing="0" border="0">
 <tr>
 <td>
 
 
 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 =)
 
 
 </td>
 </tr>
 </table>我知道人们有时不喜欢表格,但我得告诉你,我尝试过CSS内联黑客,他们有点在一些div中工作,但在其他div中没有,所以,把扩展的div放在表格中确实比较容易……而且……它可以有也可以没有inline属性,而且表格仍然是能够容纳内容总宽度的表格。=) - 这不是"正确"的方式,但是IE6/7/8经常只是在事情变得有点复杂时表现不好,所以我完全理解为什么你会这样做。你得到了我的支持票。
- 我会这样做,但我必须包围每一个输入框,所以这是很多额外的HTML。
 这里有一个工作演示- 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12.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;
 }1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13The Way is using inline-block
 
 Supporting elements are also added in CSS.
 
 
 Floating box
 Floating box
 Floating box
 Floating box
 Floating box
 Floating box
 Floating box
 Floating box只需将样式放入CSS文件 1
 2
 3div {
 width: fit-content;
 }- 我不认为这是一个跨浏览器支持的选项。
- 目前无法在edge中工作:canius.com/search=fit content
 我的CSS3flexbox解决方案有两种风格:一种是顶部的行为像一个跨度,另一种是底部的行为像一个DIV,在包装器的帮助下获取所有宽度。它们的类分别是"top"、"bottom"和"bottomwrapper"。 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33body {
 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;
 }1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39Is this
 
 <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>
 
 what you are looking for?
 
 Or may be...
 
 
 <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>
 
 
 this is what you are looking for.- 以东十一〔二〕的荣誉。顺便说一句,对于chrome62、firefox 57和safari 11来说,这是不带前缀的。
 试试 display: inline-block; 。要使其与跨浏览器兼容,请使用下面的CSS代码。1
 2
 3
 4
 5
 6
 7
 8div {
 display: inline-block;
 display:-moz-inline-stack;
 zoom:1;
 *display:inline;
 border-style: solid;
 border-color: #0000ff;
 }1
 2
 3
 4
 5
 6
 7<table>
 <tr>
 <td>Column1</td>
 <td>Column2</td>
 <td>Column3</td>
 </tr>
 </table>
 1// HTML elements这将使父DIV宽度与最大元素宽度相同。 - 有没有一种方法可以只应用于垂直尺寸,以最小化和保持水平大?
 在对Firebug的篡改中,我发现了属性值 -moz-fit-content ,它完全符合OP的要求,可以如下使用:1width: -moz-fit-content;虽然它只在火狐上运行,但我找不到任何与其他浏览器(如Chrome)相同的浏览器。 - -适用于Chrome 31+的WebKit内容。canius.com/search=匹配内容
- 截至2017年1月,IE(包括所有版本,Edge和Mobile)和Opera Mini不支持fit-content 。火狐只支持宽度。其他浏览器也很支持它。
 我通过在 div 标记内添加一个span 标记,并将CSS格式从外部div 标记移动到新的内部span 标记,解决了类似的问题(我不想使用display: inline-block ,因为该项是居中的)。如果display: inline block 对你来说不是一个合适的答案,那么把它作为另一个备选方案扔出去。我们可以在 div 元素上使用以下两种方法之一:1display: table;或者, 1display: inline-block;我更喜欢使用 display: table; ,因为它自己处理所有额外的空间。虽然display: inline-block 需要一些额外的空间固定。
 1
 2
 3
 4div{
 width:auto;
 height:auto;
 }- 如果DIV包含inline(或inline block)元素,并且它们的字体大小和行高与DIV本身不同,则这将不起作用。
 修订(如果您有多个孩子,则适用):您可以使用jquery(查看jfiddle链接) 1
 2
 3
 4
 5
 6
 7
 8var d= $('div');
 var w;
 
 
 d.children().each(function(){
 w = w + $(this).outerWidth();
 d.css('width', w + 'px')
 });不要忘记包含jquery… 看这里的小提琴 - 如果您的DIV有多个子级,这个值就会被破坏;它只是将DIV宽度设置为第一个子级的宽度。
- @首先,在你投反对票之前,请仔细阅读问题,他们要求一个孩子。如果你真的很好奇多个孩子怎么做,请看修改后的答案。
 如果有容器破坏了行,在数小时后寻找一个好的CSS解决方案,却找不到,我现在使用jquery代替: 1
 2
 3
 4
 5
 6
 7
 8
 9
 10$('button').click(function(){
 
 $('nav ul').each(function(){
 
 $parent = $(this).parent();
 
 $parent.width( $(this).width() );
 
 });
 });1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38nav {
 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;
 }1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js">
 
 <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的代码片段中明显地被打破了;第二次单击"修复"按钮会产生不同的结果,以便第一次单击它。
- @在我的Mac上,我刚在Chrome、Safari和Firefox上试用过,一切都很好:没有明显的错误,控制台上没有任何东西,行为一致。也许是窗户的问题…
 我试了一下 div.classname{display:table-cell;} ,结果成功了!我只会设置 padding: -whateverYouWantpx; 。- 欢迎使用堆栈溢出!请添加一些解释为什么此代码有助于操作。这将有助于提供一个答案,未来的观众可以学习。有关更多信息,请参阅如何回答。
- 它会带走一些大小的盒子,这样他可以使盒子"不大于其内容物"。
- 负填充不是无效的css吗?
- 远非如此。事实上,我用过很多次,这是完全合法的。
 您可以使用 display: flex 作为父元素1
 2
 3
 4
 5#parentElement {
 display: flex;
 flex-direction: column;
 align-items: flex-start;
 }如果我们定义一个全局变量并将其用于这两个变量该怎么办? 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12: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
 }1
 2
 3
 4
 5<table class="inner-table">
 <tr>
 <td>abc</td>
 </tr>
 </table>简单地 1
 2<table>
 </table>个人而言,我只是这样做: HTML代码: 1
 2<table>
 </table>CSS代码: 1
 2
 3div {
 display: inline;
 }如果您在DIV上应用了一个float,它也可以工作,但是显然,您需要在下一个HTML元素上应用一个"清除两个"的CSS规则。 在所有浏览器上,这似乎对我都适用。这个例子是我在网上和时事通讯中使用的一个实际广告。只需更改DIV的内容。它将根据指定的填充量调整和收缩包装。 1
 2<font color=red size=4>Need to fix a birth certificate? Learn Photoshop in a Day!
 </font>- 字体完全不受欢迎。可能在任何当前引擎上呈现为
- @Zanlok他在谈论一个时事通讯,似乎仍然是电子邮件领域的公平游戏,尽管它的贬低(第二个答案):stackoverflow.com/questions/8012799/&hellip; 
 
 Copyright © 码农家园 联系:[email protected]