手动滚动到锚点时更改URL?

时间:2013-02-02 09:42:47

标签: javascript jquery

默认情况下,如果我的网站中有锚点,那么当我点击链接(即www.mysite.com/#anchor)时,地址栏上的URL就会改变

滚动到锚点时,是否可以立即更改地址栏中的URL?或者当我点击一个新锚点时,有一个包含多个锚点的长文档和地址栏上的URL更改?

6 个答案:

答案 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


  1. https://developer.mozilla.org/en-US/docs/DOM/Manipulating_the_browser_history
  2. How can I use window.history.pushState 'safely'

答案 2 :(得分:3)

  1. 将处理程序绑定到jquery scroll event
  2. 使用this jquery script检查屏幕当前是否可见。
  3. 使用pushstate或设置位置(可能会导致跳转)

答案 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);

我在此代码块上使用一个去抖动器,然后在另一个代码块上设置活动链接。但这只是跟踪#个锚点的方法。