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

IT技术 javascript jquery
2021-03-04 21:45:13

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

当我滚动到锚点时,是否可以立即更改地址栏中的 URL?或者当我点击一个新的锚点时,有一个带有多个锚点的长文档并且地址栏上的 url 会发生变化?

6个回答

尝试使用这个 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;
            }
        });
    });
});
惊人!在我的项目中使用这个的分叉版本。但是,我们意识到每次更改哈希值时,使用它都会导致“滚动跳转”。因此,我们使用 historyAPI 来解决我们的问题。if(history.pushState) { history.pushState(null, null, "#"+hash); } else { window.location.hash = '#myhash'; }
2021-05-16 21:45:13
您应该在答案中包含重要部分;链接在互联网上有一个坏习惯(是的,我知道链接腐烂是 Tim BL 的一个恼人的问题)。
2021-05-18 21:45:13
location.hash 更方便
2021-05-19 21:45:13
  1. 将处理程序绑定到jquery 滚动事件
  2. 使用此 jquery 脚本检查锚点当前是否在屏幕上可见
  3. 使用 pushstate 或 set location(可能会导致跳转)

您可以绑定到 jQuery 滚动事件 ( http://api.jquery.com/scroll/ ) 并在每次调用回调时,通过检查以下值来检查用户在文档上滚动的距离: .scrollTop ( http ://api.jquery.com/scrollTop/)并通过操作 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;
    }
  }
});

如果在选择锚点后对锚点进行排序,则可以更精确,以便始终设置第一个可见锚点。

当然。这是一个示例:jsfiddle.net/7d5qU/10它应该可以工作,但我无法证明它,因为 jsfiddle 隐藏了内部 url ......
2021-05-13 21:45:13
嗨乔治,感谢分享这个。您能否发布一个适用于上述代码的示例 html 标记?
2021-05-16 21:45:13

纯 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);

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

本网站上的纯代码答案通常不受欢迎。您能否编辑您的答案以包含对您的代码的一些评论或解释?解释应该回答这样的问题:它是做什么的?它是如何做到的?它去哪里?它如何解决OP的问题?
2021-05-04 21:45:13
感谢您的反馈。更新。
2021-05-13 21:45:13