it-swarm.com.de

Wie macht man div nicht größer als sein Inhalt?

Ich habe ein Layout ähnlich dem folgenden:

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

Ich möchte, dass der div nur so breit wird, wie mein table wird.

1919
George Snider

Die Lösung besteht darin, div auf display: inline-block zu setzen.

2274
user473598

Sie möchten ein Block-Element, das die von CSS als "auf Größe verkleinert" bezeichnete Breite hat, und die Spezifikation bietet keine gesegnete Möglichkeit, um so etwas zu erhalten. In CSS2 ist das Verkleinern kein Ziel, sondern bedeutet, mit einer Situation umzugehen, in der der Browser "eine Breite aus dem Nichts herausholen" muss. Diese Situationen sind:

  • float
  • absolut positioniertes Element
  • inline-Block-Element
  • tabellenelement

wenn keine Breite angegeben ist. Ich habe gehört, sie überlegen, was Sie in CSS3 hinzufügen wollen. Machen Sie sich vorerst mit einem der oben genannten zufrieden.

Die Entscheidung, das Feature nicht direkt verfügbar zu machen, mag seltsam erscheinen, aber es gibt einen guten Grund. Es ist teuer. Auf Größe verkleinern bedeutet, mindestens zweimal zu formatieren: Sie können ein Element erst formatieren, wenn Sie seine Breite kennen, und Sie können die Breite nicht berechnen, ohne den gesamten Inhalt zu durchlaufen. Außerdem muss das Element nicht so oft aufgeschrumpft werden, wie man denkt. Warum brauchst du extra Div um deinen Tisch? Vielleicht ist die Tabellenüberschrift alles, was Sie brauchen.

323
buti-oxa

Ich denke mit

display: inline-block;

würde funktionieren, aber ich bin mir nicht sicher über die Browser-Kompatibilität.


Eine andere Lösung wäre, Ihr div in ein anderes div zu verpacken (wenn Sie das Blockverhalten beibehalten möchten):

HTML:

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

CSS:

.yourdiv
{
    display: inline;
}
216
mbillard

display: inline-block fügt Ihrem Element einen zusätzlichen Rand hinzu.

Ich würde dies empfehlen:

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

Bonus: Sie können das schicke neue #element jetzt auch ganz einfach zentrieren, indem Sie margin: 0 auto hinzufügen.

205
Salman for Hire
display: -moz-inline-stack;
display: inline-block;
zoom: 1;
*display: inline;

Foo Hack - Cross Browser-Unterstützung für Inline-Block-Styling (2007-11-19) .

84
nikib3ro

Was für mich funktioniert ist:

display: table;

in der div. (Getestet auf Firefox und Google Chrome).

82
Sony Santos

Sie können versuchen fit-content (CSS3):

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

Es gibt zwei bessere Lösungen

  1. display: inline-block;

    OR

  2. display: table;

Von diesen beiden ist display:table; besser, weil display: inline-block; eine zusätzliche Marge hinzufügt.

Für display:inline-block; können Sie die negative Randmethode verwenden, um den zusätzlichen Platz zu korrigieren

67
Shuvo Habib

Die Antwort auf Ihre Frage liegt in der Zukunft, mein Freund ...

"intrinsic" kommt nämlich mit dem neuesten CSS3-Update

width: intrinsic;

leider ist IE dahinter, so dass es es noch nicht unterstützt

Weitere Informationen: CSS-Modul für intrinsische und extrinsische Dimensionierung, Stufe und Kann ich verwenden? : intrinsische und extrinsische Dimensionierung .

Für den Moment musst du mit <span> oder <div> zufrieden sein

display: inline-block;
41
trojan

Ich weiß nicht, in welchem ​​Kontext dies erscheinen wird, aber ich glaube, dass die CSS-artige Eigenschaft float entweder left oder right diesen Effekt haben wird. Auf der anderen Seite wird es auch andere Nebenwirkungen haben, wie z. B. das Schwebenlassen von Text.

Bitte korrigieren Sie mich, wenn ich falsch liege. Ich bin mir nicht 100% sicher und kann es derzeit nicht selbst testen.

39
falstro
width:1px;
white-space: nowrap;

funktioniert gut für mich :)

34
Daft Wullie

Eine CSS2-kompatible Lösung besteht darin, Folgendes zu verwenden:

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

Sie können Ihr div auch floaten lassen, wodurch es so klein wie möglich wird, aber Sie müssen ein clearfix verwenden, wenn etwas in Ihrem div floatet:

.my-div
{
    float: left;
}
33
Soviut

OK, In vielen Fällen müssen Sie gar nichts tun, da div standardmäßig height und width als auto definiert hat. Wenn dies nicht der Fall ist, wird inline-block angezeigt Werde für dich arbeiten ... schau dir den Code an, den ich für dich erstelle und er macht das, wonach du suchst:

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>
25
Alireza

Dies wurde in Kommentaren erwähnt und ist in einer der Antworten so schwer zu finden:

Wenn Sie display: flex aus irgendeinem Grund verwenden, können Sie stattdessen Folgendes verwenden:

div {
    display: inline-flex;
}

Dies wird auch von allen Browsern unterstützt.

20
youngrrrr

Sie können dies einfach mit display: inline; (oder white-space: nowrap;) tun.

Ich hoffe, Sie finden das nützlich.

19
miksiii
<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>

Ich weiß, dass die Leute manchmal keine Tische mögen, aber ich muss dir sagen, ich habe die CSS-Inline-Hacks ausprobiert und sie funktionierten in einigen Divs, in anderen jedoch nicht. Es war also wirklich einfacher, die expandierende Div in aufzunehmen Eine Tabelle ... und ... kann die Inline-Eigenschaft haben oder nicht, und dennoch ist die Tabelle diejenige, die die Gesamtbreite des Inhalts enthält. =)

18
Edward

Sie können inline-block als @ user473598 verwenden, achten Sie jedoch auf ältere Browser.

/* Your're working with */
display: inline-block;

/* For IE 7 */
zoom: 1;
*display: inline;

/* For Mozilla Firefox < 3.0 */
display:-moz-inline-stack;

Mozilla unterstützt überhaupt keinen Inline-Block, aber sie haben -moz-inline-stack, was ungefähr gleich ist

Einige browserübergreifende Anzeigeattribute für inline-block: https://css-tricks.com/snippets/css/cross-browser-inline-block/

Sie können einige Tests mit diesem Attribut in sehen: https://robertnyman.com/2010/02/24/css-display-inline-block-why-it-rocks-and-why-it-sucks/

18
RPichioli

Fügen Sie einfach einen Stil in Ihre CSS-Datei ein

div { 
    width: fit-content; 
}
16
Hamza

Eine funktionierende Demo ist da-

.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>
15
Abrar Jahin

Meine CSS3 flexbox -Lösung in zwei Varianten: Die oberste verhält sich wie ein Span und die unterste wie ein Div. Mit Hilfe eines Wrappers nimmt sie die gesamte Breite ein. Ihre Klassen sind "top", "bottom" und "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.
13
user6558785

Versuchen Sie display: inline-block;. Um Cross-Browser-kompatibel zu sein, verwenden Sie bitte den folgenden CSS-Code.

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>
12
James
<div class="parentDiv" style="display:inline-block">
    // HTML elements
</div>

Dadurch wird die übergeordnete div-Breite mit der größten Elementbreite identisch.

12
Jaimin Dave

Beim Herumspielen mit Firebug habe ich den Eigenschaftswert -moz-fit-content gefunden, der genau das tut, was das OP wollte und wie folgt verwendet werden könnte:

width: -moz-fit-content;

Obwohl es nur unter Firefox funktioniert, konnte ich für andere Browser wie Chrome keine Entsprechung finden.

10
Hamed Momeni

Für das div -Element können Sie eine der beiden folgenden Methoden verwenden:

display: table;

oder,

display: inline-block; 

Ich bevorzuge die Verwendung von display: table;, da alle zusätzlichen Leerzeichen von selbst behandelt werden. Während display: inline-block zusätzliche Platzhalter benötigt.

7
Novice

Ich habe ein ähnliches Problem gelöst (bei dem ich display: inline-block nicht verwenden wollte, weil das Element zentriert war), indem ich ein span -Tag in das div -Tag eingefügt und die CSS-Formatierung von verschoben habe das äußere div Tag zum neuen inneren span Tag. Wirf dies einfach als eine andere alternative Idee raus, wenn display: inline block keine passende Antwort für dich ist.

7
Jessica Brown
div{
  width:auto;
  height:auto;
}
6
AJchandu

Überarbeitet (funktioniert, wenn Sie mehrere Kinder haben): Sie können jQuery verwenden (siehe JSFiddle-Link)

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


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

Vergessen Sie nicht, die jQuery einzuschließen ...

Siehe die JSfiddle hier

5
Ogdila

Wenn Sie Container haben, die Zeilen umbrechen, nach Stunden nach einer guten CSS-Lösung suchen und keine finden, verwende ich stattdessen 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>
5
cregox

Ich würde nur padding: -whateverYouWantpx; einstellen

4

Ich habe div.classname{display:table-cell;} ausprobiert und es hat funktioniert!

4
UnLoCo

Sie können display: flex als übergeordnetes Element verwenden

#parentElement {
   display: flex;
   flex-direction: column;
   align-items: flex-start;
 }
4
ZhenyaUsenko

Sie können diesen Code ausprobieren. Folgen Sie dem Code im CSS-Abschnitt.

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>
2
Showrin Barua

Was ist, wenn wir eine globale Variable definieren und diese für beide verwenden?.

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

Ich habe ein span in einem div und habe gerade margin: auto für den Container div eingestellt.

0
Vinay Mehta

Persönlich mache ich das einfach:

HTML Quelltext:

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

CSS Code:

div {
    display: inline;
}

Wenn Sie ein Gleitkomma auf Ihr div anwenden, funktioniert es auch, aber offensichtlich müssen Sie beim nächsten HTML-Element die CSS-Regeln "clear both" anwenden.

0

Einfach

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