Reputation: 1417
I am trying to get a data attribute of each div with class .section which has reached/scrolled to the top. But somehow the only first div is getting identified even other ones are scrolled to the top.
Please see the example below.
var distance = $('.section').offset().top;
$(window).scroll(function() {
if ( $(this).scrollTop() >= distance ) {
console.log($('.section').data("action"));
}
});
.section {height:600px;border-top:solid 1px black}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="section" data-action="one"> </div>
<div class="section" data-action="two"> </div>
<div class="section" data-action="three"> </div>
<div class="section" data-action="four"> </div>
<div class="section" data-action="five"> </div>
Upvotes: 1
Views: 52
Reputation: 27051
Is this what you want? or maybe it can guide you to make it:
$(window).scroll(function() {
$('.section').each(function() {
var action = $(this).attr('data-action');
if ($(this).isInViewport()) {
console.log(action)
}
});
});
$.fn.isInViewport = function() {
var elementTop = $(this).offset().top;
var elementBottom = elementTop + $(this).outerHeight();
var viewportTop = $(window).scrollTop();
var viewportBottom = viewportTop + $(window).height();
return elementBottom > viewportTop && elementTop < viewportBottom;
};
Ref to code
Demo
var distance = $('.section').offset().top;
$(window).scroll(function() {
$('.section').each(function() {
var action = $(this).attr('data-action');
if ($(this).isInViewport()) {
if ($(this).attr("data-view") == "false") {
console.log(action);
$(this).attr("data-view", true)
}
} else {
$(this).attr("data-view", false);
}
});
});
$.fn.isInViewport = function() {
var elementTop = $(this).offset().top;
var elementBottom = elementTop + $(this).outerHeight();
var viewportTop = $(window).scrollTop();
var viewportBottom = viewportTop + $(window).height();
return elementBottom > viewportTop && elementTop < viewportBottom;
};
.section {
height: 600px;
border-top: solid 1px black
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="section" data-action="one"> </div>
<div class="section" data-action="two"> </div>
<div class="section" data-action="three"> </div>
<div class="section" data-action="four"> </div>
<div class="section" data-action="five"> </div>
Upvotes: 1
Reputation: 47
var distance = $('.section').offset().top;
$(window).scroll(function() {
if ( $(this).scrollTop() >= distance ) {
console.log($('.section')); // This returns an array of multiple divs. You need to iterate through it for getting the desired output.
console.log($('.section').data("action"));
}
});
.section {height:600px;border-top:solid 1px black}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="section" data-action="one"> </div>
<div class="section" data-action="two"> </div>
<div class="section" data-action="three"> </div>
<div class="section" data-action="four"> </div>
<div class="section" data-action="five"> </div>
Upvotes: 0