Bagaimana saya bisa membuat div tidak lebih besar dari isinya?

2071

Saya memiliki tata letak yang mirip dengan:

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

Saya ingin divhanya memperluas ke selebar saya tablemenjadi.

Peter Mortensen
sumber
90
efeknya disebut "shrinkwrapping", dan sebagai jawaban ada beberapa cara untuk melakukan ini (float, inline, min / max-width) yang semuanya memiliki efek samping untuk dipilih
annakata

Jawaban:

2426

Solusinya adalah mengatur divuntuk Anda display: inline-block.

pengguna473598
sumber
239
@ leif81 Anda dapat menggunakan a spanatau a divatau ulapa pun, bagian penting adalah untuk wadah yang Anda ingin memiliki lebar minimum memiliki properti CSSdisplay: inline-block
miahelf
10
jika seseorang bertanya-tanya: seseorang kemudian dapat memusatkan induk tabel dengan menyetel "text-align: center" pada induknya dan "text-align: left" di atasnya (mis. <body style = "text-align: text-align: center"> < span style = "text-align: left; display: inline-block;"> <table> ... </table> </span> </body>)
bernstein
12
Ini tidak berfungsi pada chrome untuk saya dengan span, tetapi bekerja menggunakan white-space: nowrap;
albanx
57
Harap perhatikan bahwa setelah display: inline-blockproperti Anda disetel, properti margin: 0 auto;itu tidak akan berfungsi seperti yang diharapkan. Dalam hal ini jika wadah induk memiliki text-align: center;maka inline-blockelemen akan dipusatkan secara horizontal.
Savas Vedova
12
inline-blockTIDAK bekerja untuk saya, tapi inline-flexAPAKAH.
mareoraft
331

Anda menginginkan elemen blok yang memiliki apa yang disebut CSS shrink-to-fit width dan spec tidak memberikan cara yang diberkati untuk mendapatkan hal seperti itu. Dalam CSS2, shrink-to-fit bukanlah tujuan, tetapi berarti menghadapi situasi di mana browser "harus" mendapatkan lebar dari udara tipis. Situasi tersebut adalah:

  • mengapung
  • elemen benar-benar diposisikan
  • elemen inline-block
  • elemen tabel

ketika tidak ada lebar yang ditentukan. Saya mendengar mereka berpikir untuk menambahkan apa yang Anda inginkan di CSS3. Untuk saat ini, lakukan dengan salah satu di atas.

Keputusan untuk tidak mengekspos fitur secara langsung mungkin tampak aneh, tetapi ada alasan bagus. Itu mahal. Shrink-to-fit berarti memformat setidaknya dua kali: Anda tidak dapat mulai memformat elemen hingga Anda tahu lebarnya, dan Anda tidak dapat menghitung lebar tanpa melalui seluruh konten. Plus, seseorang tidak perlu elemen shrink-to-fit sesering mungkin berpikir. Mengapa Anda perlu div tambahan di sekitar meja Anda? Mungkin hanya keterangan meja yang Anda butuhkan.

buti-oxa
sumber
34
Saya akan mengatakan inline-blockini memang dimaksudkan untuk ini dan menyelesaikan masalah dengan sempurna.
miahelf
6
saya pikir mereka menambahkan css4 dan itu akan menjadicontent-box, max-content, min-content, available, fit-content, auto
Muhammad Umer
4
Kata fit-contentkunci baru (tidak ada saat jawaban ini pertama kali ditulis, dan masih belum sepenuhnya didukung ) memungkinkan Anda menerapkan ukuran "shrink-to-fit" secara eksplisit ke elemen, menghapus kebutuhan untuk setiap peretasan yang disarankan di sini jika Anda cukup beruntung karena hanya menargetkan browser dengan dukungan. +1 tetap; ini tetap berguna untuk saat ini!
Mark Amery
floatmelakukan apa yang perlu saya lakukan!
nipunasudha
228

Saya pikir menggunakan

display: inline-block;

akan berfungsi, namun saya tidak yakin tentang kompatibilitas browser.


Solusi lain adalah dengan membungkus Anda divdengan yang lain div(jika Anda ingin mempertahankan perilaku blokir):

HTML:

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

CSS:

.yourdiv
{
    display: inline;
}
mbillard
sumber
23
Untuk menjawab pertanyaan kompatibilitas browser: ini tidak akan berfungsi dengan IE7 / 8 pada elemen DIV. Anda harus menggunakan elemen SPAN.
Matt Brock
@feeela - Saya selalu meletakkan * di depan zoom misalnya *display: inline; *zoom: 1;. Saya belum menguji untuk situasi khusus ini, tetapi saya selalu menemukan di masa lalu bahwa hack hasLayout hanya diperlukan untuk IE7, atau IE8 dalam mode IE7 (atau IE8 dalam quirks!).
robocat
@robocat Ya itu memang solusi untuk inline-blockdiaktifkan di IE 7.
feeela
@feela - komentar Anda tidak masuk akal bagi saya! Saya menyarankan meletakkan * di depan zoom juga Yaitu * zoom: 1;
robocat
4
Tolong jelaskan mengapa solusi blok inline Anda berfungsi.
HelloWorldNoMore
220

display: inline-block menambahkan margin tambahan ke elemen Anda.

Saya akan merekomendasikan ini:

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

Bonus: Anda sekarang juga dapat dengan mudah memusatkan yang baru #elementdengan hanya menambahkan margin: 0 auto.

Salman von Abbas
sumber
14
+1 - Ini adalah solusi terbaik, dan paling bersih, untuk browser modern yang juga memungkinkan elemen untuk dipusatkan. Komentar bersyarat dengan position: absolutediperlukan untuk <IE8.
tepatnya
21
Menentukan display: inline-blocktidak menambah margin. Tetapi CSS menangani spasi putih untuk ditampilkan di antara elemen inline.
feeela
Tolong jelaskan mengapa solusi tampilan Anda: table berfungsi.
HelloWorldNoMore
2
inline-block membuat elemen tidak mungkin untuk diposisikan di induknya (mis. jika ada text-align: center Anda tidak bisa membuatnya menempel ke kiri) tampilan: table is perfect :)
FlorianB
1
Ini adalah cara untuk pergi jika Anda memilikiposition: absolute
m4heshd
90

Anda dapat mencoba fit-content(CSS3):

div {
  width: fit-content; 
  /* To adjust the height as well */ 
  height: fit-content;
}
Vitalii Fedorenko
sumber
1
@ BartlomiejSkwira Ada pengganti yang bekerja di IE atau Eclipse? solusi lain sebagai inline-block tidak berfungsi untuk saya .. \
DAVIDBALAS1
8
Ini terlalu masuk akal, tentu saja tidak memiliki dukungan.
Sava B.
86

Apa yang berhasil untuk saya adalah:

display: table;

di div. (Diuji pada Firefox dan Google Chrome ).

Sony Santos
sumber
4
Ya, terutama jika Anda perlu memusatkan dengan margin: otomatis. Kasus inline-block bukanlah solusi.
Zsolt Szatmari
1
Juga perhatikan, bahwa jika Anda ingin pekerjaan padding di dalam elemen ini, Anda harus mengatur border-collapse: separate;gaya. Ini default di banyak browser tetapi sering kerangka kerja css seperti bootstrap yang menyetel ulang nilainya collapse.
Ruslan Stelmachenko
Diuji pada MSIE 6 pada ponsel Windows Mobile 6.5 yang dibuat pada tahun 2009: itu dengan anggun menurunkan ke div lebar-lebar (yang tidak mungkin menjadi masalah pada telepon). Jika ada yang menggunakan versi Internet Explorer kurang dari 8 di desktop, mereka menggunakan sistem operasi yang tidak didukung (IE6 datang dengan XP, IE7 datang dengan Vista); Saya akan mengarahkan mereka ke halaman yang memberi tahu mereka untuk meningkatkan ke GNU / Linux jika mereka ingin terus menggunakan Internet dengan aman di mesin itu.
Silas S. Brown
85

Ada dua solusi yang lebih baik

  1. display: inline-block;

    ATAU

  2. display: table;

Dari keduanya display:table;lebih baik, karenadisplay: inline-block; menambah margin ekstra.

Untuk display:inline-block;Anda dapat menggunakan metode margin negatif untuk memperbaiki ruang ekstra

Shuvo Habib
sumber
2
Apakah Anda keberatan menjelaskan mengapa display:tablelebih baik?
Nathaniel Ford
1
Untuk tampilan: inline-block, Anda harus menggunakan metode margin negatif untuk memperbaiki spasi tambahan.
Shuvo Habib
8
@NathanielFord, display:tablemeninggalkan elemen dalam konteks pemformatan Blok, sehingga Anda dapat mengontrol posisinya dengan margin dll. Seperti biasa. display:-inline-*, di sisi lain, menempatkan elemen ke dalam konteks pemformatan Inline, menyebabkan browser untuk membuat pembungkus blok anonim di sekitarnya, berisi kotak garis dengan font yang diwarisi / pengaturan ketinggian garis, dan memasukkan blok ke dalam kotak garis itu (menyelaraskan secara vertikal oleh baseline secara default). Ini melibatkan lebih banyak "keajaiban" dan karena itu berpotensi kejutan.
Ilya Streltsyn
43

Tidak tahu dalam konteks apa ini akan muncul, tapi saya percaya properti CSS-style floatbaik leftatauright akan memiliki efek ini. Di sisi lain, itu akan memiliki efek samping lain juga, seperti membiarkan teks mengambang di sekitarnya.

Harap perbaiki saya jika saya salah, saya tidak yakin 100%, dan saat ini tidak dapat mengujinya sendiri.

Falstro
sumber
1
Ya, dalam CSS 2.1. (CSS2.0 akan membuat float full-wide, tetapi hanya IE5 / Mac yang benar-benar melakukannya). Tabel dan pelampung adalah satu-satunya jenis tampilan yang dapat menyusut sesuai isinya.
bobince
41

Jawaban untuk pertanyaan Anda ada di masa depan, teman saya ...

yaitu "intrinsik" akan hadir dengan pembaruan CSS3 terbaru

width: intrinsic;

sayangnya IE ada di belakangnya sehingga belum mendukungnya

Lebih lanjut tentang hal ini: CSS Intrinsik & Modul Ukuran Ekstinsik Level 3 dan Dapatkah Saya Menggunakan? : Ukuran Intrinsik & Ekstrinsik .

Untuk saat ini Anda harus puas <span>atau <div>diatur

display: inline-block;
trojan
sumber
12
intrinsicsebagai nilai adalah non-standar. Sebenarnya itu width: max-content. Lihat halaman MDN tentang itu atau draf yang sudah ditautkan.
maryisdead
34

Solusi yang kompatibel dengan CSS2 adalah dengan menggunakan:

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

Anda juga bisa mengapung div Anda yang akan memaksanya sekecil mungkin, tetapi Anda harus menggunakan perbaikan yang jelas jika ada sesuatu di dalam div Anda mengambang:

.my-div
{
    float: left;
}
Soviut
sumber
3
Itu harus. Doctype yang Anda gunakan?
Soviut
34
width:1px;
white-space: nowrap;

berfungsi dengan baik untuk saya :)

Daft Wullie
sumber
Tapi sekali lagi kasus saya adalah teks di dalam div, dan bukan tabel seperti OP.
Rui Marques
untuk slider ui dari jquery ini greate karena kamu tidak perlu mengatur lebar item konten
CoffeJunky
26

OK, dalam banyak kasus Anda bahkan tidak perlu melakukan apa-apa karena div default telah heightdan widthsebagai otomatis, tetapi jika itu bukan kasus Anda, menerapkan inline-blocktampilan akan bekerja untuk Anda ... lihat kode yang saya buat untuk Anda dan itu lakukan apa yang kamu cari:

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>

Alireza
sumber
22

Ini telah disebutkan dalam komentar dan sulit ditemukan di salah satu jawaban sehingga:

Jika Anda menggunakan display: flexuntuk alasan apa pun, Anda dapat menggunakan:

div {
    display: inline-flex;
}

Ini juga didukung secara luas di seluruh browser.

youngrrrr
sumber
Inilah yang saya butuhkan saat sudah menggunakandisplay: flex;
Denny
19

Anda dapat melakukannya hanya dengan menggunakan display: inline;(atau white-space: nowrap;).

Saya harap Anda menemukan ini berguna.

miksiii
sumber
18

Anda dapat menggunakan inline-blocksebagai @ user473598, tetapi waspadalah terhadap browser yang lebih lama ..

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

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

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

Mozilla sama sekali tidak mendukung inline-block, tetapi mereka punya -moz-inline-stack yang hampir sama

Beberapa peramban silang di sekitar inline-blockatribut tampilan: https://css-tricks.com/snippets/css/cross-browser-inline-block/

Anda dapat melihat beberapa tes dengan atribut ini di: https://robertnyman.com/2010/02/24/css-display-inline-block-why-it-rocks-and-why-it-sucks/

RPichioli
sumber
1
Apa yang kamu bicarakan? Mozilla Firefox mendukung inline-blocksejak 3.0 (2008). Sumber: developer.mozilla.org/en-US/docs/Web/CSS/…
Chazy Chaz
18

Cukup masukkan gaya ke file CSS Anda

div { 
    width: fit-content; 
}
Hamza
sumber
1
Saya tidak berpikir ini adalah opsi yang didukung lintas-browser.
David Rektor
2
Saat ini tidak bekerja di Ujung: caniuse.com/#search=fit-content
molsson
Anda dapat menggunakan -moz-fit-contentuntuk FF, mungkin awalan vendor lain akan memungkinkan sendiri ...
Benj
1
Ini sama dengan jawaban Vitalii Fedorenko
mfluehr
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>

Saya tahu orang kadang-kadang tidak suka tabel, tetapi saya harus memberitahu Anda, saya mencoba hack inline css, dan mereka agak bekerja di beberapa divs tetapi di yang lain tidak, jadi, itu benar-benar hanya lebih mudah untuk menyertakan div yang sedang berkembang di sebuah tabel ... dan ... dapat memiliki atau tidak properti inline dan masih merupakan tabel yang akan menahan total lebar konten. =)

Edward
sumber
2
Ini bukan cara yang "tepat", tetapi IE6 / 7/8 sering tidak bermain bagus ketika keadaan menjadi sedikit rumit, jadi saya benar-benar mengerti mengapa Anda melakukannya dengan cara ini. Anda mendapat suara saya.
Craigo
Saya akan melakukan ini, tetapi saya harus mengelilingi setiap kotak input tunggal, jadi itu banyak html tambahan.
NickSoft
15

Demo yang berfungsi ada di sini-

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

Abrar Jahin
sumber
13

Solusi flexbox CSS3 saya dalam dua rasa: Yang di atas berperilaku seperti rentang dan yang di bawah berperilaku seperti div, mengambil semua lebar dengan bantuan pembungkus. Kelas mereka masing-masing adalah "top", "bottom" dan "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.

Lloyd Dominic
sumber
pujian untuk display: inline-flex;. BTW ini berfungsi tanpa awalan untuk Chrome 62, firefox 57, dan safari 11
Horacio
12
<div class="parentDiv" style="display:inline-block">
    // HTML elements
</div>

Ini akan membuat lebar div induk sama dengan lebar elemen terbesar.

Jaimin Dave
sumber
adakah cara saya bisa menerapkan ini hanya untuk ukuran vertikal untuk meminimalkan dan menjaga horisontal besar?
Goblin
12

Coba display: inline-block;. Untuk itu agar kompatibel dengan browser silang, gunakan kode css di bawah ini.

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>

James
sumber
11

Mengganggu Firebug, saya menemukan nilai properti -moz-fit-contentyang persis melakukan apa yang diinginkan OP dan dapat digunakan sebagai berikut:

width: -moz-fit-content;

Meskipun hanya berfungsi di Firefox, saya tidak dapat menemukan padanan untuk browser lain seperti Chrome.

Hamed Momeni
sumber
Pada Januari 2017, IE (termasuk semua versi, Edge dan seluler) dan Opera Mini tidak memiliki dukungan untuk fit-content. Firefox hanya mendukung lebar. Browser lain mendukungnya dengan baik.
Gavin
11

Anda dapat mencoba kode ini. Ikuti kode di bagian 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>

Showrin Barua
sumber
7

Saya telah memecahkan masalah yang sama (di mana saya tidak ingin menggunakan display: inline-blockkarena item itu terpusat) dengan menambahkan spantag di dalam divtag, dan memindahkan pemformatan CSS dari divtag luar ke spantag batin baru . Hanya membuang ini di luar sana sebagai ide alternatif lain jika display: inline blockbukan jawaban yang cocok untuk Anda.

Jessica Brown
sumber
7

Kita dapat menggunakan salah satu dari dua cara pada divelemen:

display: table;

atau,

display: inline-block; 

Saya lebih suka menggunakan display: table;, karena menangani, semua ruang ekstra sendiri. Sementara display: inline-blockmembutuhkan beberapa perbaikan ruang tambahan.

Pemula
sumber
6
div{
  width:auto;
  height:auto;
}
AJchandu
sumber
Ini tidak akan berfungsi jika div mengandung elemen inline (atau inline-block) dan mereka memiliki ukuran font dan tinggi garis yang berbeda dari div itu sendiri.
quotesBro
5

Jika Anda memiliki kontainer yang melanggar batas, setelah berjam-jam mencari solusi CSS yang baik dan tidak menemukannya, saya sekarang menggunakan jQuery sebagai gantinya:

$('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>

cregox
sumber
Ini terlihat rusak di cuplikan untuk saya di Chrome; mengklik tombol fix untuk kedua kalinya menghasilkan hasil yang berbeda dengan mengkliknya pertama kali.
Mark Amery
@MarkAmery pada mac saya, saya baru mencobanya di chrome, safari dan firefox dan semuanya baik-baik saja: tidak ada kesalahan yang terlihat, tidak ada pada konsol, perilaku konsisten. mungkin itu sesuatu dengan windows ...
cregox
5

Revisi (berfungsi jika Anda memiliki banyak anak): Anda dapat menggunakan jQuery (Lihat tautan JSFiddle)

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


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

Jangan lupa untuk menyertakan jQuery ...

Lihat JSfiddle di sini

Bondsmith
sumber
Ini rusak jika div Anda memiliki beberapa anak; itu hanya mengatur lebar div ke anak pertama .
Mark Amery
@MarkAmery Pertama-tama, sebelum Anda memberikan suara negatif, harap baca pertanyaan dengan seksama, mereka meminta satu anak. Jika Anda benar-benar ingin tahu bagaimana hal itu dapat dilakukan dengan banyak anak lihat jawaban yang direvisi.
Bondsmith
4

Saya mencoba div.classname{display:table-cell;}dan berhasil!

UnLoCo
sumber