Update
Я принес щедрость, но правильный ответ так и не был достигнут. Я реализовал решение JS, которое работает для меня, но я пока не буду отмечать ответ как правильный. Если это возможно с помощью только CSS/HTML, я все равно буду любить его видеть. Но общий консенсус в том, что в настоящее время это невозможно.
Цель
CodePen здесь, снизу снизу внизу.
У меня есть некоторый HTML-контент, который я хотел бы аннотировать с небольшим сообщением, плавающим прямо над ним, с левой стороны, вроде аннотаций <ruby>
(но не совсем). Могут быть много частей контента, каждый со своими аннотациями. Содержимое должно соответствовать нормальному потоку текста. Вот мой текущий HTML:
<div class='item' style='color: red'>
<div class='annotation'>nope</div>
<div class='content'>It a bird, </div>
</div>
<div class='item' style='color: green'>
<div class='annotation'>still no</div>
<div class='content'>it a plane, </div>
</div>
<div class='item' style='color: blue'>
<div class='annotation'>yeah!</div>
<div class='content'>it Superman! </div>
</div>
<div class='item' style='color: orange'>
<div class='annotation'>muahaha</div>
<div class='content'>Go get the Kryptonite</div>
</div>
Рабочий пример
Ниже предложение It a bird, it a plane, it Superman! Go get the Kryptonite
имеет 4 отдельные части (4 части content
), каждая из которых представлена другим цветом. Каждый кусок контента имеет свой собственный annotation
, выделенный курсивом над ним.
У меня это работает, создавая как контент, так и аннотацию float: left
и давая аннотации отрицательный margin
. Это пример 1 в CodePen.
Разбитый пример 1
Проблема возникает, когда аннотация больше, чем содержание. Ниже аннотация still no
изменилась на более длинную you may be right
. Две строки содержания продолжают следовать нормальному потоку (по желанию), но поскольку аннотации все еще выровнены до левого края их содержимого, они перекрываются.
Это пример 2 в CodePen.
Разбитый пример 2
Предлагаемое решение состояло в том, чтобы использовать таблицу с visibility:collapse
для выравнивания, что хорошо работает при предотвращении перекрытия, но это приводит к лишнему пространству после аннотаций, в тех случаях, когда аннотация начинается за левым краем содержимого.
Как это должно работать
Я хочу, чтобы аннотации соответствовали их собственному потоку, но не нарушали естественный поток содержимого. Ниже показано, как строка содержимого остается единственным непрерывным предложением, но yeah!
переходит вправо, чтобы позволить длинному you may be right
иметь всю комнату, в которой он нуждается. Тем не менее, muahaha
исправляет назад, потому что у него есть место для сидения прямо на вершине Go get the kryptonite
.
Я могу изменить как CSS, так и HTML, чтобы это произошло, но решение только для CSS было бы оптимальным. Спасибо.
.item {
margin-top: 20px;
}
.content, .annotation {
float: left;
white-space: pre;
}
.annotation {
margin-top: -25px;
font-style: italic;
}
h3 {
clear: both;
margin: 0;
padding: 20px 0;
}
td:first-child {
color: red;
}
td:nth-child(2) {
color: green
}
td:nth-child(3) {
color: blue;
}
td:nth-child(4) {
color: orange;
}
<h3>Working Example</h3>
<div class='item' style='color: red'>
<div class='annotation'>nope</div>
<div class='content'>It a bird, </div>
</div>
<div class='item' style='color: green'>
<div class='annotation'>still no</div>
<div class='content'>it a plane, </div>
</div>
<div class='item' style='color: blue'>
<div class='annotation'>yeah!</div>
<div class='content'>it Superman! </div>
</div>
<div class='item' style='color: orange'>
<div class='annotation'>muahaha</div>
<div class='content'>Go get the Kryptonite</div>
</div>
<h3>Broken Example 1 (note the overlap)</h3>
<div class='item' style='color: red'>
<div class='annotation'>nope</div>
<div class='content'>It a bird, </div>
</div>
<div class='item' style='color: green'>
<div class='annotation'>you may be right</div>
<div class='content'>it a plane, </div>
</div>
<div class='item' style='color: blue'>
<div class='annotation'>yeah!</div>
<div class='content'>it Superman! </div>
</div>
<div class='item' style='color: orange'>
<div class='annotation'>muahaha</div>
<div class='content'>Go get the Kryptonite</div>
</div>
<h3>Broken Example 2 (note the overlap)</h3>
<table>
<tr style='font-style: italic'>
<td>nope</td><td>you may be right</td><td>yeah!</td><td>muahaha</td>
</tr>
<tr style="visibility:collapse;"><td>It a bird, </td><td>it a plane, </td><td>it Superman! </td><td>Go get the kryptonite</td></tr>
</table>
<table style="margin-top:-25px;"><tr><td>It a bird, </td><td>it a plane, </td><td>it Superman!</td><td>Go get the kryptonite</td></tr></table>
<h3>How it should look (cheating with positioning)</h3>
<div class='item' style='color: red'>
<div class='annotation'>nope</div>
<div class='content'>It a bird, </div>
</div>
<div class='item' style='color: green'>
<div class='annotation'>you may be right</div>
<div class='content'>it a plane, </div>
</div>
<div class='item' style='color: blue'>
<div class='annotation' style='margin-left: 35px'>yeah!</div>
<div class='content'>it Superman! </div>
</div>
<div class='item' style='color: orange'>
<div class='annotation'>muahaha</div>
<div class='content'>Go get the Kryptonite</div>
</div>