Прогресс для отдельного элемента
Прогресс для отдельного элемента .container. Подскажите, пожалуйста, где ошибка в скрипте? При прокрутке блока .container влево-вправо прогресс #progress должен менять свою ширину в зависимости от того, насколько прокручен блок.
var indicator = document.querySelector('#progress');
var progressIndicator = function() {
indicator.style.width = (window.scrollX / (document.querySelector('.container').offsetWidth - window.innerWidth) * 100).toFixed(1) + "%";
};
window.addEventListener("scroll", progressIndicator);
* {margin: 0; padding: 0;}
body {overflow: hidden;}
#progress {
background-color: red;
position: fixed;
height: 10px;
width: 0%;
top: 0;
left: 0;
}
.container {
background-color: #f1f1f1;
border: 2px solid black;
width: 100%;
height: calc(100vh - 60px);
overflow-y: hidden;
overflow-x: auto;
white-space: nowrap;
margin-top: 50px;
}
.item {
display: inline-block;
background-color: gray;
width: 100%;
height: 100%;
vertical-align: top;
margin: 0 5vw;
}
.hidden {
display: none;
position: fixed;
top: 10px;
left: 10px;
font-size: 25px;
}
<div class="container">
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
</div>
<div id="progress"></div>
Ответы (1 шт):
Автор решения: OPTIMUS PRIME
→ Ссылка
Ну, если что-то не работает, надо сначала проверять, запускается ли вообще функция) Простой console.log() в progressIndicator: Не работает. Событие добавили на window, а скролл происходит в container. Его и стоит отслеживать.
Вдобавок:
- container.scrollLeft — сколько пикселей прошло,
- container.scrollWidth — реальная внутренняя ширина, с учетом скролла,
- container.clientWidth — внутренняя ширина без учета скролла.
var indicator = document.querySelector('#progress');
var container = document.querySelector('.container');
var progressIndicator = function(e) {
var scrolled = container.scrollLeft;
var full_scroll = container.scrollWidth - container.clientWidth;
indicator.style.width = (100 * scrolled / full_scroll).toFixed(1) + "%";
};
container.addEventListener("scroll", progressIndicator);
* {
margin: 0;
padding: 0;
}
body {
overflow: hidden;
}
#progress {
background-color: #f70;
position: fixed;
height: 4px;
width: 0%;
top: 0;
left: 0;
}
.container {
background-color: #f1f1f1;
border: 2px solid black;
width: 100%;
height: calc(100vh - 60px);
overflow-y: hidden;
overflow-x: auto;
white-space: nowrap;
margin-top: 50px;
}
.item {
display: inline-block;
background-color: gray;
width: 100%;
height: 100%;
vertical-align: top;
margin: 0 5vw;
}
.hidden {
display: none;
position: fixed;
top: 10px;
left: 10px;
font-size: 25px;
}
<div id="progress"></div>
<div class="container">
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
</div>