JQuery:当元素在视图中时触发动作
Posted
技术标签:
【中文标题】JQuery:当元素在视图中时触发动作【英文标题】:JQuery: fire action when element is in view 【发布时间】:2014-06-06 23:27:56 【问题描述】:在我网站的页脚中,我使用 counUp.js(链接:http://inorganik.github.io/countUp.js/)计算三个数字。我在网站底部添加了这段代码:
<script type="text/javascript">
var c1 = new countUp("upnum1", 1, 27, 0, 4);
var c2 = new countUp("upnum2", 1, 10, 0, 4);
var c3 = new countUp("upnum3", 1, 27, 0, 4);
var c4 = new countUp("upnum4", 1, 1000, 0, 4);
window.onload = function()
c1.start();
c2.start();
c3.start();
c4.start();
</script>
这很好用,但当然会在页面加载后开始计数。当数字的包含 div 处于“视图中”而不是加载页面时,我如何设法触发此效果?尝试了几个 jQuery 的东西,但找不到一个可行的解决方案......谢谢!
【问题讨论】:
【参考方案1】:有一个简单的检查来查看元素是否在视口中。
您可以选择使用插件或纯 JQuery。
相关html:
<div id="inViewport">Is this in the viewport?</div>
纯 JQuery :
这里是这个的小提琴: http://jsfiddle.net/zWtkc/1/
$.fn.isOnScreen = function()
var win = $(window);
var viewport =
top : win.scrollTop(),
left : win.scrollLeft()
;
viewport.right = viewport.left + win.width();
viewport.bottom = viewport.top + win.height();
var bounds = this.offset();
bounds.right = bounds.left + this.outerWidth();
bounds.bottom = bounds.top + this.outerHeight();
return (!(viewport.right < bounds.left || viewport.left > bounds.right || viewport.bottom < bounds.top || viewport.top > bounds.bottom));
;
$(document).ready(function()
$(window).scroll(function()
if ($('#inViewport').isOnScreen())
// The element is visible, do something
alert("in viewport!");
else
// The element is NOT visible, do something else
);
);
插件:
你可以使用这个插件:https://github.com/teamdf/jquery-visible/
$(document).ready(function()
if ($('#inViewport').visible(true))
// The element is visible, do something
else
// The element is NOT visible, do something else
);
或者您可以使用这个插件:http://www.appelsiini.net/projects/viewport,它允许视口选择器,您的代码将如下所示:
$('#inViewport:in-viewport').doSomething();
【讨论】:
是的,但如果我做对了,它会检查元素是否在页面加载时可见,而不是向下滚动到它时。 我需要类似的东西:滚动后,检查#div是否可见,如果是的话:countUp,如果不是,什么也不做。 @MarcL 用纯 JQuery 更新了我的答案。$(document).ready(function()...
这只是确保页面上的所有元素在尝试执行代码之前都已完全加载。否则,您可能会收到错误,具体取决于您的脚本在 HTML 中的位置
非常感谢!要看看这个解决方案并尝试嵌入它:-)
应该不会太难吧! gl【参考方案2】:
这就是我使用这个插件的方式:https://github.com/protonet/jquery.inview
var options =
useEasing : true,
useGrouping : true,
separator : ',',
decimal : '.',
prefix : '',
suffix : ''
;
var c1 = new CountUp("a1", 0, 1000, 0, 5, options);
var c2 = new CountUp("a2", 0, 1000, 0, 5, options);
var c3 = new CountUp("a3", 0, 1000, 0, 5, options);
var c4 = new CountUp("a4", 0, 1000, 0, 5, options);
var c5 = new CountUp("a5", 0, 1000, 0, 5, options);
var c6 = new CountUp("a6", 0, 1000, 0, 5, options);
$('#counters').one('inview', function(event, isInView)
c1.start();
c2.start();
c3.start();
c4.start();
c5.start();
c6.start();
);
【讨论】:
【参考方案3】:这是我在元素开始进入视口时运行函数的代码。
您可以通过单击jfiddle 查看正在运行的代码
var counterTeaserL = $('.go-counterTeaser');
var winHeight = $(window).height();
if (counterTeaserL.length)
var firEvent = false,
objectPosTop = $('.go-counterTeaser').offset().top;
//when element shows at bottom
var elementViewInBottom = objectPosTop - winHeight;
$(window).on('scroll', function()
var currentPosition = $(document).scrollTop();
//when element position starting in viewport
if (currentPosition > elementViewInBottom && firEvent === false)
firEvent = true;
animationCounter();
);
//counter function will animate by using external js also add seprator "."
function animationCounter()
$('.numberBlock h2').each(function ()
var comma_separator_number_step = $.animateNumber.numberStepFactories.separator('.');
var counterValv = $(this).text();
$(this).animateNumber(
number: counterValv,
numberStep: comma_separator_number_step
);
);
https://jsfiddle.net/uosahmed/frLoxm34/9/
【讨论】:
我认为这比公认的答案更好,因为每次滚动时它都不会“做某事”以上是关于JQuery:当元素在视图中时触发动作的主要内容,如果未能解决你的问题,请参考以下文章