В длинном текстовом документе есть некоторые "специальные слова", на которые я хочу отображать примечания/аннотации слева. Каждая нота должна быть как можно ближе до уровня слова, на которое оно ссылается.
HTML для этого организован в таблице. Каждый абзац представляет собой одну строку таблицы, состоящую из аннотаций в левом и основном тексте в столбце правой таблицы. примечания/аннотации идут влево. Однако, к сожалению, есть и другие элементы/текстовые узлы.
<table>
<tr>
<td class"comments">
<span id="dog" class="note">Note for dog</span>
<span id="cat" class="note">Note for cat</span>
<span id="horse" class="note">Note for horse</span>
Somethin else than a note.
</td>
<td>[Text...]
<span id="dog_anchor" class="reference">Dog</span>
<span id="cat_anchor" class="reference">Cat</span>
<span id="horse_anchor" class="reference">Horse</span>
[Text...]
</td>
</tr>
</table>
Легко изменить "примечание" - span
на absolute
и поместить их на уровень их ссылки:
$('span[class*="note"]').each(function (index, value) {
var my_id = $(this).attr('id');
var element_ref = document.getElementById(my_id + "_anchor"); // get reference element
var pos_of_ref = element_ref.offsetTop; // get position of reference element
$(this).css('top', pos_of_ref); // set own position to position of reference element
});
Однако жизнь здесь не так проста. Поскольку в одной строке может быть много опорных слов (в то время как на других нет ни одного из них), мне нужен довольно сложный способ распространения заметок, чтобы они были как можно ближе к их ссылкам, не уничтожая ничего в макете ( например, размещаются вне ячейки таблицы или перекрываются с другими элементами).
Кроме того, высота ячеек таблицы не может быть изменена. Элементы, которые не являются заметками, не должны перемещаться. (Элементы примечания всегда находятся в том порядке, в котором они отображаются в основном тексте. Это не проблема.) Итак, мне нужен такой алгоритм:
- Возьмите все заметки в ячейке таблицы.
- Проанализировать пустое пространство в этой ячейке таблицы: какие области пусты, которые заблокированы?
- Распределите заметки в ячейке таблицы, чтобы каждая заметка была как можно ближе к эталонному слову без какого-либо элемента, сталкивающегося с любым другим элементом в ячейке таблицы.
Есть ли быстрый и элегантный способ сделать это без необходимости писать сотни строк кода?
Вот JSfiddle: https://jsfiddle.net/5vLsrLa7/7/
[Обновление предлагаемых решений]
Просто установка положения боковых нот на relative
или просто перемещение заметок не будет работать, потому что в этом случае боковые ноты будут просто идти вниз относительно их желаемого положения, что приводит к тому, из их справочных слов. В конце концов, для аккуратного решения мне нужно, чтобы боковые заметки распространялись в обоих направлениях: вверх и вниз.
[Обновление] Ожидаемый результат будет примерно таким:
Как вы видите, никогда невозможно разместить все заметки на высоте их ссылки. Тем не менее, свободное пространство используется, чтобы расположить их как можно ближе, перемещая их вверх и вниз.