Скользящий выборочный список

Описание

Пытаюсь сделать выборочный список, при нажатии на элемент которого, он должен плавно перемещаться в центр. Пытаюсь реализовать это через overflow и scrollbar.

const divScrollPicker = document.querySelector(`div#scroll-picker`);
divScrollPicker?.querySelectorAll(`button`).forEach((button, index) => {
    button.addEventListener(`click`, event => button.scrollIntoView({ behavior: `smooth`, block: `center` }));
});
body {
  position: fixed;
  inset: 0;
  max-width: 100vmin;
  margin-inline: auto;
  display: grid;
  grid-template-columns: 1fr 2fr;
  grid-template-rows: auto;
  align-content: center;
}

div#scroll-picker {
  display: flex;
  flex-direction: column;
  max-height: 30px;
  overflow-y: visible;
  scroll-snap-type: y mandatory;
  scroll-snap-align: center;
  scroll-padding: 0;

  &>* {
    min-height: 100%;
    max-height: 100%;
  }
}

div#scroll-picker,
div#picker-container {
  border: 1px solid black;
}
<div id="scroll-picker">
  <button type="button" title>Button 1</button>
  <button type="button" title>Button 2</button>
  <button type="button" title>Button 3</button>
  <button type="button" title>Button 4</button>
  <button type="button" title>Button 5</button>
  <button type="button" title>Button 6</button>
  <button type="button" title>Button 7</button>
  <button type="button" title>Button 8</button>
</div>
<div id="picker-container"></div>

Проблемы

  1. Чтобы элементы могли скользить я должен включить ползунок, то есть overflow: scroll или auto.
  2. Если я включаю ползунок, элементы вне блока не показываются.
  3. Если элементы вне блока не показываются, я не могу нажать на них чтобы они скользили к центру.

Из этого замкнутого круга я пока не могу найти выхода.

Вопрос

Есть ли у вас решение?
Или может предложите другой способ?


Ответы (1 шт):

Автор решения: eccs0103

Решение

Обходной способ с использованием padding-а:

const divScrollPicker = document.querySelector(`div#scroll-picker`);
divScrollPicker?.querySelectorAll(`button`).forEach((button) => {
    button.addEventListener(`click`, event => button.scrollIntoView({ behavior: `smooth`, block: `center` }));
});
body {
  position: fixed;
  inset: 0;
  margin: 0;
  padding: 0;
  max-width: 100vmin;
  max-height: 100vh;
  margin-inline: auto;
  display: grid;
  grid-template-columns: 1fr 2fr;
  grid-template-rows: auto;
  overflow: hidden;

  --color-highlight: hsl(200deg, 100%, 50%);
}

div#scroll-picker {
  display: flex;
  flex-direction: column;
  overflow: hidden;
  scroll-snap-type: y mandatory;
  scroll-snap-align: center;
  scroll-padding: 0;
  background-color: var(--color-highlight);
  background-clip: content-box;

  --size-item: 1.2em;
  padding-block: calc((100vh - var(--size-item)) / 2);

  &>* {
    background-color: transparent;
    border: none;
    min-height: var(--size-item);
    max-height: var(--size-item);
  }
}

div#picker-container {
  outline-style: solid;
  outline-color: var(--color-highlight);
}
<div id="scroll-picker">
  <button type="button" title>Button 1</button>
  <button type="button" title>Button 2</button>
  <button type="button" title>Button 3</button>
  <button type="button" title>Button 4</button>
  <button type="button" title>Button 5</button>
  <button type="button" title>Button 6</button>
  <button type="button" title>Button 7</button>
  <button type="button" title>Button 8</button>
</div>
<div id="picker-container"></div>

→ Ссылка