前段时间拜读阮老师的 《ECMAScript 6 入门》 ,看到官网上每一个章节的页面都有一个相似进度条的东西,出于好奇,上网查了一下,发现这个东西叫Scroll Indicator
.javascript
Scroll Indicator:滚动指示器。通俗来讲,就是当前可视区域距离页面顶部的占比,效果以下:css
在尚未捞源码以前,本身先大体想了一下实现思路:java
scrollTop
(TH);scroll
事件,(TH / (DH - VH)) * 100%
,即是当前的占比;节流
、 防抖
。核心代码以下:es6
var dh = $(document).height();
var vh = $(window).height();
var sHeight = dh - vh;
$(window).scroll(function() {
var perc = $(window).scrollTop() / (dh - vh);
$('.j-scroll-indicator').css({width: perc * 100 + '%'});
)};复制代码
这是实现以后的效果:bash
DEMOwordpress
而后去捞了一下阮老师es6官网的源码:spa
(function() {
var $w = $(window);
var $prog2 = $('.progress-indicator-2');
var wh = $w.height();
var h = $('body').height();
var sHeight = h - wh;
$w.on('scroll', function() {
window.requestAnimationFrame(function(){
var perc = Math.max(0, Math.min(1, $w.scrollTop() / sHeight));
updateProgress(perc);
});
});
function updateProgress(perc) {
$prog2.css({width: perc * 100 + '%'});
ditto.save_progress && store.set('page-progress', perc);
}
}());复制代码
不出所料,作法是同样的。3d
而后,就开始瞎琢磨,以前用 css
搞过瀑布流,那能够用 css
搞滚动指示器吗?code
使用 CSS
来实现滚动指示器,难点在于:如何实时去获取当前可视区域在文档流中的位置。cdn
上述问题,如何去考虑呢?咱们从分解滚动指示器的动做中来找答案:
也就是说:(TH / (DH - VH))
公式中的 TH
能够不用知道,只须要DH - VH
的高度,即直角三角形的高度便OK。
如今问题转化为:如何求出VH,这时候该 vh
这个长度单位登场了,vh 是基于视窗单位的排版计量。vh能够获取当前视窗的高度。嗯,如今看来,应该是能够一写了。
<body>
<div class="main">
<h1>滚动鼠标</h1>
</div>
</body>复制代码
.main {
margin: 0;
padding: 0;
display: block;
height: 30000px;
text-align: center;
line-height: 100px;
}
body {
margin: 0;
padding: 0;
background: linear-gradient(to right top, #369 50%, #fff 50%);
background-size: 100% calc(100% - 99vh);
}
body:before {
content: '';
position: fixed;
top: 4px;
bottom: 0;
width: 100%;
z-index: -1;
background: #fff;
}复制代码
大体实现是没有问题的,可是有下面几个缺点:
background-size: 100% calc(100% - 99vh);
中的99vh是相对值,如果视窗高度比较小,进度条会填不满进度条槽(可考虑加min-height来弱化)以上