jQuery 平滑滚动
jQuery smooth scroll
我有点为难。我一直在寻找一种在 div 中平滑滚动的方法,并找到了这个 fiddle:
http://jsfiddle.net/Vk7gB/187/
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script type="text/javascript" src="http://trevordavis.net/play/jquery-one-page-nav/jquery.scrollTo.js"></script>
<script type="text/javascript" src="http://trevordavis.net/play/jquery-one-page-nav/jquery.nav.min.js"></script>
<script type="text/javascript" src="http://mottie.github.io/Keyboard/js/jquery.mousewheel.js"></script>
<script type="text/javascript" src="scroll.js"></script>
问题是,虽然它在 jsfiddle 站点上运行良好,但当我完全相同地复制它时,没有任何更改,它会因某种原因停止工作。
我已经对所有外部脚本进行了三重检查,但还是找不到问题所在。
这是完全相同的代码,直接从 fiddle 复制,但它不起作用。
http://www.zero-blade.com/work/test2/
如果有人能指出正确的方向,我将不胜感激。
您在代码中引用了 DOM 个元素,但它们尚未准备就绪。将所有 <script>
标签放在关闭 </body>
标签之前。
fiddle中的JavaScript配置为在DOM就绪时执行。您站点 (scroll.js) 中的 JavaScript 在 DOM 元素存在之前被插入并在文档的头部执行,因此没有发生任何绑定。
你所有的 JavaScript 都应该在正文的末尾,将 scroll.js 移到正文的末尾将解决问题。
如果你不能将link移动到scroll.js,你可以使用jQuery在scroll.js中的document.ready()来触发在 DOM 准备好后进行绑定,如下所示:
scroll.js
var $current, flag = false;
$(function() {
// This code will be executed when the DOM is ready.
// This is a short version of $(document).ready(){...}
$('#nav').onePageNav();
$('body').mousewheel(function(event, delta) {
if (flag) { return false; }
$current = $('div.current');
if (delta > 0) {
$prev = $current.prev();
if ($prev.length) {
flag = true;
$('body').scrollTo($prev, 1000, {
onAfter : function(){
flag = false;
}
});
$current.removeClass('current');
$prev.addClass('current');
}
} else {
$next = $current.next();
if ($next.length) {
flag = true;
$('body').scrollTo($next, 1000, {
onAfter : function(){
flag = false;
}
});
$current.removeClass('current');
$next.addClass('current');
}
}
event.preventDefault();
});
});
因为在 jsFiddle 中,代码在 DOMReady
事件中运行(请查看 fiddle[=17= 中 jQuery 版本下的下拉列表]).
将所有代码封装在里面
$(function(){
// you code here
});
我有点为难。我一直在寻找一种在 div 中平滑滚动的方法,并找到了这个 fiddle:
http://jsfiddle.net/Vk7gB/187/
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script type="text/javascript" src="http://trevordavis.net/play/jquery-one-page-nav/jquery.scrollTo.js"></script>
<script type="text/javascript" src="http://trevordavis.net/play/jquery-one-page-nav/jquery.nav.min.js"></script>
<script type="text/javascript" src="http://mottie.github.io/Keyboard/js/jquery.mousewheel.js"></script>
<script type="text/javascript" src="scroll.js"></script>
问题是,虽然它在 jsfiddle 站点上运行良好,但当我完全相同地复制它时,没有任何更改,它会因某种原因停止工作。
我已经对所有外部脚本进行了三重检查,但还是找不到问题所在。
这是完全相同的代码,直接从 fiddle 复制,但它不起作用。
http://www.zero-blade.com/work/test2/
如果有人能指出正确的方向,我将不胜感激。
您在代码中引用了 DOM 个元素,但它们尚未准备就绪。将所有 <script>
标签放在关闭 </body>
标签之前。
fiddle中的JavaScript配置为在DOM就绪时执行。您站点 (scroll.js) 中的 JavaScript 在 DOM 元素存在之前被插入并在文档的头部执行,因此没有发生任何绑定。
你所有的 JavaScript 都应该在正文的末尾,将 scroll.js 移到正文的末尾将解决问题。
如果你不能将link移动到scroll.js,你可以使用jQuery在scroll.js中的document.ready()来触发在 DOM 准备好后进行绑定,如下所示:
scroll.js
var $current, flag = false;
$(function() {
// This code will be executed when the DOM is ready.
// This is a short version of $(document).ready(){...}
$('#nav').onePageNav();
$('body').mousewheel(function(event, delta) {
if (flag) { return false; }
$current = $('div.current');
if (delta > 0) {
$prev = $current.prev();
if ($prev.length) {
flag = true;
$('body').scrollTo($prev, 1000, {
onAfter : function(){
flag = false;
}
});
$current.removeClass('current');
$prev.addClass('current');
}
} else {
$next = $current.next();
if ($next.length) {
flag = true;
$('body').scrollTo($next, 1000, {
onAfter : function(){
flag = false;
}
});
$current.removeClass('current');
$next.addClass('current');
}
}
event.preventDefault();
});
});
因为在 jsFiddle 中,代码在 DOMReady
事件中运行(请查看 fiddle[=17= 中 jQuery 版本下的下拉列表]).
将所有代码封装在里面
$(function(){
// you code here
});