Как реализовать функцию центрирования кнопки и автоматической прокрутки страницы к этой кнопке при ее нажатии?

Как можно улучшить скрипт прокрутки кнопок в блоке таким образом, чтобы при нажатии кнопка автоматически центрировалась в блоке, учитывая проблему крайних элементов, которые могут упираться в границу блока?
  • 20 мая 2024 г. 11:01
Ответы на вопрос 2
Для реализации функции центрирования кнопки и автоматической прокрутки страницы к этой кнопке можно использовать следующий скрипт на JavaScript:

```javascript
function scrollToButton(button) {
    var element = document.getElementById(button);
    var bodyRect = document.body.getBoundingClientRect();
    var elemRect = element.getBoundingClientRect();
    var offset = elemRect.top - bodyRect.top - (window.innerHeight - elemRect.height) / 2;
    
    window.scrollTo({
        top: offset,
        behavior: 'smooth'
    });
}
```

Для улучшения скрипта прокрутки кнопок в блоке и центрирования кнопки, учитывая проблему крайних элементов, можно добавить проверку на то, чтобы кнопка не располагалась слишком близко к границам блока. Если кнопка находится слишком близко к краям блока, можно скорректировать положение прокрутки так, чтобы кнопка оставалась видимой и центрированной в блоке.

```javascript
function scrollToButton(button) {
    var element = document.getElementById(button);
    var bodyRect = document.body.getBoundingClientRect();
    var elemRect = element.getBoundingClientRect();
    var offset = elemRect.top - bodyRect.top - (window.innerHeight - elemRect.height) / 2;
    
    if (offset < 0) {
        offset = 0;
    } else if (offset > document.body.scrollHeight - window.innerHeight) {
        offset = document.body.scrollHeight - window.innerHeight;
    }
    
    window.scrollTo({
        top: offset,
        behavior: 'smooth'
    });
}
```

Этот скрипт будет проверять положение кнопки относительно границ блока и скорректирует положение прокрутки, чтобы кнопка всегда оставалась видимой и центрированной.
Честно говоря, не очень понятна задача, которую вы решаете. 
Если я правильно понял написанное, то прокрутка не должна работать так, как вы пишете - с дополнительным смещением элементов в начале или в конце.

https://developer.mozilla.org/en-US/docs/Web/API/E...

В русской версии:


scrollLeft может быть установлен, как любое целое число, однако:

Если элемент не может быть прокручен (т.е. у него нет переполнения), scrollLeft устанавливается в 0.
Если установили значение меньше 0 (больше 0 при расположении элементов справа налево), scrollLeft устанавливается в 0.
Если установлено значение больше, чем максимум прокручиваемого контента, scrollLeft устанавливается в максимум.


Может быть вам стоит добавить в начале и в конце какой-нибудь скрытый элемент, который будет менять размеры в зависимости от того, какой элемент (кнопка) должна быть в центре - чтоб отталкивать от границ контейнера первый и последний элемент.

Вот это:
justify-content: center;

по-моему, там не нужно.

P.S. Для более быстрого отклика при разборе простых случаев, полезно так же освоить codepen и т.п.

Вот, к примеру, демка для вашего вопроса:
https://codepen.io/alkthecode/pen/ZENWGRZ
Похожие вопросы