Это, надо понимать, менюшка для какого нибудь гтарп? Так как рендерится она в webview, что по сути - полноценный браузер, то там доступны все функции браузерного апи.
Пора для моддеров открывать отдельную категорию на тостере...
Ничего не тестировал, клиентскую часть отродясь не писал, но логика и немного гугла подсказывают мне, что как-то так это должно выглядеть.
const state = {
current: 0,
top: 0,
opts: [].fill(new Element()) // fill просто для примера, в реальности тут должны храниться DOM элементы доступных опций
}
const visibleOpts = 6; // кол-во видимых одновременно вариантов меню
const nextIndex = isUpKey => isUpKey ? state.current - 1 : state.current + 1;
const overflows = index => index < 0 || index >= state.opts.length;
const needsScroll = index => {
if ((index >= top) && (top + visibleOpts - 1 >= index)) {
return false;
}
return true;
}
// вешаем на обработчик нажатий кнопок-переключателей, не знаю, какой у вас фреймворк, надеюсь не богомерзкий fivem... и не богомерзкий ragemp.
// передаем в аргумент сдвинулся ли выбор вверх (true) или вниз (false)
function onArrowKeyPressed(isUpKey) {
const indexNext = nextIndex(isUpKey);
if (overflows(indexNext) || !needsScroll(indexNext)) {
return;
}
state.top = isUpKey ? top - 1 : top + 1;
state.current = indexNext
state.opts[state.current].scrollIntoView(isUpKey);
}
upd. исправил логику