I have a layout similar to:
<div>
<table>
</table>
</div>
I would like for the div
to only expand to as wide as my table
becomes.
The solution is to set your div
to display: inline-block
.
You want a block element that has what CSS calls shrink-to-fit width and the spec does not provide a blessed way to get such a thing. In CSS2, shrink-to-fit is not a goal, but means to deal with a situation where browser "has to" get a width out of thin air. Those situations are:
float
absolutely positioned element
inline-block element
table element
when there are no width specified. I heard they think of adding what you want in CSS3. For now, make do with one of the above.
The decision not to expose the feature directly may seem strange, but there is a good reason. It is expensive. Shrink-to-fit means formatting at least twice: you cannot start formatting an element until you know its width, and you cannot calculate the width w/o going through entire content. Plus, one does not need shrink-to-fit element as often as one may think. Why do you need extra div around your table? Maybe table caption is all you need.
inline-block
is exactly intended for this and solves the problem perfectly.
I think using
display: inline-block;
would work, however I'm not sure about the browser compatibility.
Another solution would be to wrap your div
in another div
(if you want to maintain the block behavior):
HTML:
<div>
<div class="yourdiv">
content
</div>
</div>
CSS:
.yourdiv
{
display: inline;
}
display: inline-block
adds an extra margin to your element.
I would recommend this:
#element {
display: table; /* IE8+ and all other modern browsers */
}
Bonus: You can also now easily center that fancy new #element
just by adding margin: 0 auto
.
You can try fit-content
(CSS3):
div {
width: fit-content;
/* To adjust the height as well */
height: fit-content;
}
Browser support
Specification
margin: auto
is what I went with.
There are two better solutions
display: inline-block; OR display: table;
Out of these two display:table;
is better, because display: inline-block;
adds an extra margin.
For display:inline-block;
you can use the negative margin method to fix the extra space
What works for me is:
display: table;
in the div
. (Tested on Firefox and Google Chrome).
display: -moz-inline-stack;
display: inline-block;
zoom: 1;
*display: inline;
Foo Hack – Cross Browser Support for inline-block Styling (2007-11-19).
Not knowing in what context this will appear, but I believe the CSS-style property float
either left
or right
will have this effect. On the other hand, it'll have other side effects as well, such as allowing text to float around it.
Please correct me if I'm wrong though, I'm not 100% sure, and currently can't test it myself.
The answer for your question lays in the future my friend ...
namely "intrinsic" is coming with the latest CSS3 update
width: intrinsic;
unfortunately IE is behind with it so it doesn't support it yet
More about it: CSS Intrinsic & Extrinsic Sizing Module Level 3 and Can I Use?: Intrinsic & Extrinsic Sizing.
For now you have to be satisfied with <span>
or <div>
set to
display: inline-block;
width:1px;
white-space: nowrap;
works fine for me :)
A CSS2 compatible solution is to use:
.my-div
{
min-width: 100px;
}
You can also float your div which will force it as small as possible, but you'll need to use a clearfix if anything inside your div is floating:
.my-div
{
float: left;
}
OK, in many cases you even don't need to do anything as by default div has height
and width
as auto, but if it's not your case, applying inline-block
display gonna work for you... look at the code I create for you and it's do what you looking for:
div { display: inline-block; }
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi ultrices feugiat massa sed laoreet. Maecenas et magna egestas, facilisis purus quis, vestibulum nibh. | 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. | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi ultrices feugiat massa sed laoreet. Maecenas et magna egestas, facilisis purus quis, vestibulum nibh. |
This has been mentioned in comments and is hard to find in one of the answers so:
If you are using display: flex
for whatever reason, you can instead use:
div {
display: inline-flex;
}
This is also widely supported across browsers.
You can try this code. Follow the code in the CSS section.
div { display: inline-block; padding: 2vw; background-color: green; } table { width: 70vw; background-color: white; }
Apple | Banana | Strawberry |
Apple | Banana | Strawberry |
Apple | Banana | Strawberry |
just set the width and height to fit-content. it is very simple.
div {
width: fit-content;
height: fit-content;
padding: 10px;
}
I am adding padding: 10px;. if it is left out, the div element will completely stick with the table and it will look a bit clumsy. Padding will create the given space between the border of the element and it's contents. But it is your wish not compulsory.
adding: 10px;
part, this is the same answer that was posted on May 27 '13 at 0:41
Just put a style into your CSS file
div {
width: fit-content;
}
Try to use width: max-content
property to adjust the width of the div by it's content size.
Try this example,
<!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>
You can do it simply by using display: inline;
(or white-space: nowrap;
).
I hope you find this useful.
You can use inline-block
as @user473598, but beware of older browsers..
/* Your're working with */
display: inline-block;
/* For IE 7 */
zoom: 1;
*display: inline;
/* For Mozilla Firefox < 3.0 */
display:-moz-inline-stack;
Mozilla doesn’t support inline-block at all, but they have -moz-inline-stack
which is about the same
Some cross-browser around inline-block
display attribute: https://css-tricks.com/snippets/css/cross-browser-inline-block/
You can see some tests with this attribute in: https://robertnyman.com/2010/02/24/css-display-inline-block-why-it-rocks-and-why-it-sucks/
<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>
I know people don't like tables sometimes, but I gotta tell you, I tried the css inline hacks, and they kinda worked in some divs but in others didn't, so, it was really just easier to enclose the expanding div in a table...and...it can have or not the inline property and still the table is the one that's gonna hold the total width of the content. =)
An working demo is here-
.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; }
My CSS3 flexbox solution in two flavors: The one on top behaves like a span and the one at the bottom behaves like a div, taking all the width with the help of a wrapper. Their classes are "top", "bottom" and "bottomwrapper" respectively.
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
OS | Version |
---|---|
OpenBSD | 5.7 |
Windows | Please upgrade to 10! |
OS | Version |
---|---|
OpenBSD | 5.7 |
Windows | Please upgrade to 10! |
display: inline-flex;
. BTW this works without prefix for Chrome 62, firefox 57, and safari 11
Tampering around with Firebug I found the property value -moz-fit-content
which exactly does what the OP wanted and could be used as follow:
width: -moz-fit-content;
Although it only works on Firefox, I couldn't find any equivalent for other browsers such as Chrome.
fit-content
. Firefox supports width only. Other browsers support it well.
<div class="parentDiv" style="display:inline-block">
// HTML elements
</div>
This will make parent div width same as the largest element width.
Try display: inline-block;
. For it to be cross browser compatible please use the below css code.
div { display: inline-block; display:-moz-inline-stack; zoom:1; *display:inline; border-style: solid; border-color: #0000ff; }
Column1 | Column2 | Column3 |
.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>
div{ width:fit-content; }
width: -moz-fit-content;
to work on Firefox.
I have solved a similar problem (where I didn't want to use display: inline-block
because the item was centered) by adding a span
tag inside the div
tag, and moving the CSS formatting from the outer div
tag to the new inner span
tag. Just throwing this out there as another alternative idea if display: inline block
isn't a suitable answer for you.
We can use any of the two ways on the div
element:
display: table;
or,
display: inline-block;
I prefer to use display: table;
, because it handles, all extra spaces on its own. While display: inline-block
needs some extra space fixing.
Success story sharing
span
or adiv
orul
or anything else, the important part is for the container you would like to be minimum width have the CSS propertydisplay: inline-block
display: inline-block
property set themargin: 0 auto;
won't work as expected. In that case if the parent container hastext-align: center;
then theinline-block
element will be horizontally centered.auto
inmargin: 0 auto;
to0
(or whatever value you may choose).