I have this code and I am unable to achieve a fluid movement using Scroll-to-top function and Cubic bezier / 'easeInOutCubic'
at lower speed (e.g 4000-6000).
I've tried different alternatives with no luck.
Also, I would like to mention that I am forced to use jQuery 2.1.3 due to the fact that, I am trying to implement this function in cargo.site environment and they have this version which can't be replaced in custom html
section.
I would take into consideration a pure CSS alternative as well if Cubic Bezier could be emulated.
Tested in latest version of Chrome 113.0.5672.127 ,Win 10 64x. Thanks.
$(window).scroll(function() {
if ($(this).scrollTop() > 350) {
$('#scrlTop').fadeIn();
} else {
$('#scrlTop').fadeOut();
}
});
$('#scrlTop').click(function () {
$('html, body').animate({
scrollTop: '0px'
}, 4800, 'easeInOutCubic');
return false;
});
#scrlTop {
position: fixed;
bottom: 16.6px;
right: 18px;
width: 57px;
height: 57px;
border-radius: 0%;
background-color: black;
display: none;
backface-visibility: hidden;
transform: translateZ(0);
}
/* Extra Things */
body{background-image: url(https://images.unsplash.com/photo-1484542603127-984f4f7d14cb?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxleHBsb3JlLWZlZWR8MTh8fHxlbnwwfHx8fHw%3D&w=1000&q=80);font-family: 'Open Sans', sans-serif;}h3{font-size: 30px; font-weight: 400;text-align: center;margin-top: 50px;}h3 i{color: #c6c6c6;}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.0/jquery.min.js"></script>
<a id="scrlTop" href="#" class="hide"></a>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery-easing/1.3/jquery.easing.min.js"></script>
<!-- ICON NEEDS FONT AWESOME FOR CHEVRON UP ICON -->
<link href="//netdna.bootstrapcdn.com/font-awesome/3.2.1/css/font-awesome.css" rel="stylesheet">
<div style="height:2000px;">
<h3>Scroll down</h3>
<h3><i class="icon-arrow-down"></i>
<h3>Scroll down</h3>
<h3><i class="icon-arrow-down"></i>
<h3>Scroll down</h3>
<h3><i class="icon-arrow-down"></i>
<h3>Scroll down</h3>
<h3><i class="icon-arrow-down"></i>
</h3></h3></h3></h3>
</div>
I've managed to make it work using Vanilla JS without using jQuery. Works smooth in cargo.site environment.
var scrlTop = document.getElementById('scrlTop');
window.addEventListener('scroll', function() {
if (window.pageYOffset > 350) {
fadeIn(scrlTop);
} else {
fadeOut(scrlTop);
}
});
scrlTop.addEventListener('click', function() {
animateScrollTop(0, 4800);
return false;
});
function fadeIn(element) {
element.style.display = 'block';
}
function fadeOut(element) {
element.style.display = 'none';
}
function animateScrollTop(target, duration) {
var startPosition = window.pageYOffset;
var distance = target - startPosition;
var startTime = null;
function scrollAnimation(currentTime) {
if (startTime === null) {
startTime = currentTime;
}
var timeElapsed = currentTime - startTime;
var scrollPosition = easeInOutCubic(timeElapsed, startPosition, distance, duration);
window.scrollTo(0, scrollPosition);
if (timeElapsed < duration) {
requestAnimationFrame(scrollAnimation);
}
}
function easeInOutCubic(t, b, c, d) {
t /= d/2;
if (t < 1) {
return c/2*t*t*t + b;
}
t -= 2;
return c/2*(t*t*t + 2) + b;
}
requestAnimationFrame(scrollAnimation);
}
#scrlTop {
position: fixed;
bottom: 16.6px;
right: 18px;
width: 57px;
height: 57px;
border-radius: 0%;
background-color: black;
display: none;
backface-visibility: hidden;
transform: translateZ(0);
}
/* Extra Things */
body{background-image: url(https://images.unsplash.com/photo-1484542603127-984f4f7d14cb?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxleHBsb3JlLWZlZWR8MTh8fHxlbnwwfHx8fHw%3D&w=1000&q=80);font-family: 'Open Sans', sans-serif;}h3{font-size: 30px; font-weight: 400;text-align: center;margin-top: 50px;}h3 i{color: #c6c6c6;}
<a id="scrlTop" href="#" class="hide"></a>
<!-- ICON NEEDS FONT AWESOME FOR CHEVRON UP ICON -->
<link href="//netdna.bootstrapcdn.com/font-awesome/3.2.1/css/font-awesome.css" rel="stylesheet">
<div style="height:2000px;">
<h3>Scroll down</h3>
<h3><i class="icon-arrow-down"></i>
<h3>Scroll down</h3>
<h3><i class="icon-arrow-down"></i>
<h3>Scroll down</h3>
<h3><i class="icon-arrow-down"></i>
<h3>Scroll down</h3>
<h3><i class="icon-arrow-down"></i>
</h3></h3></h3></h3>
</div>