如何使 div 不大于其内容?

Posted

技术标签:

【中文标题】如何使 div 不大于其内容?【英文标题】:How can I make a div not larger than its contents? 【发布时间】:2010-10-01 20:13:33 【问题描述】:

我的布局类似于:

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

我希望 div 仅扩展到我的 table 的宽度。

【问题讨论】:

这种效果被称为“收缩包装”,正如回答的那样,有几种方法可以做到这一点(浮动、内联、最小/最大宽度),所有这些都有副作用可供选择跨度> 以下答案都对我有用,除了:display: table -OR- height: fit-content !!! 【参考方案1】:

只需将宽度和高度设置为适合内容。很简单。

div 

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


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

【讨论】:

除了adding: 10px; 部分之外,这与 2013 年 5 月 27 日 0:41 发布的答案相同【参考方案2】:
    .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>

【讨论】:

【参考方案3】:

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

【讨论】:

必须是 width: -moz-fit-content; 才能在 Firefox 上工作。【参考方案4】:

尝试使用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>

【讨论】:

【参考方案5】:

你可以试试这个代码。按照 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>

【讨论】:

【参考方案6】:

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

【讨论】:

如果你设置高度 100% 它将是窗口总大小的 100%【参考方案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 属性,但表格仍然是要保存内容总宽度的表格。 =)

【讨论】:

【参考方案8】:

我在div 中有一个span,只是将margin: auto 设置为容器div 对我有用。

【讨论】:

任何线索为什么会这样?【参考方案9】:

有两个更好的解决方案

    display: inline-block;

    display: table;

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

对于display:inline-block;,你可以使用负边距的方法来修复多余的空间

【讨论】:

【参考方案10】:

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

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

【讨论】:

【参考方案11】:

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

我会推荐这个:

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

奖励:您现在还可以通过添加 margin: 0 auto 轻松地将新的 #element 居中。

【讨论】:

【参考方案12】:

好的,在许多情况下,您甚至不需要做任何事情,因为默认情况下 div 将 heightwidth 设为自动,但如果不是您的情况,请应用 inline-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>

【讨论】:

【参考方案13】:

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

如果您出于某种原因使用display: flex,您可以改用:

div 
    display: inline-flex;

This is also widely supported across browsers.

【讨论】:

【参考方案14】:

只需将样式放入您的 CSS 文件中

div  
    width: fit-content; 

【讨论】:

【参考方案15】:

您可以使用display: flex 作为父元素

#parentElement 
   display: flex;
   flex-direction: column;
   align-items: flex-start;
 

【讨论】:

【参考方案16】:

您可以将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;

Mozilla 根本不支持 inline-block,但他们有 -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/看到一些带有这个属性的测试

【讨论】:

【参考方案17】:

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

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>

【讨论】:

【参考方案18】:

解决方案是将您的div 设置为display: inline-block

【讨论】:

@leif81 您可以使用spandivul 或其他任何东西,重要的部分是您希望最小宽度的容器具有CSS 属性@987654326 @ 请注意,一旦您设置了display: inline-block 属性,margin: 0 auto; 将无法按预期工作。在这种情况下,如果父容器有text-align: center;,那么inline-block 元素将水平居中。 添加到@SavasVedova 评论,记得将margin: 0 auto; 中的auto 更改为0(或您可以选择的任何值)。【参考方案19】:
<div class="parentDiv" style="display:inline-block">
    // HTML elements
</div>

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

【讨论】:

有没有办法我可以将其仅应用于垂直尺寸以最小化并保持水平大?【参考方案20】:

我的 CSS3 flexbox 解决方案有两种风格:顶部的一个像 span 一样,底部的一个像 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.

【讨论】:

display: inline-flex; 点赞。顺便说一句,这适用于 Chrome 62、firefox 57 和 safari 11 的前缀【参考方案21】:
div
  width:auto;
  height:auto;

【讨论】:

如果 div 包含内联(或内联块)元素并且它们的字体大小和行高与 div 本身不同,这将不起作用。【参考方案22】:

我只想设置padding: -whateverYouWantpx;

【讨论】:

欢迎来到 Stack Overflow!请添加一些解释为什么此代码有助于 OP。这将有助于为未来的观众提供一个可以学习的答案。请参阅How to Answer 了解更多信息。 它会去掉一些尺寸的盒子,这样他就可以让盒子“不大于里面的东西”。 负填充不是无效的CSS吗? 远非如此。其实我用过很多次了,完全合法。【参考方案23】:

篡改 Firebug 我发现属性值 -moz-fit-content 正是 OP 想要的,可以按如下方式使用:

width: -moz-fit-content;

虽然它只适用于 Firefox,但我找不到其他浏览器(如 Chrome)的等效项。

【讨论】:

截至 2017 年 1 月,IE(所有版本,包括 Edge 和移动版)和 Opera Mini 不支持 fit-content。 Firefox 仅支持宽度。其他浏览器也很好支持。【参考方案24】:

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

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


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

不要忘记包含 jQuery...

See the JSfiddle here

【讨论】:

如果您的 div 有多个孩子,这将被破坏;它只是将 div 宽度设置为 first 孩子的宽度。 @MarkAmery 首先,在你投反对票之前,请仔细阅读问题,他们要求一个孩子。如果您真的很好奇如何处理多个孩子,请查看修改后的答案。【参考方案25】:

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

display: table;

或者,

display: inline-block; 

我更喜欢使用display: table;,因为它自己处理所有多余的空格。而display: inline-block 需要一些额外的空间修复。

【讨论】:

【参考方案26】:

简单

<div style="display: inline;">
    <table>
    </table>
</div>

【讨论】:

【参考方案27】:

一个工作演示在这里-

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

【讨论】:

【参考方案28】:

如果您有容器断线,经过数小时寻找好的 CSS 解决方案却一无所获,请改用I now use 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>

【讨论】:

这在 Chrome 中的 sn-p for me 中明显被破坏了;第二次单击修复按钮会产生与第一次单击不同的结果。 @MarkAmery 在我的 Mac 上我刚刚在 chrome、safari 和 firefox 上尝试过,一切都很好:没有可见的错误,控制台上没有任何内容,行为一致。也许是窗户的东西......【参考方案29】:

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

HTML 代码:

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

CSS 代码:

div 
    display: inline;

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

【讨论】:

【参考方案30】:

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

我希望你觉得这很有用。

【讨论】:

以上是关于如何使 div 不大于其内容?的主要内容,如果未能解决你的问题,请参考以下文章

如何使内容出现在固定的 DIV 元素下方?

如何使用 css 网格使主要内容 div 随内容扩展?

如何使弹性项目不填充弹性容器的高度? [复制]

如何使DIV背景透明内容不透明

如何让js控制的div显示指定的内容

如何使元素与溢出保持在同一行