url不变的锚点定位

394 阅读1分钟

刚刚吃的有点饱,感觉链接上加个 hash 有点丑,就想着去掉。其实这个已经不属于锚点定位。

查了一会文档,发现这个(element.scrollIntoView())属性可以替换锚点来跳转。 关于 scrollIntoView 具体用法,可以参考这里 scrollIntoView查看快速入口

于是我将 a 元素 href属性去掉,添加onClick事件,事件方法如下:

    function changeHash(hash) {
        document.querySelector(hash).scrollIntoView(true);
    }

这个时候问题来了,:target属性解决的锚点偏移问题又回来了。

问题来了,就得继续解决了。

可以在点击后滚动到目标元素位置。

问题又来了,怎么获取到目标元素的位置呢?

由于我这里定位父级不是 body,offsetTop 是不可以的。 我找到 Element.getBoundingClientRect(),getBoundingClientRect快捷参考点击这里多说无益,直接上代码。

    function changeHash(hash) {
        document.querySelector(hash).scollIntoView(ture);
        let scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;
        document.documentElement.scrollTop = document.body.scrollTop = document.querySelector(hash).getBoundingClientRect().top + scrollTop - 70; // 我的页面有个固定定位的nav为70px
    }

到这里就结束了,希望对各位小伙伴有点帮助。