Извините, это будет немного длинным ...
Немного контекста
Как часть более крупного проекта, я пытаюсь создать временную шкалу проекта включить в веб-страницу, используемую для дистанционного управления программой создания музыки (называемой Reaper для тех, кто интересуется). Я пытаюсь заставить его отображать текущую позицию игры, маркеры проекта и области проекта. Все они доступны прямо из API программы, без проблем получить информацию. Для начала я просто пытаюсь отобразить маркеры проекта, однако я уже больше недели вытягиваю свои волосы, пытаясь заставить его работать.
Вот быстрый скринкап изнутри программного обеспечения проиллюстрировать то, что я пытаюсь подражать: Reaper ruler screencap
Обычно я использовал индикатор прогресса для чего-то подобного или один из тысяч примеров из Интернета, однако у меня нет возможности узнать длина проекта, поскольку программное обеспечение не ограничивает его. В результате я вернулся к использованию фиксированной шкалы 10px за бар. Какой-то произвольный, я выбрал это как оптимальное для 5-минутной песни со 120 уд / мин. Не слишком беспокоиться о том, как искать момент, я просто хочу заставить его работать ха-ха.
Проблема, которую я имею (код включен внизу), заключается в том, что, поскольку я использую абсолютное позиционирование для маркеров чтобы выровнять их все слева от экрана, они вытягиваются из потока документов, и поэтому я не могу их обернуть в родительский div. В конце концов, я намерен установить родительский div на 80% ширину с помощью полосы прокрутки, чтобы увидеть остальную часть маркеров, поэтому, очевидно, я делаю это неправильно. Однако я не могу найти каких-либо закодированных фрагментов чего-либо, похожего на то, что я пытаюсь достичь.
Итак, вот вопрос:
Какой вид отображения / позиции / float CSS следует использовать для этого вместо position: absolute
и float: left
? Если мне нужно JS, чтобы сделать это, то как мне это сделать?
Спасибо за любую помощь, которую вы можете мне принести, будь то реальный код или просто подталкивание в правильном направлении!
Вот мой (релевантный) код:
index.html
<html>
<body>
<div id="timeline">
<div id="labels"></div>
<div id="markers"></div>
</div>
</body>
</html>
script.js:
// hardcoded for debugging purposes
// See section below about the API for info about how I get this data
var markers = [
{label: "Start", pos: "20.00000000000000"},
{label: "First", pos: "50.00000000000000"},
{label: "Second", pos: "200.00000000000000"},
{label: "Last", pos: "576.845412000000000"}
];function draw_markers(marker_list) {
var label_html = "";
var marker_html = ""; $.each(marker_list, function(index, obj) {
var label = obj.label;
var offset = parseFloat(obj.pos) * 7; // obj.pos is mesured in bars, not px label_html = label_html +
"<span class='label' style='margin-left:"+offset+"px'>" +
label + "</span>"; marker_html = marker_html +
"<span class='marker' style='margin-left:"+offset+"px'>|</span>";
}); document.getElementById("labels").innerHTML = label_html;
document.getElementById("markers").innerHTML = marker_html;
}draw_markers(markers);
style.css:
html, body {
background: #eeeeee;
}#timeline {
height: 4em;
width: 100%;
background-color: #9E9E9E;
}#labels {
border-bottom: 1px solid black;
height: 50%;
width: 100%;
}#markers {
height: 50%;
width: 100%;
}.label {
position: absolute;
float: left;
}
.marker {
position: absolute;
float: left;
}
Об API
Нам предоставляется куча функций, которые регулярно проверяют сервер и анализируют (cleartext). Типичный ответ выглядит примерно так:
MARKERLIST_BEGINMARKER_LIST
MARKER \t label \t ID \t position
...
MARKER_LIST_END
TRANSPORT \t playstate \t position_seconds \t isRepeatOn \t position_string \t position_string_beats
...
Используя JS, я разделяю каждую строку и использую оператор switch, чтобы выяснить, что делать с каждой строкой. Затем я создаю глобальный массив, содержащий весь маркер в проекте, только с информацией, которая мне нужна.
В качестве альтернативы вы можете использовать
<canvas>
, чтобы нарисовать временную шкалу из Javascript (это то, что я использую для веб-интерфейса Song Switcher). Также вы можете получить длину проекта с помощью функции APIGetProjectLength
(например, вызывая скрипт, чтобы поместить длину во временную extstate, а затем прочитать ее из веб-интерфейса).GetProjectLength
из Интернета, хотя мне придется делать рытье. Спасибо хоть!вы можете использовать
div
s какdisplay: inline-block
и установить их ширину в процентах дельтах перекрывающихся абсолютных позиций временной шкалы:CSS