对于一个项目,我必须使用html和javascript创建一个可视计数器,该计数器相对于窗口的滚动位置从150倒数到0。
我不完全确定我该怎么做才能做到这一点,但到目前为止我所拥有的是:
HTML:
<span class="meterCounter">
<label class="number">150</label>
<label class="rotated">mtr.</label>
</span>
JS:
// calculate page height (keeping element position in mind):
var offset = $(".meterCounter").offset().top;
var pageHeight = $(document).height() - offset;
// calculate how many pixels user should scroll until html changes:
var divide = pageHeight / 150;
count = 150;
$(document).scroll(function(){
var scrollPosition = $(window).scrollTop();
// (magic if statement here that determines when html should change)
count--;
$(".number").html(count);
divide = divide + divide;
});
JSfiddle here我所拥有的(通过DelightedD0D,谢谢顺便说一句!)
我已经在互联网上搜索了但是在这里找不到解决这个小问题的好方法。
非常感谢有关如何解决这个谜团的帮助和建议!
(注意:不要求人们为我编写代码,只是提出一些可靠的建议或推动正确的方向!:])。
非常感谢!
*编辑:
我应该添加,在页面的底部,计数器需要为0,在顶部它需要回到150,所以,在我的脑海里,我必须更新html每次我滚动X像素数量(X是&#34;划分&#34;变量)。
答案 0 :(得分:2)
其实@Gaby又名G. Petrioli的回答有点瑕疵。变量(已修复)。pageHeight
中的值不应该通过计数器与文档顶部的距离来减少,该距离存储在变量offset
中。您可以通过更改计数器的位置,移除Math.round()
(以便错误未被近似覆盖)并滚动到底部来观察由此产生的错误行为。或者现在只是see it in action。
这是我使用纯JavaScript的解决方案。它还包括重新计算窗口的大小调整。
var counter = document.getElementById('counter');
function updateCounter() {
'use strict';
var height = document.documentElement.scrollHeight - window.innerHeight;
counter.textContent = 150 - document.documentElement.scrollTop / height * 150;
}
document.addEventListener('scroll', updateCounter);
window.addEventListener('resize', updateCounter);
html, body {
height: 1000%;
}
#counter {
position: fixed;
}
<span id="counter">150</span>
很少有人注意到这个JavaScript为什么看起来像它的样子:
'use strict'
将选择加入所谓的strict mode(MDN)。document.documentElement.scrollHeight - window.innerHeight
是我们感兴趣的高度。整个文档的高度减少了视口的高度。为什么我们需要减少?因为无论我们当前的滚动位置如何,我们永远不会完全滚出文档,即我们将始终看到它的一部分,并且该部分等于视口的高度。height
,因为这是它唯一的外观。document.documentElement.scrollTop / height
会向我们提供相对于文档高度的滚动位置,即我们滚动的文档的百分比。它的数字范围从0到1,但我们感兴趣的范围从0到150,因此成倍增加。所有这些都从150减去,因为我们想要从150到0,而不是相反。counter.textContent =
内的整个语句放在Math.round()
内。我个人觉得这个方法比这里发布的jQuery更清楚。当然,它也有更好的表现。
更新:将document.body
的两次更改更改为document.documentElement
,因为此处至少使用其中一个的方式已弃用并停止工作。
答案 1 :(得分:1)
扩展我的评论,您需要计算// calculate page height (keeping element position in mind):
var offset = $(".meterCounter").offset().top;
var pageHeight = $(document).height() - $(window).height();
// calculate how many pixels user should scroll until html changes:
var count = 150,
divide = pageHeight / count;
$(document).scroll(function(e){
var scrollPosition = $(window).scrollTop(),
relevantToHeight = scrollPosition*count/pageHeight ;
// (magic if statement here that determines when html should change)
$(".number").html(count - Math.round(relevantToHeight));
});
相对于总高度的位置
样本
spark-csv
https://jsfiddle.net/gaby/d160vLqm/18/
演示(请记住,在窗口调整大小时,您需要重新计算大多数缓存变量)