Сегодня очень модно показывать текущее положение прокрутки страницы вверху этой самой страницы. Кому-то из разработчиков пока недостаточным наличие «лифта справа» и, вот он новый элемента дизайна многих страниц в интернете. Ну да ладно, не стану пытаться искать причины столь наличия столь странного элемента, а лишь покажу как легко он делается.
Ссылка на ДЕМО.
Начнем, пожалуй, с разметки страницы. Пусть она будет очень простой:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<div class="progress"></div>
<section></section>
</body>
</html>
Сама страница состоит из двух элементов:
<div class="progress" />
– собственно, сам индикатор<section />
– просто блок с большой высотой, чтобы было что скролить.
Все это надо аккуратно оформить:
body {
padding: 0;
margin: 0;
}
section {
display: block;
height: 20000px;
background-color: #ddd;
}
.progress {
left: 0;
top: 0;
width: 0;
height: 5px;
background-color: #f00;
position: fixed;
z-index: 2;
animation: width 10ms ease-in;
}
Для section
установим высоту в 20 000 пикселей, а индикатор .progress
пусть будет красного цвета и расположен фиксировано вверху страницы.
А теперь JavaScript, который отвечает за работу индикатора:
!function(window) {
var document = window.document;
var pageProgressNode = document.querySelector('.progress');
var windowScrollHeight = document.body.scrollHeight;
var windowVisibleHeight = window.innerHeight;
window.addEventListener('scroll', function() {
var scrollPosition = (document.documentElement.scrollTop ? document.documentElement : document.body).scrollTop;
var pageProgressWidth = Math.min(100, scrollPosition / (windowScrollHeight - windowVisibleHeight) * 100);
pageProgressNode.style.width = pageProgressWidth + '%';
});
}(this);
Делает этот код следующее: высчитывает в процентах текущее положение прокрутки var pageProgressWidth = Math.min(100, scrollPosition / (windowScrollHeight - windowVisibleHeight) * 100)
, где scrollPosition
– значение положения прокрутки (в пикселях), windowScrollHeight
– общая высота страницы (в пикселях), windowVisibleHeight
– видимая часть страницы (снова в пикселях). А затем устанавливает полученное значение как ширину нашего индикатора: pageProgressNode.style.width = pageProgressWidth + '%'
.
Тут есть один «хак» (document.documentElement.scrollTop ? document.documentElement : document.body).scrollTop
. Он необходим, чтобы индикатор работал в Firefox.