Сетка реализована с использованием Flexbox. Пример:
Количество строк в этом примере равно 4, потому что я установил ширину контейнера для демонстрационных целей. Но на самом деле он может меняться в зависимости от ширины контейнера (например, если пользователь изменяет размер окна). Попробуйте изменить размер окна вывода в этом примере, чтобы получить представление.
Всегда есть один активный элемент, отмеченный черной рамкой.
Используя JavaScript, я разрешаю пользователям перемещаться по предыдущему/следующему элементу с помощью стрелки влево/вправо. В моей реализации я просто уменьшаю/увеличиваю индекс активного элемента на 1.
Теперь я хочу, чтобы пользователи могли перемещаться вверх и вниз. Для этого мне просто нужно уменьшить/увеличить индекс активного элемента на <amount of items in a row>
. Но как вычислить это число, учитывая, что он зависит от ширины контейнера? Есть ли лучший способ реализовать функции "вверх-вниз"?
.grid {
display: flex;
flex-wrap: wrap;
align-content: flex-start;
width: 250px;
height: 200px;
background-color: #ddd;
padding: 10px 0 0 10px;
}
.item {
width: 50px;
height: 50px;
background-color: red;
margin: 0 10px 10px 0;
}
.active.item {
outline: 5px solid black;
}
<div id="grid" class="grid">
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item active"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
</div>