2017-07-13 53 views
0

任何人都可以提供一些建议吗?我有以下代码来检测物品何时位于视口中,不幸的是,第一个.each循环(不是由滚动触发的)会为每个物品返回可见,这是为什么?在视口中可见,正在加载的所有内容都可见

window.onload = function(){ 

    $.fn.visible = function(detectPartial){ 
    detectPartial = (!!detectPartial); // if null or undefined, default to false 

    var viewport = $(window), 
     vpWidth = viewport.width(), 
     vpHeight = viewport.height(), 
     vpTop = viewport.scrollTop(), 
     vpBottom = vpTop + vpHeight, 
     vpLeft = viewport.scrollLeft(), 
     vpRight = vpLeft + vpWidth, 

     elementOffset = $(this).offset(), 
     elementTopArea = elementOffset.top+((detectPartial) ? $(this).height() : 0), 
     elementBottomArea = elementOffset.top+((detectPartial) ? 0 : $(this).height()), 
     elementLeftArea = elementOffset.left+((detectPartial) ? $(this).width() : 0), 
     elementRightArea = elementOffset.left+((detectPartial) ? 0 : $(this).width()); 

     return ((elementBottomArea <= vpBottom) && (elementTopArea >= vpTop)) && ((elementRightArea <= vpRight) && (elementLeftArea >= vpLeft)); 
    } 

    $('.portfolio-image-box').each(function(i, el){ 
    var el = $(el); 
    if (el.visible(true)) { 
     el.addClass("in") 
    } else{ 
     el.addClass("out") 
    } 
    }) 

    $(document).scroll(function() { 
    $('.portfolio-image-box').each(function(i, el){ 
     var el = $(el); 
     if (el.visible(true)) { 
      el.removeClass("out") 
      el.addClass("in") 
     } else{ 
      el.removeClass("in") 
      el.addClass("out") 
     } 
    }) 
    }) 

} 
+0

你能给我们一些HTML或小提琴的我们来测试代码? –

+0

https://jsfiddle.net/dancinwolfe/7fydgdL3/4/我认为这是正确的,不得不把混乱的HTML和CSS一点点,因为我使用laravel和bootstrap。 –

+0

谢谢你看它 –

回答

1

所以我稍微修改你的代码,并没有在控制台检查,以查看是否得到并移除类,和它的工作。尝试下面的代码,并在萤火虫检查,当滚动,类被添加和一切在里面在视口中取出:

$.fn.visible = function(detectPartial) { 
 
    detectPartial = (!!detectPartial); // if null or undefined, default to false 
 

 
    var viewport = $(window), 
 
    vpWidth = viewport.width(), 
 
    vpHeight = viewport.height(), 
 
    vpTop = viewport.scrollTop() + $('#navbar').outerHeight(), 
 
    vpBottom = vpTop + vpHeight, 
 
    vpLeft = viewport.scrollLeft(), 
 
    vpRight = vpLeft + vpWidth, 
 

 
    elementOffset = $(this).offset(), 
 
    elementTopArea = elementOffset.top + ((detectPartial) ? $(this).height() : 0), 
 
    elementBottomArea = elementOffset.top + ((detectPartial) ? 0 : $(this).height()), 
 
    elementLeftArea = elementOffset.left + ((detectPartial) ? $(this).width() : 0), 
 
    elementRightArea = elementOffset.left + ((detectPartial) ? 0 : $(this).width()); 
 

 
    return ((elementBottomArea <= vpBottom) && (elementTopArea >= vpTop)) && ((elementRightArea <= vpRight) && (elementLeftArea >= vpLeft)); 
 
} 
 

 
$(document).ready(function() { 
 
    addInAndOut(); 
 
    $(window).scroll(function() { 
 
    addInAndOut(); 
 
    }); 
 
}); 
 

 

 
function addInAndOut() { 
 
    $('.portfolio-image-box').each(function(i, el) { 
 
    var el = $(el); 
 
    if (el.visible(true)) { 
 
     el.removeClass("out").addClass("in"); 
 
    } else { 
 
     el.removeClass("in").addClass("out"); 
 
    } 
 
    }) 
 
}
#navbar { 
 
    border-radius: 0px; 
 
    background-color: #ffffff; 
 
    border-color: #ffffff; 
 
    margin-bottom: 0; 
 
    position: fixed; 
 
    top: 0; 
 
    left: 0; 
 
    right: 0; 
 
    z-index: 1; 
 
    font-size: 1.5vh; 
 
    padding: 1.5vh; 
 
} 
 

 
#navbar .fa { 
 
    cursor: pointer; 
 
} 
 

 
body { 
 
    background-color: #fff; 
 
    padding-top: 6vh; 
 
    text-align: center; 
 
} 
 

 
.portfolio-image-box { 
 
    height: 25%; 
 
    width: 14.66vw; 
 
    margin: 1%; 
 
    background-color: #FFFFFF; 
 
    border: 1px solid #e3e3e3; 
 
    overflow: hidden; 
 
    text-align: center; 
 
    display: inline-block; 
 
    float: left; 
 
    border-radius: 0.5vh; 
 
    cursor: pointer; 
 
} 
 

 
.portfolio-image-box:hover { 
 
    transition: 0.5s; 
 
    opacity: 0.6; 
 
} 
 

 
#portfolio { 
 
    text-align: center; 
 
    background-color: #F7F7F7; 
 
} 
 

 
#portfolio-container { 
 
    margin-bottom: 1%; 
 
} 
 

 
.portfolio-image { 
 
    height: 100%; 
 
} 
 

 
#body-title { 
 
    color: #c84630; 
 
} 
 

 
.col-md-12 { 
 
    width: 100%; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="row"> 
 
    <h1 id="body-title" class="col-md-6 col-md-offset-3">Portfolio</h1> 
 
</div> 
 
<div class="col-md-6 col-md-offset-3 portfolio"> 
 
    <div class="portfolio-image-box col-md-12"> 
 
    <img class="portfolio-image" src="http://via.placeholder.com/350x150"> 
 
    </div> 
 
    <div class="portfolio-image-box col-md-12"> 
 
    <img class="portfolio-image" src="http://via.placeholder.com/350x150"> 
 
    </div> 
 
    <div class="portfolio-image-box col-md-12"> 
 
    <img class="portfolio-image" src="http://via.placeholder.com/350x150"> 
 
    </div> 
 
    <div class="portfolio-image-box col-md-12"> 
 
    <img class="portfolio-image" src="http://via.placeholder.com/350x150"> 
 
    </div> 
 
    <div class="portfolio-image-box col-md-12"> 
 
    <img class="portfolio-image" src="http://via.placeholder.com/350x150"> 
 
    </div> 
 
    <div class="portfolio-image-box col-md-12"> 
 
    <img class="portfolio-image" src="http://via.placeholder.com/350x150"> 
 
    </div> 
 
    <div class="portfolio-image-box col-md-12"> 
 
    <img class="portfolio-image" src="http://via.placeholder.com/350x150"> 
 
    </div> 
 
    <div class="portfolio-image-box col-md-12"> 
 
    <img class="portfolio-image" src="http://via.placeholder.com/350x150"> 
 
    </div> 
 
    <div class="portfolio-image-box col-md-12"> 
 
    <img class="portfolio-image" src="http://via.placeholder.com/350x150"> 
 
    </div> 
 
    <div class="portfolio-image-box col-md-12"> 
 
    <img class="portfolio-image" src="http://via.placeholder.com/350x150"> 
 
    </div> 
 
    <div class="portfolio-image-box col-md-12"> 
 
    <img class="portfolio-image" src="http://via.placeholder.com/350x150"> 
 
    </div> 
 
    <div class="portfolio-image-box col-md-12"> 
 
    <img class="portfolio-image" src="http://via.placeholder.com/350x150"> 
 
    </div> 
 
    <div class="portfolio-image-box col-md-12"> 
 
    <img class="portfolio-image" src="http://via.placeholder.com/350x150"> 
 
    </div> 
 
    <div class="portfolio-image-box col-md-12"> 
 
    <img class="portfolio-image" src="http://via.placeholder.com/350x150"> 
 
    </div> 
 
    <div class="portfolio-image-box col-md-12"> 
 
    <img class="portfolio-image" src="http://via.placeholder.com/350x150"> 
 
    </div> 
 
    <div class="portfolio-image-box col-md-12"> 
 
    <img class="portfolio-image" src="http://via.placeholder.com/350x150"> 
 
    </div> 
 
    <div class="portfolio-image-box col-md-12"> 
 
    <img class="portfolio-image" src="http://via.placeholder.com/350x150"> 
 
    </div> 
 
    <div class="portfolio-image-box col-md-12"> 
 
    <img class="portfolio-image" src="http://via.placeholder.com/350x150"> 
 
    </div> 
 
    <div class="portfolio-image-box col-md-12"> 
 
    <img class="portfolio-image" src="http://via.placeholder.com/350x150"> 
 
    </div> 
 
    <div class="portfolio-image-box col-md-12"> 
 
    <img class="portfolio-image" src="http://via.placeholder.com/350x150"> 
 
    </div> 
 
    <div class="portfolio-image-box col-md-12"> 
 
    <img class="portfolio-image" src="http://via.placeholder.com/350x150"> 
 
    </div> 
 
    <div class="portfolio-image-box col-md-12"> 
 
    <img class="portfolio-image" src="http://via.placeholder.com/350x150"> 
 
    </div> 
 
    <div class="portfolio-image-box col-md-12"> 
 
    <img class="portfolio-image" src="http://via.placeholder.com/350x150"> 
 
    </div> 
 
    <div class="portfolio-image-box col-md-12"> 
 
    <img class="portfolio-image" src="http://via.placeholder.com/350x150"> 
 
    </div> 
 
    <div class="portfolio-image-box col-md-12"> 
 
    <img class="portfolio-image" src="http://via.placeholder.com/350x150"> 
 
    </div> 
 
    <div class="portfolio-image-box col-md-12"> 
 
    <img class="portfolio-image" src="http://via.placeholder.com/350x150"> 
 
    </div> 
 
    <div class="portfolio-image-box col-md-12"> 
 
    <img class="portfolio-image" src="http://via.placeholder.com/350x150"> 
 
    </div> 
 
</div>

+0

刚刚尝试过使用Chrome开发人员工具,它仍然默认标记每个图像,然后只在滚动并且已经输入并离开视口后才更改它们。 –

+0

我点击了“运行代码片段”,只能看到一个'in',而其余所有都被标记为'out'。在滚动时,它会将新来的标记为'in',而之前的则标记为'out'。我也在Chrome上运行。 –

+0

我刚刚检查了剪切,它的工作原理,但是当我将您的答案复制到我正在开发的网站时,我仍然留下相同的问题? –