Глядя на спецификацию CSS, вполне вероятно, что то, что я пытаюсь сделать, невозможно, хотя я считаю, что вычисления размера довольно сложно расшифровать.Вот несколько важных битов:
http://www.w3.org/TR/CSS21/visudet.html
Ширина содержимого блоков незаменяемого встроенного элемента соответствует ширине отображаемого содержимого в них
Так что, если я хочу, чтобы фон моего содержащего ящика увеличивался до ширины дочерних элементов, мне нужно убедиться, что его макет рассчитан в контексте встроенного форматирования:
http://www.w3.org/TR/CSS21/visuren.html#normal-flow
Когда встроенный блок превышает ширину линейного блока, он разделяется на несколько блоков, и эти блоки распределяются по нескольким линейным полям.Если встроенный блок не может быть разделен (например, если встроенный блок содержит один символ, или правила разрыва слов для конкретного языка запрещают разрыв внутри встроенного блока, или если на встроенный блок влияет значение пробела nowrap или pre), то встроенное поле переполняет поле строки.
Отлично.Надеемся, что в правила прерывания также включены возможности аварийного переноса.
http://www.w3.org/TR/2010/WD-css3-text-20101005/#word-wrap
Это свойство указывает, может ли UA прерываться внутри слова, чтобы предотвратить переполнение, если в противном случае неразрывная строка слишкомдолго вписывается в линейный ящик.
Не очень помогает;давайте посмотрим на более новую черновую спецификацию:
http://www.w3.org/TR/css3-text/#overflow-wrap
Возможности разрыва, не являющиеся частью 'overflow-wrap: normal', разрыв строки не учитывается при вычислении min-contentвнутренние размеры.
Это не очень понятно, но если внутренние размеры 'min-content' имеют какое-то отношение к тем же вычислениям, которые использовались для определения возможностей разрыва строки, мне может не повезти.
В итоге я просто использовал Javascript, чтобы измерить содержимое и решить, показывать ли его в блочном или встроенном контексте.Вздох.
var messages = document.body.getElementsByClassName('mail_uncollapsed');
// Show overflowing content by setting element display to inline-block. This
// prevents break-word from being applied to the element, so we only do this
// if the element would overflow anyway.
for (var i = 0; i < messages.length; ++i) {
var message = messages[i];
message.style.display = 'block';
var isOverflowing = message.clientWidth < message.scrollWidth;
if (isOverflowing) {
message.style.display = 'inline-block';
}
}