Як я можу зробити div не більше його вмісту?


2070

У мене макет схожий на:

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

Я хотів би, щоб це divрозширилося лише настільки широке, наскільки воно tableстає моїм .


90
ефект називається "скороченням", і, як відповіли, існує кілька способів зробити це (плаваючий, вбудований, хв / макс-ширину), який має на вибір побічні ефекти
annakata

Відповіді:


2426

Рішення полягає в тому, щоб встановити divTo display: inline-block.


239
@ leif81 Ви можете використовувати spanабо, divабо, ulабо що-небудь інше, важлива частина - контейнер, який ви хотіли б мати мінімальною шириною, має властивість CSSdisplay: 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
Він не працює на хромі для мене з прольотом, але працює з пробілом: nowrap;
albanx

57
Будь ласка, зауважте, що після встановлення display: inline-blockвластивості margin: 0 auto;не працюватиме, як очікувалося. У тому випадку, якщо батьківський контейнер має, text-align: center;тоді inline-blockелемент буде горизонтально центрований.
Савас Ведова

12
inline-blockНЕ працював для мене, але inline-flexDID.
мареофт

331

Ви хочете, щоб блок-елемент мав те, що CSS називає шириною, що відповідає розміру, і специфікація не дає благословенного способу отримати таке. У CSS2 зменшення розміру - це не мета, а означає вирішити ситуацію, коли браузер "повинен" отримати ширину з повітря. Такі ситуації:

  • плавати
  • абсолютно розміщений елемент
  • вбудований блок-елемент
  • елемент таблиці

коли не вказана ширина. Я чув, що вони думають додати те, що потрібно в CSS3. Поки що зробіть з одним із перерахованих вище.

Рішення не виставляти функцію безпосередньо може здатися дивним, але є вагома причина. Це дорого. Стискання до придатності означає форматування принаймні двічі: ви не можете почати форматування елемента, поки не дізнаєтесь його ширину, і ви не зможете обчислити ширину, не проходячи весь вміст. Плюс до цього, не потрібен стискаючий елемент так часто, як може здатися. Навіщо потрібен зайвий дів навколо столу? Можливо, підписи таблиці - це все, що вам потрібно.


34
Я б сказав inline-block, що саме призначений для цього і вирішує проблему ідеально.
miahelf

6
я думаю, вони додають у css4, і це було бcontent-box, max-content, min-content, available, fit-content, auto
Мухаммед Умер

4
Нове fit-contentключове слово (не існує, коли ця відповідь була вперше написана і досі не підтримується повністю ) дозволяє явно застосувати розмір "зменшення до розміру" до елемента, усуваючи потребу в будь-якому з хаків, запропонованих тут, якщо ви пощастило лише орієнтуватися на браузери з підтримкою. +1, тим не менше; вони поки залишаються корисними!
Марк Амері

floatзробив те, що мені потрібно було зробити!
nipunasudha

228

Я думаю, використовуючи

display: inline-block;

буде працювати, однак я не впевнений у сумісності браузера.


Іншим рішенням було б обернути своє divінше div(якщо ви хочете підтримувати поведінку блоку):

HTML:

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

CSS:

.yourdiv
{
    display: inline;
}

23
Щоб відповісти на питання сумісності браузера: це не буде працювати з IE7 / 8 на елементах DIV. Ви повинні використовувати елементи SPAN.
Метт Брок

@feeela - Я завжди ставлю * перед трансфокатором , наприклад *display: inline; *zoom: 1;. Я не тестував на цю конкретну ситуацію, але в минулому завжди виявляв, що хак hasLayout потрібен лише для IE7, або IE8 в режимі IE7 (або IE8 у химерності!).
robocat

@robocat Так, це дійсно обхід, щоб inline-blockувімкнути його в IE 7.
feeela

@feela - ваш коментар для мене не має сенсу! Я пропонував також поставити * перед збільшенням, т. е. * зум: 1;
robocat

4
Поясніть, будь ласка, чому працює ваше рішення вбудованого блоку.
HelloWorldNoMore

220

display: inline-block додає додатковий запас вашому елементу.

Я рекомендую це:

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

Бонус: Тепер ви також можете легко відцентрувати це фантазійне нове #elementдодавання margin: 0 auto.


14
+1 - це найкраще і найчистіше рішення для сучасних браузерів, яке також дозволяє центрирувати елемент. Для position: absolute<IE8 необхідний умовний коментар з .
uınbɐɥs

21
Вказівка display: inline-blockне додає меж. Але CSS обробляє пробіл, який повинен бути показаний між елементами вбудованого.
гонорар

Будь ласка, поясніть, чому працює ваше рішення display: table.
HelloWorldNoMore

2
inline-block робить елемент неможливим розташувати у своєму батьківському (наприклад, якщо є вирівнювання тексту: по центру ви не можете змусити його дотримуватися ліворуч) дисплей: таблиця ідеальна :)
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
Це має занадто багато сенсу, звичайно, йому не вистачає підтримки.
Сава Б.

86

Що для мене працює:

display: table;

в div. (Тестовано на Firefox та Google Chrome ).


4
Так, особливо якщо вам потрібно центрировать з запасом: авто. Цей випадок inline-block не є рішенням.
Zsolt Szatmari

1
Також зауважте, що якщо ви хочете, щоб робота з підкладкою всередині цього елемента, ви повинні встановити border-collapse: separate;стиль. Це за замовчуванням у багатьох браузерах, але часто css фреймворки, як завантажувальний засіб, скидають його значення collapse.
Руслан Стельмаченко

Тестований на MSIE 6 на телефоні Windows Mobile 6.5, зробленому в 2009 році: він витончено знижується до повнорозмірного дзвінка (що навряд чи буде проблемою для телефону). Якщо хтось на робочому столі використовує версію Internet Explorer менше 8, він використовує непідтримувану операційну систему (IE6 поставляється з XP, IE7 поставляється з Vista); Я б переспрямовував їх на сторінку, вказуючи їм оновити до GNU / Linux, якщо вони хочуть продовжувати безпечне користування Інтернетом на цій машині.
Silas S. Brown

85

Є два кращих рішення

  1. display: inline-block;

    АБО

  2. display: table;

З цих двох display:table;краще, тому що display: inline-block;додає додатковий запас.

Для display:inline-block;вибору додаткового простору можна використовувати метод негативного запасу


2
Ви не проти пояснити, чому display:tableкраще?
Натаніел Форд

1
Для відображення: вбудований блок, для виправлення додаткового інтервалу потрібно використовувати метод негативного поля.
Шуво Хабіб

8
@NathanielFord, display:tableзалишає елемент у контексті форматування блоку, щоб ви могли керувати його положенням з полями тощо. display:-inline-*з іншого боку, вводить елемент у контекст вбудованого форматування, змушуючи браузер створити навколо нього анонімний блок обгортки, що містить рядок рядка з успадкованими налаштуваннями шрифту / висоти рядка, і вставляє блок у цей рядок (вирівнювання вона вертикально за базовою лінією за замовчуванням). Це передбачає більше "магії" і, отже, потенційних сюрпризів.
Ілля Стрельцин


43

Не знаючи , в якому контексті це буде виглядати, але я вважаю , що властивість CSS-стиль floatабо leftабо rightбуде мати такий ефект. З іншого боку, це матиме й інші побічні ефекти, наприклад, дозволяючи тексту плавати навколо нього.

Будь ласка, виправте мене, якщо я помиляюся, я не впевнений на 100%, і наразі не можу перевірити це сам.


1
Так, у CSS 2.1. (CSS2.0 зробив би поплавок на повну ширину, але тільки IE5 / Mac це робить насправді). Таблиці та поплавці - єдині типи дисплеїв, які можуть зменшуватися, щоб відповідати їх вмісту.
bobince

41

Відповідь на ваше питання в майбутньому закладе мій друг

а саме "внутрішній" йде з останнім оновленням 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, плаває:

.my-div
{
    float: left;
}

3
Це повинно. Який тип ви використовуєте?
Радянський окт

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

добре працює для мене :)


Але потім моєю справою знову став текст всередині div, а не таблиця, як ОП.
Rui Marques

для повзунка інтерфейсу jquery це дуже смачно, тому що вам не потрібно встановлювати ширину елемента вмісту
CoffeJunky

26

Гаразд, у багатьох випадках вам навіть не потрібно нічого робити, як за замовчуванням дів має, heightі widthяк авто, але якщо це не ваш випадок, застосування inline-blockдисплея буде працювати для вас ... подивіться на код, який я створюю для вас, і це робити що ти шукаєш:

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>


22

Про це згадувалося в коментарях, і важко знайти в одній з відповідей так:

Якщо ви використовуєте display: flexз будь-якої причини, замість цього можете використовувати:

div {
    display: inline-flex;
}

Це також широко підтримується в браузерах.


Це те, що мені було потрібно, коли я вже використовуюdisplay: flex;
Denny

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-blockз 3.0 (2008). Джерело: developer.mozilla.org/en-US/docs/Web/CSS/…
Chazy Chaz

18

Просто введіть стиль у свій CSS-файл

div { 
    width: fit-content; 
}

1
Я не думаю, що це варіант, який підтримується крос-браузером.
Давид Ректор

2
В даний час не працює в краї: caniuse.com/#search=fit-content
molsson

Ви можете використовувати -moz-fit-contentдля FF, імовірно, інші префікси постачальника дозволять власні ...
Benj

1
Це те саме, що відповідь Віталія Федоренка
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>

Я знаю, що люди іноді не люблять таблиці, але я вам повинен сказати, я спробував css inline hacks, і вони начебто працювали над деякими дивами, але в інших ні, так що, це було просто простіше вкласти розширювальний div у таблиця ... і ... вона може мати властивість вбудованого чи ні, і все ж таблиця є тією, яка має містити загальну ширину вмісту. =)


2
Це не "правильний" спосіб, але IE6 / 7/8 часто просто не грає добре, коли все стає трохи складніше, тому я повністю розумію, чому ви зробите це так. Ви отримали моє голосування.
Craigo

Я б це зробив, але мені потрібно оточувати кожне поле введення, тому це багато зайвих HTML.
NickSoft

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 flexbox у двох смаках: той, що зверху поводиться як проміжок, а той, що знаходиться внизу, поводиться як діва, приймаючи всю ширину за допомогою обгортки. Їх класи - відповідно "верх", "знизу" та "низ".

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;. BTW працює без префіксу для Chrome 62, firefox 57 та safari 11
Horacio

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

Це зробить батьківську ширину поділки такою ж, як і найбільша ширина елемента.


Чи є спосіб я застосувати це лише для вертикального розміру, щоб мінімізувати і зберігати горизонтальність великою?
Гоблінс

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яке саме робить те, що хотіла ОП, і може бути використане так:

width: -moz-fit-content;

Хоча він працює лише у Firefox, я не зміг знайти жодного еквівалента для інших браузерів, таких як Chrome.


Станом на січень 2017 року IE (всі версії, Edge та мобільний додаток) та Opera Mini не підтримують fit-content. Firefox підтримує лише ширину. Інші браузери це добре підтримують.
Гевін

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оскільки елемент був в центрі), додавши spanтег всередині divтегу та перемістивши формат CSS із зовнішнього divтегу до нового внутрішнього spanтегу. Просто викидаючи це там як іншу альтернативну ідею, якщо display: inline blockце не підходить для вас відповідь.


7

Ми можемо використовувати будь-який із двох способів divелемента:

display: table;

або,

display: inline-block; 

Я вважаю за краще використовувати display: table;, оскільки він обробляє всі додаткові простори самостійно. Хоча display: inline-blockпотребує додаткового закріплення місця.


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

Це не буде працювати, якщо div містить вбудовані (або вбудовані блоки) елементи та вони мають інший розмір шрифту та висоту рядка, ніж сам div.
цитатиБро

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; натиснення кнопки виправлення вдруге дає різні результати, щоб натиснути її вперше.
Марк Амері

@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 тут


Це порушено, якщо у вашому діві є кілька дітей; він просто встановлює ширину діва на ширину першої дитини.
Марк Амері

@MarkAmery Перш за все, перш ніж ви будете голосувати негативно, будь ласка, уважно прочитайте питання, вони попросили одну дитину. Якщо вам справді цікаво, як це можна зробити з кількома дітьми, дивіться переглянутий відповідь.
Бондсміт

4

Я спробував, div.classname{display:table-cell;}і це спрацювало!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.