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.


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.


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.


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

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.


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


86

Apa yang berhasil untuk saya adalah:

display: table;

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


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


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.


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;

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

3
Itu harus. Doctype yang Anda gunakan?
Soviut

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

berfungsi dengan baik untuk saya :)


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>



19

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

Saya harap Anda menemukan ini berguna.


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/


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


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>


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.


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.


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>


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.


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>


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.


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.


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

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>


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


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!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.