Проблема в том, что значение -200px
равно кумулятивно . В результате каждый раз, когда происходит событие scroll
, вы перемещаете элемент еще на 200 пикселей влево.
Чтобы исправить это, вам нужно сделать идемпотентным действие. Другими словами, независимо от того, сколько раз событие запускается, результат должен быть одинаковым. Для этого используйте CSS, чтобы выполнить переход в фиксированное положение. Затем просто переключите соответствующий класс в зависимости от положения вертикальной прокрутки. Попробуйте это:
$(window).on('scroll', function() {
var y = jQuery(this).scrollTop();
$('.side-button-wrap').toggleClass('slide-in', y > 700 && y < 1300)
});
html,
body {
height: 3000px;
}
.side-button-wrap {
position: fixed;
top: 20px;
right: -100px;
width 100px;
transition: right 0.3s;
}
.side-button-wrap.slide-in {
right: 200px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
Scroll down!
<div class="side-button-wrap">
<button>Lorem ipsum</button>
</div>
Возможно, вы захотите посмотреть на отмену события прокрутки , так как это может привести к проблемам с производительностью, но это зависит от о том, насколько сложен DOM по отношению к анимируемым элементам.