Скользящий выборочный список
Описание
Пытаюсь сделать выборочный список, при нажатии на элемент которого, он должен плавно перемещаться в центр. Пытаюсь реализовать это через 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>
Проблемы
- Чтобы элементы могли скользить я должен включить ползунок, то есть
overflow: scroll
илиauto
. - Если я включаю ползунок, элементы вне блока не показываются.
- Если элементы вне блока не показываются, я не могу нажать на них чтобы они скользили к центру.
Из этого замкнутого круга я пока не могу найти выхода.
Вопрос
Есть ли у вас решение?
Или может предложите другой способ?
Ответы (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>