Bir div'ı içeriğinden daha büyük olmayan nasıl yapabilirim?


2070

Şuna benzer bir düzen var:

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

Ben divsadece tableolur benim kadar genişlemek istiyorum .


90
efekt "shrinkwrapping" olarak adlandırılır ve yanıtlandığı gibi, bunların arasından seçim yapabileceğiniz yan etkileri olan birkaç yol vardır (şamandıra, satır içi, min / maks genişlik)
annakata

Yanıtlar:


2426

Çözüm ayarlamaktır divTo display: inline-block.


239
@ leif81 Bir spanveya bir divveya ulbaşka bir şey kullanabilirsiniz , önemli olan minimum genişlik olmasını istediğiniz kap için CSS özelliğine sahipdisplay: inline-block
miahelf

10
birisi merak ederse: üst tablonun üzerinde "text-align: center" ve üzerinde "text-align: left" ayarlayarak tablonun üst öğesini ortalayabilirsiniz (örn. <body style = "text-align: center"> < span style = "text-align: left; display: inline-block;"> <table> ... </table> </span> </body>)
bernstein

12
Açıklık ile benim için krom üzerinde çalışmaz, ancak beyaz boşluk kullanarak çalışır: nowrap;
albanx

57
display: inline-blockMülk ayarını yaptıktan sonra margin: 0 auto;beklendiği gibi çalışmayacağını lütfen unutmayın . Bu durumda, ana kap ise text-align: center;daha sonra inline-blockyatay bir şekilde ortalanır.
Savas Vedova

12
inline-blockbenim için işe yaramadı, ama inline-flexDID.
mareoraft

331

CSS'nin sığması için küçültme genişliği olarak adlandırdığı bir blok öğesi istiyorsunuz ve özellik böyle bir şeyi elde etmek için mübarek bir yol sağlamıyor. CSS2'de, sığacak şekilde küçültmek bir hedef değildir, ancak tarayıcının "ince havadan genişlik" elde etmesi gereken bir durumla uğraşmak anlamına gelir. Bu durumlar:

  • şamandıra
  • kesinlikle konumlandırılmış eleman
  • satır içi blok elemanı
  • tablo öğesi

hiçbir genişlik belirtilmediğinde. CSS3'te istediğinizi eklemeyi düşündüklerini duydum. Şimdilik yukarıdakilerden biriyle yapın.

Özelliği doğrudan ortaya çıkarmama kararı garip gelebilir, ancak bunun iyi bir nedeni vardır. Bu pahalı. Sığdırmak için daralt, en az iki kez biçimlendirme anlamına gelir: bir öğenin genişliğini bilmeden biçimlendirmeye başlayamazsınız ve tüm içeriğe sahip olmadan genişliği hesaplayamazsınız. Ayrıca, kişinin düşündüğü kadar sıkı daraltma elemanına ihtiyacı yoktur. Masanızın etrafında neden fazladan div'e ihtiyacınız var? Belki tek ihtiyacınız olan tablo başlığı.


34
inline-blockTam olarak bunun için tasarlandığını söyleyebilirim ve sorunu mükemmel bir şekilde çözer.
miahelf

6
sanırım css4 ekliyorlar ve olurducontent-box, max-content, min-content, available, fit-content, auto
Muhammed Umer

4
Yeni fit-contentanahtar kelime (bu yanıt ilk kez yazıldığında var olan ve hala tam olarak desteklenmeyen ), bir öğeye açıkça "sığdırmak için küçült" boyutlandırma uygulamanıza izin verirseniz, burada önerilen saldırıların herhangi birine olan ihtiyacı ortadan kaldırır yalnızca destekli tarayıcıları hedefleyecek kadar şanslı. Yine de +1; bunlar şimdilik faydalı olmaya devam ediyor!
Mark Amery

floatne yapmam gerektiğini yaptım!
nipunasudha

228

Bence kullanmak

display: inline-block;

ancak tarayıcı uyumluluğundan emin değilim.


Başka bir çözüm div, bir başkasına sarmak olacaktır div(blok davranışını korumak istiyorsanız):

HTML:

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

CSS:

.yourdiv
{
    display: inline;
}

23
Tarayıcı uyumluluk sorusunu cevaplamak için: bu, DIV öğelerinde IE7 / 8 ile çalışmaz. SPAN öğelerini kullanmanız gerekir.
Matt Brock

@feeela - Her zaman zumun önüne * koyarım *display: inline; *zoom: 1;. Bu özel durum için test etmedim, ama her zaman geçmişte hasLayout kesmek sadece IE7 veya IE7 modunda IE8 (veya garip IE8!) İçin gerekli olduğunu bulduk.
robocat

@robocat Evet inline-block, IE 7'de etkinleştirilmesi gerçekten de bir çözüm .
feeela

@feela - yorumunuz benim için bir anlam ifade etmiyor!
robocat

4
Lütfen satır içi blok çözümünüzün neden işe yaradığını açıklayın.
HelloWorldNoMore

220

display: inline-block öğenize fazladan bir kenar boşluğu ekler.

Bunu tavsiye ederim:

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

Bonus: Artık bu yeniyi #elementekleyerek kolayca ortalayabilirsiniz margin: 0 auto.


14
+1 - Bu, modern tarayıcılar için öğenin ortalanmasına izin veren en iyi ve en temiz çözümdür. position: absolute<IE8 için koşullu bir yorum gereklidir.
uınbɐɥs

21
Belirtmek display: inline-blockherhangi bir kenar boşluğu eklemez. Ancak CSS, satır içi öğeler arasında gösterilecek boşlukları işler.
feeela

Lütfen ekran çözümünüzün neden çalıştığını açıklayın: tablo.
HelloWorldNoMore

2
satır içi blok, öğeyi üst öğesinde konumlandırmayı imkansız hale getirir (örneğin, metin hizalaması: merkez sola yapışmasını sağlayamazsınız) ekran: tablo mükemmel :)
FlorianB

1
Eğer varsa gitmek için yolposition: absolute
m4heshd


86

Benim için işe yarayan:

display: table;

içinde div. ( Firefox ve Google Chrome'da test edilmiştir ).


4
Evet, özellikle kenar boşluğu ile merkezlemeniz gerekiyorsa: otomatik. Bu durumda satır içi blok çözüm değildir.
Zsolt Szatmari

1
Ayrıca, dolgu öğesinin bu öğenin içinde çalışmasını istiyorsanız, border-collapse: separate;stil ayarlamanız gerektiğini unutmayın . Birçok tarayıcıda varsayılan olarak bulunur, ancak bootstrap gibi css çerçeveleri sıfırlanır collapse.
Ruslan Stelmachenko

2009 yılında yapılan bir Windows Mobile 6.5 telefonunda MSIE 6 üzerinde test edilmiştir: tam genişlikte bir div'a (bir telefonda sorun olması muhtemel değildir) dikkatlice düşer. Herkes bir masaüstünde Internet Explorer'ın 8'den az bir sürümünü kullanıyorsa, desteklenmeyen bir işletim sistemi kullanıyorlar (IE6 XP ile geldi, IE7 Vista ile geldi); Onları, bu makinede İnternet'in güvenli kullanımını sürdürmek istiyorlarsa GNU / Linux'a yükseltmelerini söyleyen bir sayfaya yönlendirirdim.
Silas S. Brown

85

Daha iyi iki çözüm var

  1. display: inline-block;

    VEYA

  2. display: table;

Bu ikisinden display:table;daha iyidir, çünkü display: inline-block;ekstra bir marj ekler.

İçin display:inline-block;ekstra boşluk düzeltmek için negatif marj yöntemi kullanabilirsiniz


2
Neden display:tabledaha iyi olduğunu açıklar mısın?
Nathaniel Ford

1
Display: inline-block için ekstra boşluğu düzeltmek için negatif kenar boşluğu yöntemini kullanmanız gerekir.
Shuvo Habib

8
@NathanielFord, display:tableöğeyi Blok biçimlendirme bağlamında bırakır, böylece konumunu her zamanki gibi kenar boşlukları vb. İle kontrol edebilirsiniz. display:-inline-*Öte yandan, öğeyi Satır içi biçimlendirme bağlamına yerleştirerek, tarayıcının etrafında anonim blok sarmalayıcı oluşturmasına neden olur, devralınan yazı tipi / satır yüksekliği ayarlarına sahip satır kutusunu içerir ve bloğu bu satır kutusuna ekler (hizalama varsayılan olarak taban çizgisine göre dikey). Bu daha fazla “büyü” ve dolayısıyla potansiyel sürprizleri içerir.
Ilya Streltsyn


43

Bunun hangi bağlamda görüneceğini bilmiyorum, ama CSS tarzı özelliğin floatya leftda rightbu etkiye sahip olacağına inanıyorum . Öte yandan, metnin etrafında yüzmesine izin vermek gibi başka yan etkileri de olacaktır.

Eğer yanlışsam lütfen beni düzeltin,% 100 emin değilim ve şu anda kendim test edemiyorum.


1
Evet, CSS 2.1'de. (CSS2.0 şamandırayı tam genişlikte yapar, ancak yalnızca IE5 / Mac bunu yapar). Tablolar ve şamandıralar, içeriklerine sığacak şekilde daralan tek ekran türüdür.
bobince

41

Sorunuzun cevabı gelecekte olacak arkadaşım ...

yani "intrinsic" en son CSS3 güncellemesiyle geliyor

width: intrinsic;

ne yazık ki IE onunla arkasında, bu yüzden henüz desteklemiyor

Daha fazlası için: CSS İçsel ve Dışsal Boyutlandırma Modülü Seviye 3 ve Kullanabilir miyim? : İçsel ve Dışsal Boyutlandırma .

Şimdilik sen memnun lazım <span>veya <div>ayarlı

display: inline-block;

12
intrinsicdeğer olarak standart değildir. Aslında öyle width: max-content. Bu veya zaten bağlı taslaktaki MDN sayfasına bakın .
maryisdead

34

CSS2 uyumlu bir çözüm aşağıdakileri kullanmaktır:

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

Div'inizi mümkün olduğunca küçük tutacak şekilde yüzebilirsiniz, ancak div'inizdeki herhangi bir şey yüzüyorsa bir düzeltme kullanmanız gerekir :

.my-div
{
    float: left;
}

3
Olması gerekiyor. Hangi dokümanı kullanıyorsunuz?
Soviut

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

benim için iyi çalışıyor :)


Ama sonra benim durumum OP gibi bir tablo değil, bir div içindeki metindi.
Rui Marques

jquery ui kaydırıcısı için bu greate çünkü u içerik öğesinin genişliğini ayarlamanıza gerek yok
CoffeJunky

26

Tamam, çoğu durumda varsayılan olarak div'ın olduğu gibi heightve widthotomatik olarak da bir şey yapmanıza gerek yoktur , ancak sizin durumunuz değilse, inline-blockekran uygulamak sizin için çalışacaktır ... sizin için oluşturduğum koda bakın ve neye bakıyorsun:

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

Bunu display: inline;(veya white-space: nowrap;) kullanarak kolayca yapabilirsiniz .

Umarım bunu faydalı bulursun.


18

inline-block@ User473598 olarak kullanabilirsiniz , ancak eski tarayıcılara dikkat edin.

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

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

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

Mozilla hiç inline-block desteklemez, ancak sahip oldukları -moz-inline-stackyaklaşık olarak aynı olan

inline-blockDisplay özelliği ile ilgili bazı çapraz tarayıcılar : https://css-tricks.com/snippets/css/cross-browser-inline-block/

Bu özelliğe sahip bazı testleri şu adreste görebilirsiniz: https://robertnyman.com/2010/02/24/css-display-inline-block-why-it-rocks-and-why-it-sucks/


1
Neden bahsediyorsun? Mozilla Firefox inline-block3.0'dan (2008) beri desteklenmektedir . Kaynak: developer.mozilla.org/tr-TR/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>

İnsanların bazen tabloları sevmediğini biliyorum, ama size söylemeliyim, css inline hack'leri denedim ve bazı div'lerde çalıştılar, ancak diğerlerinde yoktu, bu yüzden genişleyen div'i içine almak gerçekten daha kolaydı bir tablo ... ve ... satır içi özelliğe sahip olabilir veya olmayabilir ve yine de tablo, içeriğin toplam genişliğini tutacak olan tablodur. =)


2
Bu "uygun" bir yol değil, ama işler biraz karmaşıklaştığında IE6 / 7/8 genellikle sadece güzel oynamıyor, bu yüzden neden bu şekilde yapacağınızı tamamen anlıyorum. Sen benim oyumu aldın.
Mart'ta Craigo

Bunu yapardım, ancak her bir giriş kutusunu çevrelemeliyim, bu yüzden fazladan html.
NickSoft

15

Çalışan bir demo burada-

.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 flexbox çözümüm iki çeşittir: Üstteki bir açıklık gibi davranır ve alttaki bir div gibi davranır ve tüm genişliği bir sargı yardımıyla alır. Sınıfları sırasıyla "üst", "alt" ve "alt sarıcı" dır.

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.


için kudos display: inline-flex;. BTW, Chrome 62, firefox 57 ve safari 11 için önek olmadan çalışır
Horacio

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

Bu, üst div genişliğini en büyük öğe genişliğiyle aynı hale getirir.


Bunu yatay boyutu küçültmek ve büyük tutmak için yalnızca dikey boyut için uygulayabileceğim bir yol var mı?
Gobliins

12

Deneyin display: inline-block;. Çapraz tarayıcı uyumlu olması için lütfen aşağıdaki css kodunu kullanın.

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 ile uğraşmak Ben -moz-fit-contentOP tam olarak ne istediğini yapar ve aşağıdaki gibi kullanılabilir özellik değeri bulundu :

width: -moz-fit-content;

Yalnızca Firefox'ta çalışmasına rağmen, Chrome gibi diğer tarayıcılar için herhangi bir eşdeğer bulamadım.


Ocak 2017 itibariyle IE (tüm sürümler, Edge ve mobil dahil) ve Opera Mini'nin desteği yoktur fit-content. Firefox yalnızca genişliği desteklemektedir. Diğer tarayıcılar bunu iyi destekliyor.
Gavin

11

Bu kodu deneyebilirsiniz. CSS bölümündeki kodu izleyin.

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

Etiketin içine display: inline-blockbir spanetiket ekleyerek divve CSS biçimlendirmesini dış divetiketten yeni iç spanetikete taşıyarak benzer bir sorunu ( öğe ortalandığı için kullanmak istemedim ) çözdüm. display: inline blockSize uygun bir cevap değilse , bunu başka bir alternatif fikir olarak dışarı atmak .


7

Öğede iki yoldan herhangi birini kullanabiliriz div:

display: table;

veya,

display: inline-block; 

Kullanmayı tercih ederim display: table;, çünkü tüm ekstra boşlukları kendi başına işler. Iken display: inline-blockbazı ekstra yer sabitleme gerekir.


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

Div satır içi (veya satır içi blok) öğeler içeriyorsa ve div öğesinden farklı yazı tipi boyutuna ve satır yüksekliğine sahipse bu çalışmaz.
quotesBro

5

Çizgileri kesen konteynerleriniz varsa, iyi bir CSS çözümü aramak ve hiçbirini bulmaktan saatler sonra, şimdi jQuery kullanıyorum:

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


Bu, Chrome'da snippet'te görünür bir şekilde kırıldı; düzelt düğmesine ikinci kez tıklanması, ilk tıklatmak için farklı sonuçlar üretir.
Mark Amery

Mac'te @MarkAmery Sadece chrome, safari ve firefox'ta denedim ve hepsi iyi: görünür hata yok, konsolda hiçbir şey, tutarlı davranış. belki pencereli bir şey ...
cregox

5

Gözden geçirilmiş (birden fazla çocuğunuz varsa çalışır): jQuery kullanabilirsiniz (JSFiddle bağlantısına bakın)

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


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

JQuery eklemeyi unutmayın ...

JSfiddle'ı burada görün


Div'inizde birden çok çocuk varsa bu durum bozulur; div genişliğini ilk çocuğun genişliğine ayarlar .
Mark Amery

@MarkAmery Her şeyden önce, olumsuz oy vermeden önce lütfen soruyu dikkatlice okuyun, bir çocuk istediler. Birden fazla çocukla nasıl yapılabileceğini gerçekten merak ediyorsanız, düzeltilmiş cevaba bakın.
Bondsmith

4

Denedim div.classname{display:table-cell;}ve işe yaradı!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.