divをそのコンテンツ以下にする方法を教えてください。


2071

私は次のようなレイアウトを持っています:

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

divなるべく広い範囲に拡大していきたいtableです。


90
効果は「シュリンクラッピング」と呼ばれ、回答として、これを行う方法がいくつかあり(float、inline、min / max-width)、副作用から選択できます
annakata

回答:


2426

解決策は、をに設定するdivことdisplay: inline-blockです。


239
@ leif81あなたが使用することができspanたりdivまたはulまたは何か他のものを、重要な部分は、あなたがCSSプロパティを持つ最小幅になりたいコンテナのためであるdisplay: inline-block
miahelf

10
誰かが不思議に思っている場合:親に「text-align:center」を設定し、それに「text-align:left」を設定することで、テーブルの親を中央に配置できます(例:<body style = "text-align:center"> < span style = "text-align:left; display:inline-block;"> <table> ... </ table> </ span> </ body>)
bernstein

12
スパンを使用する場合、Chromeでは機能しませんが、空白を使用して機能します。
albanx 2012

57
display: inline-blockプロパティを設定するmargin: 0 auto;と、期待どおりに動作しないことに注意してください。その場合、親コンテナtext-align: center;inline-block要素があれば、要素は水平方向に中央揃えになります。
Savas Vedova 2014

12
inline-blockうまくいきませんでしたが、inline-flexDIDでした。
mareoraft 2015年

331

CSSが「幅に合わせて縮小」と呼んでいるブロック要素が必要であり、仕様ではそのようなことを実現するための祝福された方法が提供されていません。CSS2では、縮小して合わせることが目標ではありませんが、ブラウザーが薄い空気から幅を「取得する」必要がある状況に対処することを意味します。それらの状況は次のとおりです。

  • 浮く
  • 絶対配置要素
  • インラインブロック要素
  • テーブル要素

幅が指定されていない場合。CSS3に必要なものを追加することを検討していると聞きました。とりあえず、上記のいずれかを実行します。

機能を直接公開しないという決定は奇妙に思えるかもしれませんが、それには十分な理由があります。高いです。縮小して合わせるとは、少なくとも2回の書式設定を意味します。要素の幅がわかるまで要素の書式設定を開始できません。また、コンテンツ全体の幅を計算せずに幅を計算することはできません。さらに、思うほど頻繁に縮小してフィットする要素は必要ありません。なぜあなたのテーブルの周りに余分なdivが必要なのですか?多分テーブルのキャプションはあなたが必要なすべてです。


34
inline-blockはまさにこれを目的としており、問題を完全に解決します。
miahelf

6
私は彼らがcss4に追加していると思います、それはそうなるでしょうcontent-box, max-content, min-content, available, fit-content, auto
Muhammad

4
新しいfit-contentキーワード(この回答が最初に作成された時点では存在せず、まだ完全にはサポートされいません)を使用すると、要素に「縮小して合わせる」サイズ設定を明示的に適用できます。サポートされているブラウザのみを対象とするほど幸運です。それにもかかわらず+1; これらは今のところ便利です!
Mark Amery

float私がする必要があることをした!
nipunasudha

228

私は使用すると思います

display: inline-block;

動作しますが、ブラウザの互換性についてはわかりません。


別の解決策は、(ブロックの動作を維持したい場合)div別のものでラップするdivことです:

HTML:

<div>
    <div class="yourdiv">
        content
    </div>
</div>

CSS:

.yourdiv
{
    display: inline;
}

23
ブラウザの互換性の質問に答えるには、これはDIV要素のIE7 / 8では機能しません。SPAN要素を使用する必要があります。
Matt Brock

@feeela-私は常にズームの前に*を置き*display: inline; *zoom: 1;ます。私はこの特定の状況についてはテストしていませんが、hasLayoutハックが必要なのはIE7、またはIE7モードのIE8(または気まぐれなIE8!)だけであることを過去に発見しました。
robocat

@robocatはい、確かinline-blockにIE 7で有効にしたのは回避策です
feeela

@feela-あなたのコメントは私には意味がありません!私はズームの前にも*を置くことを提案していました。
robocat 2012

4
インラインブロックのソリューションが機能する理由を説明してください。
HelloWorldNoMore

220

display: inline-block 要素に余白を追加します。

私はこれをお勧めします:

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

ボーナス:を#element追加するだけで、ファンシーな新機能を簡単に中央に配置することもできmargin: 0 autoます。


14
+1-これは、要素を中央に配置することを可能にする最新のブラウザーに最適で最もクリーンなソリューションです。position: absolute<IE8には、条件付きコメントが必要です。
12

21
指定display: inline-blockしてもマージンは追加されません。ただし、CSSはインライン要素の間に表示される空白を処理します。
12

display:tableのソリューションが機能する理由を説明してください。
HelloWorldNoMore

2
inline-blockは、要素をその親に配置することを不可能にします(たとえば、text-align:centerがある場合、左に固定することはできません)display:table is perfect :)
FlorianB

1
あなたが持っている場合、これは移動するための方法であるposition: absolute
m4heshd

90

あなたは試すことができますfit-content(CSS3):

div {
  width: fit-content; 
  /* To adjust the height as well */ 
  height: fit-content;
}

1
@BartlomiejSkwira IEまたはEclipseで動作する代替物はありますか?インラインブロックとして他のソリューションが機能しない.. \
DAVIDBALAS1

8
これは理にかなっていますが、もちろんサポートが不足しています。
サバB.

86

私にとってうまくいくのは:

display: table;

の中でdiv。(FirefoxGoogle Chromeでテスト済み)。


4
ええ、特にマージンで中央揃えする必要がある場合は、自動です。その場合、インラインブロックは解決策ではありません。
Zsolt Szatmari 2014

1
また、この要素内でパディングを行う場合は、border-collapse: separate;スタイルを設定する必要があります。これは多くのブラウザのデフォルトですが、ブートストラップのようなcssフレームワークは値をにリセットすることがよくありますcollapse
Ruslan Stelmachenko

2009年に製造されたWindows Mobile 6.5電話のMSIE 6でテストされました。全幅のdivに正常に低下します(これは電話の問題ではない可能性があります)。デスクトップで8未満のバージョンのInternet Explorerを使用している場合、サポートされていないオペレーティングシステムを使用しています(IE6はXPに付属、IE7はVistaに付属)。そのマシンでインターネットの安全な使用を続けたい場合は、GNU / Linuxにアップグレードするように指示するページにリダイレクトします。
Silas S. Brown

85

2つのより良い解決策があります

  1. display: inline-block;

    または

  2. display: table;

これら2つのうち、display:table;より良いのはdisplay: inline-block;マージンが増えるます。

display:inline-block;あなたは余分なスペースを修正するために、負のマージンメソッドを使用することができます


2
なぜdisplay:table良いのか説明していただけませんか?
Nathaniel Ford

1
display:inline-blockの場合は、負のマージン方法を使用して余分な間隔を修正する必要があります。
Shuvo Habib

8
@NathanielFord display:tableは、要素をブロックのフォーマットコンテキスト内に残すため、通常どおり、マージンなどでその位置を制御できます。display:-inline-*一方、要素をインライン書式設定コンテキストに配置すると、ブラウザは、その周囲に匿名ブロックラッパーを作成し、継承されたfont / line-height設定を持つ行ボックスを含み、その行ボックスにブロックを挿入します(配置デフォルトではベースラインで垂直に配置されます)。これには、より多くの「魔法」が含まれるため、予想外の驚きが生じます。
Ilya Streltsyn 2017


43

これが表示されますどのような文脈で知って、私はCSSスタイルのプロパティが信じられないfloatのいずれかleft、またはrightこのような効果を持つことになります。一方で、テキストをその周りにフロートさせるなど、他の副作用もあります。

私が間違っている場合は修正してください。100%確実ではないため、現在自分でテストすることはできません。


1
はい、CSS 2.1では。(CSS2.0はフロートを全幅にしますが、実際にそれを行うのはIE5 / Macのみです)。テーブルとフロートは、コンテンツに合わせて縮小できる唯一の表示タイプです。
ボビンス、2009年

41

あなたの質問に対する答えは将来私の友人にあります...

つまり、 "intrinsic"は最新のCSS3アップデートに付属しています

width: intrinsic;

残念ながらIEは遅れているため、まだサポートされていません

それについての詳細:CSS本質的&本質的サイジングモジュールレベル3私は使用できますか?:本質的および非本質的なサイジング

現時点では、満足する<span>か、または<div>設定する必要があります

display: inline-block;

12
intrinsic値は非標準です。実際ですwidth: max-content。そのMDNページまたはすでにリンクされているドラフトを参照してください
maryisdead

34

CSS2互換ソリューションは次のものを使用することです:

.my-div
{
    min-width: 100px;
}

divをフロートさせて、可能な限り小さくすることもできますが、div内に何かがフロートしている場合は、clearfixを使用する必要があります。

.my-div
{
    float: left;
}

3
そうすべき。どのdoctypeを使用していますか?
ソビエト

34
width:1px;
white-space: nowrap;

私にとってはうまくいきます:)


しかし、それでも私のケースはdiv内のテキストであり、OPのようなテーブルではありませんでした。
Rui Marques 2013年

jqueryのuiスライダーの場合、コンテンツアイテムの幅を設定する必要がないため、これは
すばらしい

26

わかりました。多くの場合、デフォルトのdiv heightwidthautoのように何もする必要はありませんが、そうでない場合は、inline-blockdisplayを適用するとうまくいきます...私が作成したコードを見てください。何を探しているの:

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>



19

display: inline;(またはwhite-space: nowrap;)を使用するだけで実行できます。

これがお役に立てば幸いです。


18

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はインラインブロックをまったくサポートしていませんが-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/で確認できます


1
あなたは何について話していますか?Mozilla Firefoxはinline-block3.0(2008)以降サポートしています。出典:developer.mozilla.org/en-US/docs/Web/CSS/...
Chazyチャズ

18

CSSファイルにスタイルを入力するだけ

div { 
    width: fit-content; 
}

1
これはクロスブラウザでサポートされているオプションではないと思います。
デビッドレクトール

2
現在Edgeでは機能していません:caniuse.com/#search=fit-content
molsson

-moz-fit-contentFFに使用できますが、おそらく他のベンダーのプレフィックスでも独自に使用できます...
Benj


18
<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を囲むのは本当に簡単でしたテーブル...そして...それはインラインプロパティを持つことも持たないこともできますが、それでもテーブルはコンテンツの全幅を保持するものです。=)


2
それは「適切な」方法ではありませんが、IE6 / 7/8は、物事が少し複雑になると、うまく機能しないことがよくあるので、なぜあなたがこのようにするのかを完全に理解しています。あなたは私の賛成票を獲得しました。
クレイゴ

私はこれを行いますが、すべての入力ボックスを囲む必要があるので、それは多くの余分なHTMLです。
NickSoft、2015

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;  
}
<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>


13

私のCSS3フレックスボックスソリューションには2つのフレーバーがあります。ラッパーの助けを借りて、上の1つはスパンのように動作し、下の1つは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、およびサファリ11のプレフィックスなしで機能します
Horacio

12
<div class="parentDiv" style="display:inline-block">
    // HTML elements
</div>

これにより、親divの幅が最大の要素の幅と同じになります。


これを垂直方向のサイズにのみ適用して、水平方向のサイズを最小化して維持する方法はありますか?
Gobliins、2018

12

お試しください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>


11

Firebugをいじくり回し-moz-fit-contentて、OPが望んでいるとおりに機能し、次のように使用できるプロパティ値を見つけました。

width: -moz-fit-content;

Firefoxでのみ機能しますが、Chromeなどの他のブラウザに相当するものは見つかりませんでした。


2017年1月の時点で、IE(すべてのバージョン、Edgeおよびモバイルを含む)およびOpera Miniはをサポートしていませんfit-content。Firefoxは幅のみをサポートします。他のブラウザでも十分にサポートされています。
Gavin

11

このコードを試すことができます。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>


7

タグ内にタグをdisplay: inline-block追加し、CSSの書式を外側のタグから新しい内側のタグに移動することで、同様の問題(アイテムが中央に配置されていたために使用したくない)を解決しました。これが適切な答えでない場合は、これを別のアイデアとして捨ててください。spandivdivspandisplay: inline block


7

div要素には次の2つの方法のいずれかを使用できます。

display: table;

または、

display: inline-block; 

display: table;それ自体がすべての余分なスペースを処理するため、私はを使用することを好みます。一方でdisplay: inline-block、いくつかの余分なスペースの固定が必要です。


6
div{
  width:auto;
  height:auto;
}

これは、divにインライン(またはインラインブロック)要素が含まれていて、フォントサイズと行の高さがdiv自体とは異なる場合は機能しません。
引用Bro

5

コンテナに改行があり、何時間もかけて適切なCSSソリューションを探して何も見つからなかった場合は、代わりに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のスニペットで明らかに壊れています。修正ボタンを2回クリックすると、最初にクリックしたときとは異なる結果が得られます。
Mark Amery

Macで@MarkAmeryを使用したところ、Chrome、Safari、Firefoxで試したところ、問題はありませんでした。目に見えるエラーはなく、コンソールには何も表示されず、動作は一貫しています。たぶんそれは窓のようなものです...
cregox

5

改訂(複数の子がある場合に機能):jQueryを使用できます(JSFiddleリンクを参照)

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


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

jQueryを含めることを忘れないでください...

こちらからJSfiddleをご覧ください


divに複数の子がある場合、これは機能しません。divの幅を最初の子の幅に設定するだけです。
マークアメリー2016

@MarkAmeryまず、反対票を投じる前に、質問を注意深く読んでください、彼らは一人の子供を求めました。複数の子供でそれがどのようにできるか本当に興味があるなら、改訂された答えを見てください。
Bondsmith 2016

4

私が試してみましdiv.classname{display:table-cell;}たがうまくいきました!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.