





Не знаю, в каком контексте это появится, но я считаю, что свойство стиля CSS float, либо left, либо right, будет иметь такой эффект. С другой стороны, у него будут и другие побочные эффекты, например, возможность плавания текста вокруг него.
Пожалуйста, поправьте меня, если я ошибаюсь, я не уверен на 100% и в настоящее время не могу проверить это сам.
Да, в CSS 2.1. (CSS2.0 сделает плавающее на всю ширину, но на самом деле это делает только IE5 / Mac). Таблицы и плавающие объекты - единственные типы отображения, которые могут сжиматься, чтобы соответствовать их содержимому.
Решение, совместимое с CSS2, заключается в использовании:
.my-div
{
min-width: 100px;
}
Вы также можете перемещать свой div, чтобы он был как можно меньше, но вам нужно будет использовать clearfix, если что-то внутри вашего div плавает:
.my-div
{
float: left;
}
Должно. Какой тип документа вы используете?
Вам нужен блочный элемент, у которого есть то, что CSS называет шириной shrink-to-fit, а спецификация не предоставляет благословенного способа получить такое. В CSS2 сжатие по размеру не является целью, а является средством решения ситуации, когда браузеру «приходится» получать ширину из воздуха. Вот эти ситуации:
когда ширина не указана. Я слышал, что они думают добавить то, что вы хотите, в CSS3. А пока обойдемся одним из вышеперечисленных.
Решение не раскрывать эту функцию напрямую может показаться странным, но на то есть веская причина. Это дорого. Сжатие по размеру означает форматирование как минимум дважды: вы не можете начать форматирование элемента, пока не узнаете его ширину, и вы не можете вычислить ширину без прохождения всего содержимого. Кроме того, не так часто требуется усадочный элемент, как можно было бы подумать. Зачем вам нужен дополнительный div вокруг вашего стола? Возможно, вам понадобится только заголовок таблицы.
Я бы сказал, что inline-block как раз предназначен для этого и отлично решает проблему.
Я думаю, используя
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.
display: -moz-inline-stack;
display: inline-block;
zoom: 1;
*display: inline;
Foo Hack - кроссбраузерная поддержка стилей встраиваемых блоков (19 ноября 2007 г.).
Любой, у кого есть эта проблема, должен добавить все эти стили. Firefox добавил поля, когда не используется -moz-inline-stack
Решение - установить 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-blockmargin: 0 auto; не будет работать должным образом. В том случае, если в родительском контейнере есть text-align: center;, то элемент inline-block будет центрирован по горизонтали.
<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.
width:1px;
white-space: nowrap;
у меня отлично работает :)
Но опять же, мой случай был текстом внутри div, а не таблицей, подобной OP.
для слайдера ui jquery это здорово, потому что вам не нужно устанавливать ширину элемента содержимого
width: auto; white-space: nowrap; сделал это за меня.
Что мне подходит:
display: table;
в div. (Проверено на Fire Fox и Гугл Хром).
Да, особенно если вам нужно центрировать с маржей: авто. В этом случае встроенный блок не является решением.
Также обратите внимание, что если вы хотите, чтобы внутри этого элемента работали отступы, вы должны установить стиль border-collapse: separate;. Он используется по умолчанию во многих браузерах, но часто в CSS-фреймворках, например, при начальной загрузке, он сбрасывает его значение на collapse.
Протестировано на MSIE 6 на телефоне под управлением Windows Mobile 6.5, выпущенном в 2009 году: он плавно превращается в полноразмерный div (что вряд ли будет проблемой для телефона). Если кто-то использует на настольном компьютере версию Internet Explorer ниже 8, значит, он использует неподдерживаемую операционную систему (IE6 поставляется с XP, IE7 поставляется с Vista); Я бы перенаправил их на страницу, предлагающую им перейти на GNU / Linux, если они хотят продолжать безопасное использование Интернета на этой машине.
Мне кажется, это нормально работает во всех браузерах. Примером является реальное объявление, которое я использую в Интернете и в информационном бюллетене. Просто измените содержимое 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-й ответ): stackoverflow.com/questions/8012799/…
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.
Поработав с Firebug, я обнаружил значение свойства -moz-fit-content, которое точно выполняет то, что хотел OP, и его можно использовать следующим образом:
width: -moz-fit-content;
Хотя он работает только в Firefox, я не нашел эквивалента для других браузеров, таких как Chrome.
По состоянию на январь 2017 года IE (все версии, включая Edge и мобильные устройства) и Opera Mini не поддерживают fit-content. Firefox поддерживает только ширину. Другие браузеры хорошо это поддерживают.
Я решил аналогичную проблему (где я не хотел использовать display: inline-block, потому что элемент был центрирован), добавив тег span внутри тега div и переместив форматирование CSS из внешнего тега div в новый внутренний тег span. Просто выбросьте это как еще одну альтернативную идею, если display: inline block вам не подходит.
Я попробовал div.classname{display:table-cell;}, и он работал!
Вы можете попробовать 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 г.).
Ответ на ваш вопрос лежит в будущем, мой друг ...
а именно "внутреннее" идет с последним обновлением CSS3
width: intrinsic;
к сожалению, IE отстает, поэтому пока не поддерживает
Подробнее об этом: Модуль внутреннего и внешнего определения размеров CSS, уровень 3 и Могу ли я использовать?: Внутренние и внешние размеры.
На данный момент вы должны быть довольны настройкой <span> или <div> на
display: inline-block;
intrinsic как величина нестандартная. На самом деле это width: max-content. См. Страница MDN на этом или уже связанный черновик.
Исправлено (работает, если у вас несколько детей): Вы можете использовать jQuery (посмотрите ссылку JSFiddle)
var d= $('div');
var w;
d.children().each(function(){
w = w + $(this).outerWidth();
d.css('width', w + 'px')
});
Не забудьте включить jQuery ...
Это не работает, если у вашего div несколько дочерних элементов; он просто устанавливает ширину div равной ширине дочернего элемента первый.
@MarkAmery Прежде всего, прежде чем вы проголосуете против, пожалуйста, внимательно прочтите вопрос, они просили одного ребенка. Если вам действительно интересно, как это можно сделать с несколькими детьми, см. Измененный ответ.
Вы можете сделать это просто с помощью display: inline; (или white-space: nowrap;).
Я надеюсь, вы найдете это полезным.
Лично я просто делаю это:
HTML код:
<div>
<table>
</table>
</div>
Код CSS:
div {
display: inline;
}
Если вы примените float к своему div, он тоже работает, но, очевидно, вам нужно применить правила CSS «очистить оба» к следующему элементу HTML.
Если у вас есть контейнеры, разрывающие строки, после нескольких часов поиска хорошего решения 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, и все в порядке: никаких видимых ошибок, ничего на консоли, последовательное поведение. может дело в окнах ...
Рабочая демонстрация здесь-
.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>Есть два лучших решения
display: inline-block;
ИЛИ ЖЕ
display: table;
Из этих двух лучше display:table;,, потому что display: inline-block; добавляет дополнительный запас.
Для display:inline-block; вы можете использовать метод отрицательного поля, чтобы исправить лишнее пространство.
Не могли бы вы объяснить, почему display:table лучше?
Для display: inline-block вы должны использовать метод отрицательного поля, чтобы исправить дополнительный интервал.
@NathanielFord, display:table оставляет элемент в контексте форматирования блока, поэтому вы можете управлять его положением с полями и т. д. Как обычно. display:-inline-*, с другой стороны, помещает элемент во встроенный контекст форматирования, в результате чего браузер создает вокруг него анонимную оболочку блока, содержащую поле строки с унаследованными настройками шрифта / высоты строки, и вставляет блок в это поле строки ( выравнивание по вертикали по базовой линии по умолчанию). Это связано с большим количеством «магии» и, следовательно, с потенциальными сюрпризами.
Просто
<div style = "display: inline;">
<table>
</table>
</div>
Мое решение 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.Престижность для display: inline-flex;. Кстати, это работает без префикса для Chrome 62, firefox 57 и safari 11
Мы можем использовать любой из двух способов для элемента div:
display: table;
или же,
display: inline-block;
Я предпочитаю использовать display: table;, потому что он самостоятельно обрабатывает все лишние пробелы. В то время как display: inline-block требует дополнительного места.
Вы можете использовать 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/
О чем ты говоришь? Mozilla Firefox поддерживает inline-block с 3.0 (2008 г.). Источник: developer.mozilla.org/en-US/docs/Web/CSS/…
Я бы просто padding: -whateverYouWantpx; поставил
Добро пожаловать в Stack Overflow! Пожалуйста, объясните, почему этот код помогает OP. Это поможет дать ответ будущим зрителям. См. Как ответить для получения дополнительной информации.
Это уменьшит размер коробки, чтобы он мог сделать ее «не больше, чем ее содержимое».
Разве отрицательное заполнение не является недопустимым CSS?
Отнюдь не. Фактически, я использовал его много раз, и это совершенно законно.
div{
width:auto;
height:auto;
}
Это не сработает, если div содержит встроенные (или встроенные-блочные) элементы, и у них другой размер шрифта и высота строки, чем у самого div.
<div class = "parentDiv" style = "display:inline-block">
// HTML elements
</div>
Это сделает ширину родительского 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>Попробуйте 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>Просто добавьте стиль в свой файл CSS
div {
width: fit-content;
}
Я не думаю, что это кроссбраузерный вариант.
В настоящее время не работает в Edge: caniuse.com/#search=fit-content
Вы можете использовать -moz-fit-content для FF, по-видимому, префиксы других поставщиков разрешат свои собственные ...
Это то же самое, что и Ответ Виталия Федоренко
Об этом упоминалось в комментариях, и его трудно найти в одном из ответов, поэтому:
Если по какой-либо причине вы используете display: flex, вы можете вместо этого использовать:
div {
display: inline-flex;
}
Это также широко поддерживается браузерами.
Обратите внимание, что это не сработает, если ваш элемент div находится в контейнере, который является одновременно display: flex и flex-flow: column. Это связано с тем, что значение по умолчанию для align-items - stretch. В этой ситуации вы должны установить для align-items значение, отличное от stretch, чтобы это решение работало.
Вы можете использовать display: flex для родительского элемента
#parentElement {
display: flex;
flex-direction: column;
align-items: flex-start;
}
Что, если мы определим глобальную переменную и будем использовать ее для обоих.
: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>У меня есть span внутри div, и просто установка margin: auto в контейнер, div у меня сработала.
Вы можете попробовать этот код. Следуйте коду в разделе 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>Вы можете использовать height: 100% и ширину по своему выбору. Это делает div не больше, чем его содержимое.
если вы установите высоту 100%, это будет 100% от общего размера окна
Попробуйте использовать свойство 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>
div{
width:fit-content;
}<div>
<table>
</table>
</div>Для работы в Firefox должен быть width: -moz-fit-content;.
эффект называется «термоусадочная упаковка», и, как уже было сказано, есть несколько способов сделать это (float, inline, min / max-width), все из которых имеют побочные эффекты на выбор.