我已经知道了jQuery插件ScrollTo,但到目前为止我还没有找到任何方法来实现以下内容:
用户访问我的网站(通过输入,而不是点击我页面上的链接)domain.com/bla.php#foo
并且锚“#foo”存在。现在我希望用户的浏览器不会自动滚动到“#foo”,而是我想要平滑滚动,以便元素'#foo'位于视图的中间而不是在绝对的顶部位置用户查看。
到目前为止感谢!
答案 0 :(得分:22)
如果您不创建实际的锚点foo
,而是创建一个ID为_foo
的锚点(类似<a id="_foo">
)。您可以处理$(document).ready
来实现此目的。
像(伪代码)
之类的东西$(document).ready(function() {
var elem = $('#_' + window.location.hash.replace('#', ''));
if(elem) {
$.scrollTo(elem.left, elem.top);
}
});
答案 1 :(得分:6)
我对Jan Jongboom的脚本做了一些改进,现在它看起来像这样:
$(document).ready(function () {
// replace # with #_ in all links containing #
$('a[href*=#]').each(function () {
$(this).attr('href', $(this).attr('href').replace('#', '#_'));
});
// scrollTo if #_ found
hashname = window.location.hash.replace('#_', '');
// find element to scroll to (<a name=""> or anything with particular id)
elem = $('a[name="' + hashname + '"],#' + hashname);
if(elem) {
$(document).scrollTo(elem, 800);
}
});
它会更改链接中的所有锚点,因此对于没有javascript的用户,行为将保持不变。
答案 2 :(得分:1)
Machineghost的回答非常有帮助。我一起修补的代码采用了一个URL参数,并将其转换为一个哈希标记,浏览器会在DOM准备好后立即滚动到该标记。
网址如下所示:
www.mysite.com/hello/world.htm?page=contact
联系人是您要滚动到的ID的名称
<h1 id="contact">Contact Us</h1>
以下是代码:
// Get any params from the URL
$.extend({
getUrlVars: function(){
var vars = [], hash;
var url = decodeURIComponent(window.location.href);
var hashes = url.slice(window.location.href.indexOf('?') + 1).split('&');
for(var i = 0; i < hashes.length; i++)
{
hash = hashes[i].split('=');
vars.push(hash[0]);
vars[hash[0]] = hash[1];
}
return vars;
},
getUrlVar: function(name){
return $.getUrlVars()[name];
}
});
$(document).ready(function() {
// Unhide the main content area
$('section.centered').fadeIn('slow');
// Create a var out of the URL param that we can scroll to
var page = $.getUrlVar('page');
var scrollElement = '#' + page;
// Scroll down to the newly specified anchor point
var destination = $(scrollElement).offset().top;
$("html:not(:animated),body:not(:animated)").animate({ scrollTop: destination-75}, 800 );
return false;
});
我在Chrome和FF中检查过它,效果非常好。如果滚动目标没有到达您想要的确切位置,请尝试调整“destination-75”。
我无法完成上述帖子,谢谢!
答案 3 :(得分:1)
/* scrolling to element */
var headerHeight = $('#header').height() + $('#header-bottom-cap').height() + 10; //When the header position is fixed
$('a').click(function(){
var hashEle = $(this).attr('href').split('#');
if (hashEle.length > 1) {
if (hashEle[1] == 'top') {
$('body, html').animate({
scrollTop: 0
},500);
} else {
jQuery('body, html').animate({
scrollTop: $('#'+ hashEle[1]).offset().top - headerHeight
},500);
}
};
})
// find element from url
hashname = window.location.hash.replace('#', '');
elem = $('#' + hashname);
if(hashname.length > 1) {
if(hashname == 'top') {
$('body, html').animate({
scrollTop: 0
},200);
} else {
$('body, html').animate({
scrollTop: $(elem).offset().top - headerHeight
},500);
}
};
/* END scrolling to element */
这个脚本应该是$(document).ready(function(){});
答案 4 :(得分:0)
您仍然可以使用ScrollTo。您可能希望在其中没有锚点的情况下呈现页面,然后使用在加载页面时运行的JavaScript以从URL获取锚点。然后,您可以使用该文本滚动到特定ID。
不确定如何将项目放在页面中间,但您可以为滚动指定偏移量。
答案 5 :(得分:0)
我不想说这是不可能的,但......它至少会非常具有挑战性。浏览器(或至少我知道的所有浏览器)在页面的一部分加载时立即滚动到锚点; AFAIK没有基于Javascript的方法来避免这种情况(你需要一个浏览器插件或其他东西)。
但是,我认为您可以使用“在页面完全加载之前不显示页面”的变体来获取您想要的行为。换句话说,你会:
隐藏所有页面的内容(例如,有一个包装整个页面的DIV,并在其上放置“display:none”样式)
将“onLoad”事件处理程序附加到取消隐藏DIV的页面,然后......
在同一个“onLoad”事件处理程序中,使用标准的JS滚动机制(ie.ScrollTo)滚动到锚点(我想你可以通过检查窗口来确定要滚动到哪个锚点。位置)
理论上,因为浏览器会在#1和#2之间进行浏览器滚动(因为无处可滚动,内容被隐藏,所有内容,我想它根本不会做任何事情),你在#3中使用的滚动机制不应该有任何干扰。
话虽如此,以上所有内容都是完全未经测试的计划;你的里程我的变化。即使它确实有效,但实施起来也很痛苦,所以除非你真的想要这种行为,否则几乎肯定不值得这么做。
答案 6 :(得分:0)
尝试使用此代码,仅使用jQuery即可完美地为我工作。
$(document).ready(function() {
var target = window.location.hash;
var offset = 85; // You can change this value as per your need.
if ($(target).length > 0) {
$('html, body').animate({
scrollTop: $(target).offset().top - offset
}, 1000);
} else {
console.warn('Element ' + target + ' does not exist');
}
});
答案 7 :(得分:0)
if(window.location.hash) {
var hash = window.location.hash;
$('html, body').animate({
scrollTop: $(hash).offset().top
}, 1500, 'swing');
}
这对我来说很好。
答案 8 :(得分:-1)
那是不可能的
修改强>
行为完全掌握在UA手中。