进度条不单独加载
Progress bars not loading individually
我正在构建一个包含多个进度条的页面,这些进度条存在以下问题:
1 - 进度条在页面上可见时加载。问题是当第一个在视口上可见时,它们都会同时加载。它们应该在一个一个独立地进入视口时加载。
2 - 另一个问题是当我在页面底部并刷新浏览器时,只有当我一直滚动回到第一个栏时才会触发动画。
请看例子:
https://jsfiddle.net/f9c1szxu/
我希望有人能帮我解决这个问题。非常感谢!
JS
function isScrolledIntoView(elem) {
var docViewTop = $(window).scrollTop();
var docViewBottom = docViewTop + $(window).height();
var elemTop = $(elem).offset().top;
var elemBottom = elemTop + $(elem).height();
return ((elemBottom <= docViewBottom) && (elemTop >= docViewTop));
}
var IsViewed = false;
$(document).scroll(function() {
if (isScrolledIntoView('.progress-bar') && !IsViewed) {
$('.bar-percentage[data-percentage]').each(function() {
var progress = $(this);
var percentage = Math.ceil($(this).attr('data-percentage'));
$({
countNum: 0
}).animate({
countNum: percentage
}, {
duration: 3500,
easing: 'swing',
step: function() {
// What todo on every count
var pct = '';
if (percentage == 0) {
pct = Math.floor(this.countNum) + '%';
} else {
pct = Math.floor(this.countNum + 1) + '%';
}
progress.text(pct) && progress.siblings().children().css('width', pct);
}
});
});
IsViewed = true;
}
});
您一次使用了所有进度条,您需要一个一个地处理它们并且您处理的每个进度条都添加一个 class 到它不再处理它
function isScrolledIntoView(elem) {
var docViewTop = $(window).scrollTop();
var docViewBottom = docViewTop + $(window).height();
var elemTop = $(elem).offset().top;
var elemBottom = elemTop + $(elem).height();
return ((elemBottom <= docViewBottom) && (elemTop >= docViewTop));
}
var IsViewed = false;
$(document).scroll(function() {
$('.bar-percentage[data-percentage]:not(.viewed)').each(function() {
var progress = $(this);
if (isScrolledIntoView(progress.parent('.progress-bar'))) {
var percentage = Math.ceil($(this).attr('data-percentage'));
progress.addClass('viewed');
$({
countNum: 0
}).animate({
countNum: percentage
}, {
duration: 3500,
easing: 'swing',
step: function() {
// What todo on every count
var pct = '';
if (percentage == 0) {
pct = Math.floor(this.countNum) + '%';
} else {
pct = Math.floor(this.countNum + 1) + '%';
}
progress.text(pct) && progress.siblings().children().css('width', pct);
}
});
}
});
IsViewed = true;
});
h2 {
margin-bottom: 400px;
}
.progress-bar {
position: relative;
margin: 0 auto 2.0rem;
height: 5.0rem;
font-size: 0.8em;
color: #000;
}
.progress-bar:last-child {
margin-bottom: 0;
}
.bar-label {
font-size: 12px;
color: #000;
text-transform: none;
text-align: left;
font-weight: 600;
margin-bottom: 1.5rem;
}
.bar-percentage {
margin: 0 auto;
font-size: 1.0rem;
position: absolute;
top: 0.4rem;
right: 0;
}
.bar-container {
height: 1px;
width: 100%;
overflow: hidden;
background: #EFEFEF;
}
.progress-bar.thick-bar .bar-container,
.progress-bar.thick-bar .bar {
height: 1.0rem;
}
.bar {
float: left;
background: #000;
height: 1px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<h2>
Scroll down
</h2>
<div class="progress-bar">
<div class="bar-label">Web Design</div>
<div class="bar-percentage" data-percentage="95"></div>
<div class="bar-container">
<div class="bar"></div>
</div>
</div>
<div class="progress-bar">
<div class="bar-label">Web Design</div>
<div class="bar-percentage" data-percentage="95"></div>
<div class="bar-container">
<div class="bar"></div>
</div>
</div>
<div class="progress-bar">
<div class="bar-label">Web Design</div>
<div class="bar-percentage" data-percentage="95"></div>
<div class="bar-container">
<div class="bar"></div>
</div>
</div>
<div class="progress-bar">
<div class="bar-label">Web Design</div>
<div class="bar-percentage" data-percentage="95"></div>
<div class="bar-container">
<div class="bar"></div>
</div>
</div>
<h2>
Scroll down
</h2>
<div class="progress-bar">
<div class="bar-label">Web Design</div>
<div class="bar-percentage" data-percentage="95"></div>
<div class="bar-container">
<div class="bar"></div>
</div>
</div>
<div class="progress-bar">
<div class="bar-label">Web Design</div>
<div class="bar-percentage" data-percentage="95"></div>
<div class="bar-container">
<div class="bar"></div>
</div>
</div>
<div class="progress-bar">
<div class="bar-label">Web Design</div>
<div class="bar-percentage" data-percentage="95"></div>
<div class="bar-container">
<div class="bar"></div>
</div>
</div>
<div class="progress-bar">
<div class="bar-label">Web Design</div>
<div class="bar-percentage" data-percentage="95"></div>
<div class="bar-container">
<div class="bar"></div>
</div>
</div>
我正在构建一个包含多个进度条的页面,这些进度条存在以下问题:
1 - 进度条在页面上可见时加载。问题是当第一个在视口上可见时,它们都会同时加载。它们应该在一个一个独立地进入视口时加载。
2 - 另一个问题是当我在页面底部并刷新浏览器时,只有当我一直滚动回到第一个栏时才会触发动画。
请看例子:
https://jsfiddle.net/f9c1szxu/
我希望有人能帮我解决这个问题。非常感谢!
JS
function isScrolledIntoView(elem) {
var docViewTop = $(window).scrollTop();
var docViewBottom = docViewTop + $(window).height();
var elemTop = $(elem).offset().top;
var elemBottom = elemTop + $(elem).height();
return ((elemBottom <= docViewBottom) && (elemTop >= docViewTop));
}
var IsViewed = false;
$(document).scroll(function() {
if (isScrolledIntoView('.progress-bar') && !IsViewed) {
$('.bar-percentage[data-percentage]').each(function() {
var progress = $(this);
var percentage = Math.ceil($(this).attr('data-percentage'));
$({
countNum: 0
}).animate({
countNum: percentage
}, {
duration: 3500,
easing: 'swing',
step: function() {
// What todo on every count
var pct = '';
if (percentage == 0) {
pct = Math.floor(this.countNum) + '%';
} else {
pct = Math.floor(this.countNum + 1) + '%';
}
progress.text(pct) && progress.siblings().children().css('width', pct);
}
});
});
IsViewed = true;
}
});
您一次使用了所有进度条,您需要一个一个地处理它们并且您处理的每个进度条都添加一个 class 到它不再处理它
function isScrolledIntoView(elem) {
var docViewTop = $(window).scrollTop();
var docViewBottom = docViewTop + $(window).height();
var elemTop = $(elem).offset().top;
var elemBottom = elemTop + $(elem).height();
return ((elemBottom <= docViewBottom) && (elemTop >= docViewTop));
}
var IsViewed = false;
$(document).scroll(function() {
$('.bar-percentage[data-percentage]:not(.viewed)').each(function() {
var progress = $(this);
if (isScrolledIntoView(progress.parent('.progress-bar'))) {
var percentage = Math.ceil($(this).attr('data-percentage'));
progress.addClass('viewed');
$({
countNum: 0
}).animate({
countNum: percentage
}, {
duration: 3500,
easing: 'swing',
step: function() {
// What todo on every count
var pct = '';
if (percentage == 0) {
pct = Math.floor(this.countNum) + '%';
} else {
pct = Math.floor(this.countNum + 1) + '%';
}
progress.text(pct) && progress.siblings().children().css('width', pct);
}
});
}
});
IsViewed = true;
});
h2 {
margin-bottom: 400px;
}
.progress-bar {
position: relative;
margin: 0 auto 2.0rem;
height: 5.0rem;
font-size: 0.8em;
color: #000;
}
.progress-bar:last-child {
margin-bottom: 0;
}
.bar-label {
font-size: 12px;
color: #000;
text-transform: none;
text-align: left;
font-weight: 600;
margin-bottom: 1.5rem;
}
.bar-percentage {
margin: 0 auto;
font-size: 1.0rem;
position: absolute;
top: 0.4rem;
right: 0;
}
.bar-container {
height: 1px;
width: 100%;
overflow: hidden;
background: #EFEFEF;
}
.progress-bar.thick-bar .bar-container,
.progress-bar.thick-bar .bar {
height: 1.0rem;
}
.bar {
float: left;
background: #000;
height: 1px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<h2>
Scroll down
</h2>
<div class="progress-bar">
<div class="bar-label">Web Design</div>
<div class="bar-percentage" data-percentage="95"></div>
<div class="bar-container">
<div class="bar"></div>
</div>
</div>
<div class="progress-bar">
<div class="bar-label">Web Design</div>
<div class="bar-percentage" data-percentage="95"></div>
<div class="bar-container">
<div class="bar"></div>
</div>
</div>
<div class="progress-bar">
<div class="bar-label">Web Design</div>
<div class="bar-percentage" data-percentage="95"></div>
<div class="bar-container">
<div class="bar"></div>
</div>
</div>
<div class="progress-bar">
<div class="bar-label">Web Design</div>
<div class="bar-percentage" data-percentage="95"></div>
<div class="bar-container">
<div class="bar"></div>
</div>
</div>
<h2>
Scroll down
</h2>
<div class="progress-bar">
<div class="bar-label">Web Design</div>
<div class="bar-percentage" data-percentage="95"></div>
<div class="bar-container">
<div class="bar"></div>
</div>
</div>
<div class="progress-bar">
<div class="bar-label">Web Design</div>
<div class="bar-percentage" data-percentage="95"></div>
<div class="bar-container">
<div class="bar"></div>
</div>
</div>
<div class="progress-bar">
<div class="bar-label">Web Design</div>
<div class="bar-percentage" data-percentage="95"></div>
<div class="bar-container">
<div class="bar"></div>
</div>
</div>
<div class="progress-bar">
<div class="bar-label">Web Design</div>
<div class="bar-percentage" data-percentage="95"></div>
<div class="bar-container">
<div class="bar"></div>
</div>
</div>