Как сделать div не больше его содержимого?

1843

У меня есть макет, похожий на:

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

Я хотел бы, чтобы div расширялся до ширины, чем мой table.

  • 80
    эффект называется «сжатие», и, как ответили, есть несколько способов сделать это (float, inline, min / max-width), каждый из которых имеет побочные эффекты на выбор
Теги:
width

34 ответа

1995

Решение состоит в том, чтобы установить div на display: inline-block.

  • 232
    @ leif81 Вы можете использовать span div или ul или что-то еще, важная часть для контейнера, минимальная ширина которого вы хотите иметь, - это свойство CSS display: inline-block
  • 1
    Визуальное представление Visual Studio 2010 отображает это неправильно, даже если содержащиеся элементы имеют «display: block; float: left;» - все они будут показаны вертикально с шириной div, равной самому широкому элементу внутри. Но браузеры все показывают это правильно (даже IE).
Показать ещё 11 комментариев
298

Вы хотите, чтобы элемент блока имел то, что CSS называет сжатой шириной, и спецификация не обеспечивает благословенный способ получить такую ​​вещь. В CSS2 сжимаемость до соответствия не является целью, но означает иметь дело с ситуацией, когда браузеру "приходится" получать ширину из воздуха. Эти ситуации:

  • float
  • абсолютно позиционированный элемент
  • элемент встроенного блока
  • элемент таблицы

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

Решение не раскрывать эту функцию напрямую может показаться странным, но есть веская причина. Это дорого. Сокращение до места означает форматирование по крайней мере в два раза: вы не можете начать форматирование элемента до тех пор, пока не узнаете его ширину, и вы не сможете рассчитать ширину без прохождения всего содержимого. Кроме того, человеку не нужно убираться в нужное положение так часто, как можно подумать. Зачем вам нужен дополнительный div вокруг вашего стола? Возможно, подпись в таблице - это все, что вам нужно.

  • 33
    Я бы сказал, что inline-block предназначен именно для этого и прекрасно решает проблему.
  • 6
    я думаю, что они добавляют в css4, и это будет content-box, max-content, min-content, available, fit-content, auto
Показать ещё 2 комментария
196

Я думаю, используя

display: inline-block;

будет работать, однако я не уверен в совместимости с браузером.


Другим решением будет обернуть ваш div в другой div (если вы хотите поддерживать поведение блока):

HTML:

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

CSS

.yourdiv
{
    display: inline;
}
  • 23
    Чтобы ответить на вопрос совместимости браузера: это не будет работать с IE7 / 8 на элементах DIV. Вы должны использовать элементы SPAN.
  • 0
    @feeela - я всегда ставлю * перед зумом, например *display: inline; *zoom: 1; , Я не тестировал эту конкретную ситуацию, но в прошлом я всегда обнаруживал, что взлом hasLayout требуется только для IE7 или IE8 в режиме IE7 (или IE8 в причудах!).
Показать ещё 3 комментария
174

display: inline-block добавляет дополнительное поле к вашему элементу.

Я бы порекомендовал это:

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

Бонус: теперь вы также можете легко #element этот новый #element просто добавив margin: 0 auto.

  • 14
    +1 - это лучшее и самое чистое решение для современных браузеров, которое также позволяет центрировать элемент. Условный комментарий с position: absolute необходим для <IE8.
  • 19
    Задание display: inline-block не добавляет полей. Но CSS обрабатывает пробелы, которые будут показаны между встроенными элементами.
Показать ещё 3 комментария
87
display: -moz-inline-stack;
display: inline-block;
zoom: 1;
*display: inline;

Foo Hack - Поддержка Cross Browser для встроенного блочного стиля (2007-11-19).

  • 3
    Любой, имеющий эту проблему, должен добавить все эти стили. Firefox добавил поля, когда не использовал -moz-inline-stack
73

Что для меня работает:

display: table;

в div. (Протестировано в Firefox и Google Chrome).

  • 3
    Да, особенно если вам нужно центрировать с полем: auto. В этом случае inline-block не является решением.
  • 1
    Также обратите внимание, что если вы хотите, чтобы в этом элементе работали отступы, вы должны установить border-collapse: separate; стиль. Это по умолчанию во многих браузерах, но часто CSS-фреймворки, такие как начальная загрузка, сбрасывают его значение, чтобы collapse .
Показать ещё 1 комментарий
61

Вы можете попробовать fit-content (CSS3):

div {
  width: fit-content; 
  /* To adjust the height as well */ 
  height: fit-content;
}
  • 14
    Что не поддерживается в IE caniuse.com/#search=fit-content :(
  • 1
    @BartlomiejSkwira Любой заменитель работает в IE или Eclipse? другое решение, как встроенный блок не работает для меня .. \
Показать ещё 1 комментарий
56

Есть два лучших решения

  • display: inline-block;

    ИЛИ

  • display: table;

Из этих двух display:table; лучше.

Для display:inline-block; вы можете использовать метод отрицательного поля, чтобы исправить лишнее пространство

  • 1
    Не могли бы вы объяснить, почему display:table лучше?
  • 1
    Для отображения: inline-block, вы должны использовать метод отрицательного поля, чтобы исправить дополнительный интервал.
Показать ещё 1 комментарий
41

Ответ на ваш вопрос лежит в будущем, мой друг...

а именно "intrinsic" приходит с последним обновлением CSS3

width: intrinsic;

К сожалению, IE отстает от него, так что он еще не поддерживает его

Подробнее об этом: CSS Внутренний и внешний размерный модуль уровня 3 и Могу ли я использовать?: Внутренний и внешний размер.

Теперь вы должны быть удовлетворены <span> или <div>, установленными в

display: inline-block;
  • 10
    intrinsic значение не является стандартным. На самом деле это width: max-content . См. Страницу MDN на этом или уже связанном проекте.
35

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

Пожалуйста, поправьте меня, если я ошибаюсь, хотя я не уверен на 100%, и в настоящее время я не могу проверить его сам.

  • 0
    Да, в CSS 2.1. (CSS2.0 сделает float полноразмерным, но на самом деле это делает только IE5 / Mac). Таблицы и числа с плавающей запятой - единственные типы отображения, которые могут сжиматься, чтобы соответствовать их содержимому.
31
width:1px;
white-space: nowrap;

отлично работает для меня:)

  • 0
    Но с другой стороны, мой случай был текст внутри div, а не таблица, как OP.
  • 0
    для слайдера пользовательского интерфейса jquery это здорово, потому что вам не нужно устанавливать ширину элемента содержимого
29

Решение, совместимое с CSS2, должно использовать:

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

Вы также можете плавать свой div, который заставит его как можно меньше, но вам нужно будет использовать clearfix, если что-либо внутри вашего div плавает:

.my-div
{
    float: left;
}
  • 3
    Минимальная ширина не работает в Firefox 3 и IE 8.
  • 3
    Должно. Какой тип документа вы используете?
22

ОК, во многих случаях вам даже не нужно ничего делать, поскольку по умолчанию div имеет 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>
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/

17
<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, и они вроде как работали в некоторых div, но в других нет, так что было просто проще заключить расширение div в таблице... и... оно может иметь или не встроенное свойство, и все же таблица - это та, которая будет содержать полную ширину содержимого. =)

  • 2
    Это не «правильный» способ, но IE6 / 7/8 часто просто не играют хорошо, когда все немного усложняется, поэтому я полностью понимаю, почему вы так поступили. Вы получили мой голос.
  • 0
    Я бы сделал это, но я должен окружить каждое поле ввода, так что это много лишних HTML.
15

Это было упомянуто в комментариях и трудно найти в одном из ответов так:

Если по какой-либо причине вы используете display: flex, вместо этого вы можете использовать:

div {
    display: inline-flex;
}

Это также широко поддерживается в разных браузерах.

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

Просто поместите стиль в свой файл CSS

div { 
    width: fit-content; 
}
  • 1
    Я не думаю, что это кросс-браузерная опция.
  • 2
    В настоящее время не работает в Edge: caniuse.com/#search=fit-content
13

My CSS3 flexbox решение в двух вариантах: один сверху ведет себя как span, а нижний ведет себя как div, беря всю ширину с помощью обертки. Их классы - "верх", "нижний" и "нижний" соответственно.

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.
  • 0
    похвалы за display: inline-flex; , Кстати, это работает без префикса для Chrome 62, Firefox 57 и Safari 11
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>
12
<div class="parentDiv" style="display:inline-block">
    // HTML elements
</div>

Это сделает родительскую ширину div той же самой, что и наибольшая ширина элемента.

  • 0
    Есть ли способ, которым я могу применить это только для вертикального размера, чтобы минимизировать и сохранить горизонтальный большой?
10

Нанесение ущерба с помощью Firebug Я нашел значение свойства -moz-fit-content, которое точно делает то, что требуется OP и может использоваться следующим образом:

width: -moz-fit-content;

Хотя он работает только в Firefox, я не смог найти эквивалент для других браузеров, таких как Chrome.

  • 3
    -webkit-fit-content для Chrome 31+. caniuse.com/#search=fit-content
  • 0
    По состоянию на январь 2017 года IE (все версии, включая Edge и мобильные телефоны) и Opera Mini не поддерживают fit-content . Firefox поддерживает только ширину. Другие браузеры поддерживают это хорошо.
7

Я решил аналогичную проблему (где я не хотел использовать display: inline-block, потому что элемент был центрирован), добавив тег span внутри тега div и перемещая форматирование CSS из внешнего div в новый внутренний тег span. Просто выбросьте это в качестве другой альтернативной идеи, если display: inline block не подходит для вас.

6
div{
  width:auto;
  height:auto;
}
  • 0
    Это не будет работать, если div содержит встроенные (или inline-block) элементы, и они имеют разный размер шрифта и высоту строки, чем сам div.
5

Мы можем использовать любой из двух способов в элементе div:

display: table;

или,

display: inline-block; 

Я предпочитаю использовать display: table;, потому что он обрабатывает все лишние пробелы сам по себе. В то время как для display: inline-block требуется дополнительное пространство.

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>
  • 0
    Это заметно в фрагменте для меня в Chrome; повторное нажатие кнопки исправления приводит к другим результатам, если щелкнуть ее в первый раз.
  • 0
    @MarkAmery на моем Mac Я только что попробовал его на Chrome, Safari и Firefox, и все нормально: никаких видимых ошибок, ничего на консоли, непротиворечивое поведение. может это что то с windows ...
5

Исправлено (работает, если у вас несколько детей): вы можете использовать jQuery (смотрите ссылку JSFiddle)

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


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

Не забудьте включить jQuery...

См. Здесь JSfiddle

  • 0
    Это сломано, если у вашего div есть несколько детей; он просто устанавливает ширину div равной ширине первого потомка.
  • 0
    @MarkAmery Прежде всего, прежде чем вы проголосуете против, внимательно прочитайте вопрос, они попросили одного ребенка. Если вам действительно интересно, как это можно сделать с несколькими детьми, посмотрите пересмотренный ответ.
4

Я бы просто установил padding: -whateverYouWantpx;

  • 2
    Добро пожаловать в стек переполнения! Пожалуйста, добавьте некоторые объяснения того, почему этот код помогает OP. Это поможет дать ответ будущим зрителям. См. Как ответить для получения дополнительной информации.
  • 0
    Это отнимет некоторый размер коробки, чтобы он мог сделать коробку «не больше ее содержимого».
Показать ещё 2 комментария
4

Я пробовал div.classname{display:table-cell;}, и он сработает!

3

Вы можете использовать display: flex для родительского элемента

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

Просто

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

Personnaly, я просто делаю это:

Код HTML:

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

Код CSS:

div {
    display: inline;
}

Если вы применяете float в своем div, это тоже работает, но, очевидно, вам нужно применить "четкие оба правила CSS" в следующем элементе HTML.

-3

Кажется, что все работает отлично для всех браузеров. Пример - это фактическое объявление, которое я использую в Интернете и в информационном бюллетене. Просто измените содержимое div. Он будет регулировать и сокращать ширину с указанным размером прокладки.

<div style="float:left; border: 3px ridge red; background: aqua; padding:12px">
    <font color=red size=4>Need to fix a birth certificate? Learn <a href="http://www.example.com">Photoshop in a Day</a>!
    </font>
</div>
  • 2
    шрифт совершенно не рекомендуется. вероятно, отображается как <span> на любом текущем движке.
  • 2
    @zanlok Он говорит о новостной рассылке, <font> прежнему кажется честной игрой в области электронной почты, несмотря на ее устаревание (2-й ответ): stackoverflow.com/questions/8012799/…

Ещё вопросы

Сообщество Overcoder
Наверх
Меню