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]