У меня макет, похожий на:
<div>
<table>
</table>
</div>
Я бы хотел, чтобы div
расширялся только до такой ширины, какой становится мой table
.
У меня макет, похожий на:
<div>
<table>
</table>
</div>
Я бы хотел, чтобы div
расширялся только до такой ширины, какой становится мой table
.
просто установите ширину и высоту в соответствии с содержимым. это очень просто.
div {
width: fit-content;
height: fit-content;
padding: 10px;
}
Я добавляю padding: 10px;. если его оставить, элемент div полностью прилипнет к таблице и будет выглядеть немного неуклюже. Заполнение создаст заданное пространство между границей элемента и его содержимым. Но это ваше желание не обязательно.
За исключением части adding: 10px;
, это тот же ответ, который был опубликован 27 мая 2013, в 00:41.
.outer{
width:fit-content;
display: flex;
align-items: center;
}
.outer .content{
width: 100%;
}
<div class=outer>
<div class=content>
Add your content here
</div>
</div>
div{
width:fit-content;
}
<div>
<table>
</table>
</div>
Для работы в Firefox должно быть width: -moz-fit-content;
.
Попробуйте использовать свойство width: max-content
, чтобы настроить ширину блока div по размеру его содержимого.
Попробуйте этот пример,
<!DOCTYPE html>
<html>
<head>
<style>
div.ex1 {
width:500px;
margin: auto;
border: 3px solid #73AD21;
}
div.ex2 {
width: max-content;
margin: auto;
border: 3px solid #73AD21;
}
</style>
</head>
<body>
<div class="ex1">This div element has width 500px;</div>
<br>
<div class="ex2">Width by content size</div>
</body>
</html>
Вы можете использовать height: 100%
и ширину по вашему выбору. Это делает div не больше, чем его содержимое.
если вы установите высоту 100%, это будет 100% от общего размера окна
Вы можете попробовать этот код. Следуйте коду в разделе 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>
У меня есть span
внутри div
и просто установка margin: auto
в контейнер div
сработала для меня.
Любая подсказка, почему это работает?
Что, если мы определим глобальную переменную и используем ее для обоих.
:root {
--table-width: 400px;
}
.container{
width:var(--table-width);
border: 1px solid black; // easy visualization
}
.inner-table {
width:var(--table-width);
border: 1px solid red; // easy visualization
}
<div class="container">
<table class="inner-table">
<tr>
<td>abc</td>
</tr>
</table>
</div>
Вы можете использовать display: flex
для родительского элемента
#parentElement {
display: flex;
flex-direction: column;
align-items: flex-start;
}
Об этом упоминалось в комментариях, и его трудно найти в одном из ответов, поэтому:
Если вы используете display: flex
по какой-либо причине, вы можете вместо этого использовать:
div {
display: inline-flex;
}
Обратите внимание, что это не сработает, если ваш элемент div
находится в контейнере, который является одновременно display: flex
и flex-flow: column
. Это связано с тем, что значение по умолчанию для align-items
- stretch
. В этой ситуации вы должны установить для align-items
значение, отличное от stretch
, чтобы это решение работало.
Просто добавьте стиль в свой файл CSS
div {
width: fit-content;
}
Я не думаю, что это кроссбраузерный вариант.
В настоящее время не работает в Edge: caniuse.com/#search=fit-content
Вы можете использовать -moz-fit-content
для FF, по-видимому, префиксы других поставщиков разрешат свои собственные ...
Это то же самое, что и ответ Виталия Федоренко.
Попробуйте 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>
Хорошо, во многих случаях вам даже не нужно ничего делать, поскольку по умолчанию 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>
<div class="parentDiv" style="display:inline-block">
// HTML elements
</div>
Это сделает ширину родительского блока такой же, как и ширина самого большого элемента.
Есть ли способ применить это только для вертикального размера, чтобы минимизировать и сохранить горизонтальный размер большим?
div{
width:auto;
height:auto;
}
Это не сработает, если div содержит встроенные (или встроенные-блочные) элементы, и у них другой размер шрифта и высота строки, чем у самого div.
Я бы просто установил padding: -whateverYouWantpx;
Добро пожаловать в Stack Overflow! Пожалуйста, добавьте некоторое объяснение того, почему этот код помогает ОП. Это поможет дать ответ, из которого будущие зрители смогут извлечь уроки. См. Как ответить для получения дополнительной информации.
Это уменьшит размер коробки, чтобы он мог сделать коробку «не больше, чем ее содержимое».
Разве отрицательное заполнение не является недопустимым CSS?
Отнюдь не. На самом деле я использовал его много раз, и это совершенно законно.
Вы можете использовать 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- отстой /
О чем ты говоришь? Mozilla Firefox поддерживает inline-block
с версии 3.0 (2008). Источник: developer.mozilla.org/en-US/docs/Web/CSS/…
Мы можем использовать любой из двух способов в элементе div
:
display: table;
или,
display: inline-block;
Я предпочитаю использовать display: table;
, потому что он обрабатывает все лишние пробелы самостоятельно. В то время как display: inline-block
требует исправления дополнительного места.
Мое решение flexbox для CSS3 в двух вариантах: верхний ведет себя как 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.
Престижность для display: inline-flex;
. Кстати, это работает без префикса для Chrome 62, firefox 57 и safari 11
Есть два решения лучше
display: inline-block;
ИЛИ
display: table;
Из этих двух display:table;
лучше, , потому что display: inline-block;
добавляет дополнительный запас.
Для display:inline-block;
вы можете использовать метод отрицательного поля, чтобы исправить лишнее пространство
Не могли бы вы объяснить, почему display:table
лучше?
Для display: inline-block вы должны использовать метод отрицательного поля, чтобы исправить дополнительный интервал.
@NathanielFord, display:table
оставляет элемент в контексте форматирования блока, поэтому вы можете управлять его положением с полями и т. Д. Как обычно. display:-inline-*
, с другой стороны, помещает элемент во встроенный контекст форматирования, в результате чего браузер создает вокруг него анонимную оболочку блока, содержащую строчный блок с унаследованными настройками шрифта / высоты строки, и вставляет блок в эту строку. box (по умолчанию выравнивание по вертикали по базовой линии). Это связано с большим количеством «магии» и, следовательно, с потенциальными сюрпризами.
Рабочая демонстрация здесь-
.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>
Если у вас есть контейнеры, разрывающие строки, после долгих поисков хорошего 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 на моем Mac. Я только что попробовал его на Chrome, Safari и Firefox, и все в порядке: никаких видимых ошибок, ничего на консоли, стабильное поведение. может что-то с окнами...
Лично я просто делаю это:
HTML-код:
<div>
<table>
</table>
</div>
CSS-код:
div {
display: inline;
}
Если вы примените float к своему элементу div, это тоже сработает, но, очевидно, вам нужно применить CSS-правила «очистить оба» к следующему элементу HTML.
Вы можете сделать это просто, используя display: inline;
(или white-space: nowrap;
).
Надеюсь, вы найдете это полезным.
Исправлено (работает, если у вас несколько детей): Вы можете использовать jQuery (см. ссылку JSFiddle)
var d= $('div');
var w;
d.children().each(function(){
w = w + $(this).outerWidth();
d.css('width', w + 'px')
});
Не забудьте включить jQuery...
Это не работает, если ваш div имеет несколько дочерних элементов; он просто устанавливает ширину div равной ширине первого дочернего элемента.
@MarkAmery Прежде всего, прежде чем проголосовать против, пожалуйста, внимательно прочитайте вопрос, они попросили одного ребенка. Если вам действительно интересно, как это можно сделать с несколькими детьми, посмотрите пересмотренный ответ.
Ответ на ваш вопрос лежит в будущем, мой друг ...
, а именно "внутренний", идет с последним обновлением CSS3
width: intrinsic;
к сожалению IE отстает от него, поэтому он еще не поддерживает его
Подробнее об этом: Модуль определения внутренних и внешних размеров CSS, уровень 3 и Могу ли я использовать?
А пока вы должны довольствоваться <span>
или <div>
, установленным на
display: inline-block;
intrinsic
как значение нестандартное. На самом деле это width: max-content
. См. страницу MDN на этом или уже связанном черновике.
Вы можете попробовать fit-content
(CSS3):
div {
width: fit-content;
/* To adjust the height as well */
height: fit-content;
}
@BartlomiejSkwira Любая замена, работающая в IE или Eclipse? другое решение, как встроенный блок, не работает для меня .. \
В этом слишком много смысла, конечно, без поддержки.
fit-content
, похоже, мне не подходит, но его кузены max-content
и min-content
работают нормально.
Плохая поддержка браузерами для этого, гораздо лучше избегать и использовать более традиционный подход inline-block
, если вам нужна надежность во всех браузерах.
Для меня «ширина: -moz-fit-content; width: fit-content;» работал. В противном случае в Firefox не работало (в ноябре 2020 г.).
Я решил аналогичную проблему (где я не хотел использовать display: inline-block
, потому что элемент был центрирован), добавив тег span
внутри тега div
и переместив форматирование CSS из внешнего div
в новый внутренний тег span
. Просто предложите это как еще одну альтернативную идею, если display: inline block
вам не подходит.
Поправляясь с Firebug, я обнаружил значение свойства -moz-fit-content
, которое в точности выполняет то, что хотел OP, и его можно использовать следующим образом:
width: -moz-fit-content;
Хотя он работает только в Firefox, я не нашел эквивалента для других браузеров, таких как Chrome.
По состоянию на январь 2017 года IE (все версии, включая Edge и мобильные устройства) и Opera Mini не поддерживают fit-content
. Firefox поддерживает только ширину. Другие браузеры хорошо это поддерживают.
display: inline-block
добавляет дополнительный запас к вашему элементу.
Я бы порекомендовал это:
#element {
display: table; /* IE8+ and all other modern browsers */
}
Бонус: Теперь вы также можете легко центрировать этот модный новый #element
, просто добавив margin: 0 auto
.
+1 - это лучшее и наиболее чистое решение для современных браузеров, которое также позволяет центрировать элемент. Условный комментарий с position: absolute
необходим для <IE8.
При указании display: inline-block
поля не добавляются. Но CSS обрабатывает пробелы, которые должны отображаться между встроенными элементами.
Пожалуйста, объясните, почему ваше решение display: table работает.
inline-block делает невозможным позиционирование элемента в его родительском элементе (например, если есть text-align: center, вы не можете заставить его придерживаться влево) display: table идеально :)
Это лучший вариант, если у вас есть position: absolute
Кажется, это работает во всех браузерах. Примером является реальная реклама, которую я использую в Интернете и в информационном бюллетене. Просто измените содержимое 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>
шрифт полностью устарел. вероятно, отображается как <span> на любом текущем движке.
@zanlok Он говорит о информационном бюллетене, <font>
все еще кажется честной игрой в мире электронной почты, несмотря на его устаревание (2-й ответ): coderhelper.com/questions/8012799/…
Мне подходит:
display: table;
в div
. (Проверено на Firefox и Google Chrome ).
Да, особенно если вам нужно центрировать с маржей: авто. В этом случае встроенный блок не является решением.
Также обратите внимание, что если вы хотите, чтобы внутри этого элемента работали отступы, вы должны установить стиль border-collapse: separate;
. Это значение по умолчанию во многих браузерах, но часто в CSS-фреймворках, таких как bootstrap, оно сбрасывается на collapse
.
Протестировано на MSIE 6 на телефоне под управлением Windows Mobile 6.5, выпущенном в 2009 году: он плавно превращается в полноразмерный div (что вряд ли будет проблемой для телефона). Если кто-то использует на настольном компьютере версию Internet Explorer ниже 8, значит, он использует неподдерживаемую операционную систему (IE6 поставляется с XP, IE7 поставляется с Vista); Я бы перенаправил их на страницу, предлагающую им перейти на GNU / Linux, если они хотят продолжать безопасное использование Интернета на этой машине.
У меня тоже работает, спасибо!
width:1px;
white-space: nowrap;
у меня отлично работает :)
Но опять же, мой случай был текстом внутри div, а не таблицей, подобной OP.
для слайдера ui jquery это здорово, потому что вам не нужно устанавливать ширину элемента содержимого
width: auto; white-space: nowrap;
сделал для меня вещь.
<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 в таблице ... и ... он может иметь или не иметь встроенное свойство, и все же таблица - это та, которая будет содержать общую ширину содержимого. =)
Это не «правильный» способ, но IE6 / 7/8 часто просто не работает хорошо, когда все становится немного сложнее, поэтому я полностью понимаю, почему вы бы сделали это таким образом. Вы получили мой голос за.
Я бы сделал это, но я должен окружить каждое поле ввода, так что это много лишнего html.
Решение - установить для div
значение display: inline-block
.
@ leif81 Вы можете использовать span
, или div
, или ul
или что-то еще, важная часть - для контейнера, минимальная ширина которого должна быть минимальной, имеет свойство CSS display: inline-block
если кто-то задается вопросом: затем можно центрировать родительский элемент таблицы, установив "text-align: center" для его родительского элемента и "text-align: left" для него (например, <body style = "text-align: center"> < span style = "text-align: left; display: inline-block;"> <table> ... </table> </span> </body>)
У меня он не работает на chrome с span, но работает с white-space: nowrap;
Обратите внимание, что после установки свойства display: inline-block
margin: 0 auto;
не будет работать должным образом. В этом случае, если родительский контейнер имеет text-align: center;
, тогда элемент inline-block
будет центрирован по горизонтали.
display: -moz-inline-stack;
display: inline-block;
zoom: 1;
*display: inline;
Foo Hack - кроссбраузерная поддержка встроенного блочного стиля (2007-11-19).
Любой, у кого есть эта проблема, должен добавить все эти стили. Firefox добавил поля, когда не используется -moz-inline-stack
Я думаю, используя
display: inline-block;
будет работать, однако я не уверен насчет совместимости браузера.
Другое решение - обернуть ваш div
в другой div
(если вы хотите сохранить поведение блока):
HTML:
<div>
<div class="yourdiv">
content
</div>
</div>
CSS:
.yourdiv
{
display: inline;
}
Чтобы ответить на вопрос совместимости браузера: это не будет работать с IE7 / 8 на элементах DIV. Вы должны использовать элементы SPAN.
@feeela - я всегда ставлю * перед зумом, например. *display: inline; *zoom: 1;
. Я не тестировал эту конкретную ситуацию, но в прошлом я всегда обнаруживал, что взлом hasLayout требуется только для IE7 или IE8 в режиме IE7 (или IE8 в причудливых вариантах!).
@robocat Да, включение inline-block
в IE 7 - это действительно обходной путь.
@feela - ваш комментарий не имеет смысла для меня! Я предлагал поставить * перед зумом, т. е. * масштабирование: 1;
Пожалуйста, объясните, почему работает ваше решение inline-block.
Вам нужен блочный элемент, который имеет то, что CSS называет шириной сжатия по размеру, а спецификация не предоставляет благословенного способа получить такое. В CSS2 сжатие по размеру не является целью, а является средством решения ситуации, когда браузеру «приходится» получать ширину из воздуха. Вот эти ситуации:
, если ширина не указана. Я слышал, что они думают добавить то, что вы хотите, в CSS3. А пока обойдемся одним из вышеперечисленных.
Решение не раскрывать эту функцию напрямую может показаться странным, но на то есть веская причина. Это дорого. Сжатие по размеру означает форматирование как минимум дважды: вы не можете начать форматирование элемента, пока не узнаете его ширину, и вы не можете рассчитать ширину без прохождения всего содержимого. Кроме того, не так часто требуется усадочный элемент, как можно было бы подумать. Зачем вам нужен дополнительный div вокруг вашего стола? Может быть, заголовок таблицы - это все, что вам нужно.
Я бы сказал, что inline-block
как раз предназначен для этого и отлично решает проблему.
Используйте решение, совместимое с CSS2:
.my-div
{
min-width: 100px;
}
Вы также можете разместить свой div с плавающей точкой, что сделает его как можно меньше, но вам нужно будет использовать clearfix, если что-то внутри вашего div плавающее:
.my-div
{
float: left;
}
Должно. Какой тип документа вы используете?
Не знаю, в каком контексте это появится, но я считаю, что свойство стиля CSS float
либо left
, либо right
будет иметь такой эффект. С другой стороны, у него будут и другие побочные эффекты, например, возможность плавания текста вокруг него.
Пожалуйста, поправьте меня, если я ошибаюсь, я не уверен на 100% и в настоящее время не могу проверить это сам.
Да, в CSS 2.1. (CSS2.0 сделает плавающее на всю ширину, но на самом деле это делает только IE5 / Mac). Таблицы и плавающие объекты - единственные типы отображения, которые могут сжиматься, чтобы соответствовать их содержимому.
эффект называется «термоусадочная упаковка», и, как уже было сказано, есть несколько способов сделать это (float, inline, min / max-width), у каждого из которых есть побочные эффекты на выбор.
Ни один из приведенных ниже ответов не помог мне, кроме:
display: table
-OR-height: fit-content
!!!