滚动不断计数,速度变化
Counting continusly with scroll, speed varies
我的老板让我模仿这个网站:
http://mailchimp.com/2013/#by-the-numbers
除了白色数字外,我已经能猜出所有棋子了。真正酷(但棘手)的效果是计数速度 accelerates/decelerates 取决于数据计数属性,即使各部分之间的距离相同。
他们似乎使用 waypoints.js 来区分不同的部分。我搜索了一个可以根据数据输入调整速度的插件,但我只能找到像 countTo.js 这样触发然后计数的插件,而不是随着用户滚动而不断地上下计数。
如有任何帮助,我们将不胜感激!
这让我很感兴趣,所以我试了一下。
据我所知,waypoints.js 仅在元素到达视口边缘时触发。我不认为你可以将它用于这种事情,因为你需要不断更新你的计数器。所以我在没有任何 jQuery 插件的情况下写了这篇文章。
免责声明:此代码可能适合您,也可能不适合您,无论哪种方式,请将其视为解决方案的草图,仍需要在多个地方进行改进才能用于生产站点。
var current = $('.step').first();
$('.step').each(function() {
var start = $(this).data('count'),
end = $(this).next().data('count'),
height = $(this).height(),
offset = $(this).offset().top,
increment = end ? height / (end - start) : 0; //after how many pixels of scrolling do we need to incremwent our counter? Set to 0 for last element, just in case
// just adding the count as text, so it gets displayed
$(this).text(start);
//store increment and offset, we need those in our scrollListener
$(this).data({
increment: increment,
offset: offset
});
});
$(document).on('scroll', function() {
var scrollpos = $(window).scrollTop(),
elementscrollpos,
counter;
//check if scrolled to the next element
if (current.next().data('offset') < scrollpos) {
current = current.next();
} else if (current.data('offset') > scrollpos) {
current = current.prev();
}
//calculate the current counter value;
elementscrollpos = scrollpos - current.data('offset');
counter = Math.floor(current.data('count') + elementscrollpos / current.data('increment'));
$('.counter').text(counter);
});
body {
margin: 0;
}
.counter {
position: fixed;
top: 0;
left: 0;
}
.step {
height: 100vh;
text-align: center;
font-size: 40px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<div class="counter"></div>
<div class="step" data-count="0"></div>
<div class="step" data-count="1"></div>
<div class="step" data-count="2"></div>
<div class="step" data-count="8"></div>
<div class="step" data-count="100"></div>
<div class="step" data-count="110240"></div>
<div class="step" data-count="110250"></div>
我的老板让我模仿这个网站:
http://mailchimp.com/2013/#by-the-numbers
除了白色数字外,我已经能猜出所有棋子了。真正酷(但棘手)的效果是计数速度 accelerates/decelerates 取决于数据计数属性,即使各部分之间的距离相同。
他们似乎使用 waypoints.js 来区分不同的部分。我搜索了一个可以根据数据输入调整速度的插件,但我只能找到像 countTo.js 这样触发然后计数的插件,而不是随着用户滚动而不断地上下计数。
如有任何帮助,我们将不胜感激!
这让我很感兴趣,所以我试了一下。
据我所知,waypoints.js 仅在元素到达视口边缘时触发。我不认为你可以将它用于这种事情,因为你需要不断更新你的计数器。所以我在没有任何 jQuery 插件的情况下写了这篇文章。
免责声明:此代码可能适合您,也可能不适合您,无论哪种方式,请将其视为解决方案的草图,仍需要在多个地方进行改进才能用于生产站点。
var current = $('.step').first();
$('.step').each(function() {
var start = $(this).data('count'),
end = $(this).next().data('count'),
height = $(this).height(),
offset = $(this).offset().top,
increment = end ? height / (end - start) : 0; //after how many pixels of scrolling do we need to incremwent our counter? Set to 0 for last element, just in case
// just adding the count as text, so it gets displayed
$(this).text(start);
//store increment and offset, we need those in our scrollListener
$(this).data({
increment: increment,
offset: offset
});
});
$(document).on('scroll', function() {
var scrollpos = $(window).scrollTop(),
elementscrollpos,
counter;
//check if scrolled to the next element
if (current.next().data('offset') < scrollpos) {
current = current.next();
} else if (current.data('offset') > scrollpos) {
current = current.prev();
}
//calculate the current counter value;
elementscrollpos = scrollpos - current.data('offset');
counter = Math.floor(current.data('count') + elementscrollpos / current.data('increment'));
$('.counter').text(counter);
});
body {
margin: 0;
}
.counter {
position: fixed;
top: 0;
left: 0;
}
.step {
height: 100vh;
text-align: center;
font-size: 40px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<div class="counter"></div>
<div class="step" data-count="0"></div>
<div class="step" data-count="1"></div>
<div class="step" data-count="2"></div>
<div class="step" data-count="8"></div>
<div class="step" data-count="100"></div>
<div class="step" data-count="110240"></div>
<div class="step" data-count="110250"></div>