Как увеличить ширину div в соответствии с текстом внутри него?
У меня есть div, в котором пользователь вводит текст. Но я хочу увеличить его ширину в соответствии с текстом до 50% экрана. Мой код CSS:
.messages {
max-width:50%;
min-width:150px;
background: #ffeec0;
padding:2px;
margin:3px;
-webkit-border-radius: 2px;
border-radius: 2px;
border:1px solid #ffdd7c;
}
Результат: ![enter image description here]()
После сообщения "555" много места, я хочу этот размер только в том случае, если пользователь вводит некоторый текст:
![enter image description here]()
Итак, как увеличить динамическую ширину div в зависимости от размера текста?
Ответы
Ответ 1
Есть много способов добиться этого, но ИМХО - самое чистое.
Ваша проблема в том, что ящики являются "жадными" и будут пытаться расширить доступную ширину.
Чтобы предотвратить это, вы можете:
- Сделайте это "float: left;"
- Но также "clear: left;" чтобы дополнительные "левые плавающие элементы" не использовали свободное пространство справа.
CSS становится:
.messages {
max-width:50%;
min-width:150px;
background: #ffeec0;
padding:2px;
margin:3px;
border-radius: 2px;
border:1px solid #ffdd7c;
float: left;
clear: left;
}
Я предоставил полный код и дополнительное объяснение (на mouseover) на Liveweave здесь: http://liveweave.com/DFCZFj
![LiveWeave screenshot]()
Ответ 2
Попробуйте изменить тип display
div на table
.
Пример здесь
.messages {
display: table;
max-width: 50%;
min-width: 150px;
/* other declarations omitted due to brevity */
}
Ответ 3
Просто добавьте display:inline;
. Вы также можете удалить свойство min width, иначе, если текст будет меньше, у вас все еще будет этот пробел.
Ответ 4
Элементы блока (div
тип отображения по умолчанию) попытается выполнить максимальное горизонтальное пространство контейнера. Представьте себе неявный width:100%
всякий раз, когда вы их видите. inline-block
создаст элементы уровня блока, в которых следующий элемент попытается отобразить горизонтально смежные (при условии, что будет достаточно места). Это то, что вы хотите использовать (display: table
будет работать и в этом решении, но у него есть свои особенности. Я избегаю их.
Итак, ваше решение требует трех частей:
Сначала вам нужно указать, что строки будут не больше 50% доступной области. Вы сделаете это с внешним фреймом:
.frame {
max-width:50%;
}
Затем самим сообщениям должно предоставляться пространство в целом по каждой строке. Таким образом, мы будем использовать тег div
, который не был декодирован вокруг каждого сообщения.
Наконец, вы будете использовать display: inline-block
для ваших внутренних messages
элементов. Поскольку они являются единственным дочерним элементом их родительского тега, вам не придется беспокоиться об элементах, обматывающих друг друга. Используя встроенный блок, ширина соблюдается, и это дает нам отличное место для применения цвета фона.
.messages {
display: inline-block;
min-width: 150px;
background: #ffeec0;
padding:2px;
margin:3px;
-webkit-border-radius: 2px;
border-radius: 2px;
border:1px solid #ffdd7c;
}
В качестве ссылки можно ожидать, что ваша разметка будет выглядеть следующим образом:
<div class="frame">
<div><div class="messages">2014</div></div>
<div><div class="messages">2014</div></div>
<div><div class="messages">
2014-09-20 17:46:41 minhavidaemquotes:555
</div></div>
<div><div class="messages">
2014-09-20 17:46:41 minhavidaemquotes:555 this is some extra
text
</div></div>
</div>
Я думаю, вы обнаружите, что это дает вам предполагаемый эффект. Кстати, это общее решение, но если вы выберете min-width
, который больше, чем 50%
, вы убедитесь, что два родных брата типа inline-block
будут слишком широкими для строки. Если вы сделаете это, вы можете отказаться от дополнительного div
в разметке.