默认情况下,如果我的网站中有锚点,那么当我点击链接(即www.mysite.com/#anchor)时,地址栏上的URL就会改变
滚动到锚点时,是否可以立即更改地址栏中的URL?或者当我点击一个新锚点时,有一个包含多个锚点的长文档和地址栏上的URL更改?
答案 0 :(得分:33)
尝试使用此jquery插件:Scrollorama。它有很多很酷的功能,您可以使用window.location.hash
更新浏览器哈希。
或者,您可以添加“滚动”事件以检查何时到达锚点。
这是一个说明事件的工作小提琴:http://jsfiddle.net/gugahoi/2ZjWP/8/ 例如:
$(function () {
var currentHash = "#initial_hash"
$(document).scroll(function () {
$('.anchor_tags').each(function () {
var top = window.pageYOffset;
var distance = top - $(this).offset().top;
var hash = $(this).attr('href');
// 30 is an arbitrary padding choice,
// if you want a precise check then use distance===0
if (distance < 30 && distance > -30 && currentHash != hash) {
window.location.hash = (hash);
currentHash = hash;
}
});
});
});
答案 1 :(得分:3)
您可以使用HTML 5 pushstate更改地址栏中的URL
window.history.pushstate
答案 2 :(得分:3)
答案 3 :(得分:2)
您可以绑定到jQuery滚动事件(http://api.jquery.com/scroll/),并在每次调用回调时,通过检查此值来检查用户滚动文档的距离:.scrollTop(http://api.jquery.com/scrollTop/ )并通过操纵te location.hash对象(http://www.w3schools.com/jsref/prop_loc_hash.asp)来设置锚点。
这将是这样的:
// Checks if the passed element is visible on the screen after scrolling
// source: http://stackoverflow.com/questions/487073/check-if-element-is-visible-after-scrolling
function isScrolledIntoView(elem) {
var docViewTop = $(window).scrollTop();
var docViewBottom = docViewTop + $(window).height();
var elemTop = $(elem).offset().top;
var elemBottom = elemTop + $(elem).height();
return ((elemBottom <= docViewBottom) && (elemTop >= docViewTop));
}
$('#document').scroll(function(e) {
var anchors = $('.anchor');
for (var i = 0; i < anchors.length; ++i) {
if (isScrolledIntoView(anchors[i])){
var href = $(anchors[i]).attr('href');
location.hash = href.slice(href.indexOf('#') + 1);
break;
}
}
});
如果您在选择锚点后对其进行排序,则可以更精确,以便始终设置第一个可见锚点。
答案 4 :(得分:1)
我认为你需要做这样的事情。没有尝试过行动
var myElements = $("div.anchor"); // You target anchors
$(window).scroll(function(e) {
var scrollTop = $(window).scrollTop();
myElements.each(function(el,i) {
if ($(this).offset().top > scrollTop && $(myElements[i+1]).offset().top < scrollTop) {
location.hash = this.id;
}
});
});`
答案 5 :(得分:0)
普通js版本 在研究如何根据屏幕上HTML部分元素的位置更新URL时,我一直在寻找该线程,因此我希望这是发布此线程的好地方。
此函数循环遍历HTML部分元素。
function updateFragId() {
var len = sections.length;
for (var i = 0; i < len; i++) {
var id = sections[i].id;
收集相对于视口的Y滚动位置。
var rect = sections[i].getBoundingClientRect().y;
将两个数组转换为对象
var pageData = {id:id, rect:rect};
设置代码在其间触发的范围。当section元素的顶部在-200px到400px之间时,它将触发
if (pageData.rect > -200 && pageData.rect < 400) {
仅通过确保pageData.id和location.hash不匹配来运行一次。这样可以阻止浏览器充斥事件。
if (pageData.rect > -100 && pageData.rect < 100) {
if (pageData.id !== location.hash.substr(1)) {
fragmentId = pageData.id;
setActiveLink(fragmentId);
} else {
return;
}
}
}
}
window.addEventListener('scroll', updateFragId);
我在此代码块上使用一个去抖动器,然后在另一个代码块上设置活动链接。但这只是跟踪#个锚点的方法。