手记

回到页面指定位置的三种方式

以前大部分时间都是在做b端相关的项目,在实现此类需求时, 通常都是直接借助a标签搞定,现在做c端了,对交互性的要求一下就提升了,此时a标签就远远不能满足要求了,需要借助js来实现此类需求,特此记录。

a 标签

首先放出html

<body>
    <contain class="test1">
        <a name="topAnchor"></a>
        <div id="top">我是顶部</div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
    </contain>
    <footer>
        <button id="backTop1">第一种方式回到顶部</button>
        <button id="backTop2">第二种方式回到顶部</button>
        <button id="backTop3">第三种方式回到顶部</button>
    </footer></body>复制代码

然后具体操作步骤如下

  1. 将a标签放到指定元素的附近

  2. 然后通过点击事件生成 a 标签

  3. 触发a标签事件

  4. 删除a标签

代码如下

    const backTop1 = document.getElementById("backTop1")

    backTop1.addEventListener("click", function (e) {        let a = document.createElement("a")
        a.href = "#topAnchor"
        e.target.appendChild(a)
        a.onclick = function (e) {
            e.stopPropagation()
        }
        a.click()
        e.target.removeChild(a)
    })复制代码

效果如下图所示

效果很明显,在事件触发之后,页面立马跑到的顶部,在交互性没啥要求的时候,这种做法确实没啥问题,不过要求高了之后就不行了,会显得有些突兀。 经大佬提示,可以在style中设置 html, body { scroll-behavior:smooth; },可以达到和下面两个api的behavior 参数为 smooth 的效果是一样的

scrollTo()

此 api 需要传递 DOM元素相对于window的 left 和 top 的距离,此例子仅展示简单demo,只考虑 top 坐标
当然它还有一个 behavior 参数将其设置为 smooth 后,将会出现滑动效果 步骤如下:

  1. 计算目标元素距离顶部的距离

  2. 通过事件触发

代码如下:

    const backTop2 = document.getElementById("backTop2")    const TOP = document.getElementById("top")    const y = TOP.offsetTop    const backTop3 = document.getElementById("backTop3")
    backTop3.addEventListener("click", function (e) {        window.scrollTo({ top: y, left: 0, behavior: 'smooth' })
    })复制代码

效果如下图所示

从效果上来看,相较于a标签,该api支持动画,使得页面更丝滑 不过它对iframe的支持度不够,在我所遇到的项目中iframe的占比还不小,还请谨慎使用

Element.scrollIntoView()

该 api 相较于上一个,节点信息更加的明确,操作方法也更加的简洁,更利于后续的维护
代码如下

    const backTop2 = document.getElementById("backTop2")    const TOP = document.getElementById("top")
    backTop2.addEventListener("click", function (e) {
        TOP.scrollIntoView({ behavior: "smooth" })
    })复制代码

效果如下图所示

从效果上来看,该api和scrollTo的作用是一致的,但是从代码结构上来说,scrollIntoView会更加的简洁且在iframe中表现也很优秀,基本上被用到的频率更高


作者:pengpeng


0人推荐
随时随地看视频
慕课网APP