HOWTO · JavaScript
JavaScript 滚动到页面顶部
使用 JavaScript 回到网页顶部。比较立即跳转、平滑滚动、锚点链接,以及可选的 jQuery 动画。
本页内容
使用 window.scrollTo(0, 0) 将当前页面滚动到顶部。若要将此操作绑定到按钮,请添加点击事件监听器;若希望浏览器以动画方式滚动,则传入 { top: 0, behavior: "smooth" }。
使用 window.scrollTo() 返回页面顶部
此示例会创建一个按钮,并将其连接到 window.scrollTo()。请在文档 body 可用后将脚本放入页面,或使用 defer 加载脚本,以便按钮能够添加到文档中。示例中的简易回退对象让代码可以在 Node 测试夹具中运行;在浏览器中,它会使用页面实际的 document 和 window。
const inBrowser = typeof document !== "undefined" && typeof window !== "undefined";
const pageDocument = inBrowser ? document : {
body: {
append(button) {
button.click = () => button.listeners.click();
}
},
createElement() {
return {
listeners: {},
addEventListener(name, handler) {
this.listeners[name] = handler;
}
};
}
};
const pageWindow = inBrowser ? window : {
scrollTo(x, y) {
console.log(`scrollTo(${x}, ${y})`);
}
};
const button = pageDocument.createElement("button");
button.type = "button";
button.textContent = "Back to top";
pageDocument.body.append(button);
button.addEventListener("click", () => {
pageWindow.scrollTo(0, 0);
});
if (!inBrowser) button.click();
scrollTo(0, 0)
两个参数分别表示水平和垂直滚动位置。将它们都设为 0,即可返回页面左上角。若需要立即跳转,可使用这种即时滚动方式,例如在简短操作之后滚动,避免动画造成干扰。
使用 window.scrollTo() 实现平滑滚动
向 window.scrollTo() 传入选项对象,即可请求平滑滚动。此独立示例使用相同的简易 Node 回退,因此可以在浏览器之外演示点击处理程序:
const inBrowser = typeof document !== "undefined" && typeof window !== "undefined";
const pageDocument = inBrowser ? document : {
body: {
append(button) {
button.click = () => button.listeners.click();
}
},
createElement() {
return {
listeners: {},
addEventListener(name, handler) {
this.listeners[name] = handler;
}
};
}
};
const pageWindow = inBrowser ? window : {
scrollTo(options) {
console.log(`scrollTo(top: ${options.top}, behavior: ${options.behavior})`);
}
};
const button = pageDocument.createElement("button");
button.type = "button";
button.textContent = "Back to top";
pageDocument.body.append(button);
button.addEventListener("click", () => {
pageWindow.scrollTo({ top: 0, behavior: "smooth" });
});
if (!inBrowser) button.click();
scrollTo(top: 0, behavior: smooth)
top 属性用于设置垂直滚动目标,behavior: "smooth" 则请求浏览器为滚动添加动画。原生选项形式不提供时长设置。若需要指定时长,可以使用库提供的动画功能,或自行实现动画。也可以通过页面级 CSS 规则(例如 html { scroll-behavior: smooth; })让普通滚动变得平滑,但这条规则本身不会创建按钮,也不会实现返回页面顶部的操作。
使用锚点链接跳转到页面顶部
锚点是一种无需脚本的实用方案。为页面顶部添加一个 ID,例如 <header id="page-top">,然后使用 <a href="#page-top">Back to top</a> 创建指向它的链接。此示例中的链接文字仍为英文“Back to top”,因为代码保持原样。激活链接后,浏览器会导航到该片段、更新 URL 片段,并按照浏览器行为将焦点或导航移至目标位置。请确保目标在页面中只出现一次;如果固定页眉遮住了目标,可以在目标上使用 scroll-margin-top 等 CSS 属性进行调整。
使用 jQuery 滚动到页面顶部
如果页面已经加载了 jQuery,可以使用它的 animate() 方法,为文档滚动元素的 scrollTop 属性添加动画。此示例会添加一个按钮并绑定动画。在浏览器中,请先于此脚本加载 jQuery;如果缺少 jQuery,示例会抛出明确的错误。简易回退仅供 Node 测试夹具使用。
const inBrowser = typeof document !== "undefined" && typeof window !== "undefined";
if (inBrowser && typeof globalThis.jQuery !== "function") {
throw new Error("jQuery is required for this example. Load jQuery before this script.");
}
const $ = inBrowser ? globalThis.jQuery : (selector, attributes) => {
if (selector === "<button>") {
return {
...attributes,
appendTo() { return this; },
on(name, handler) { this.handler = handler; return this; }
};
}
return {
animate(properties, duration) {
console.log(`animate(scrollTop: ${properties.scrollTop}, duration: ${duration})`);
}
};
};
const button = $("<button>", {
type: "button",
text: "Back to top"
}).appendTo("body");
button.on("click", () => {
$("html, body").animate({ scrollTop: 0 }, 800);
});
if (!inBrowser) button.handler();
animate(scrollTop: 0, duration: 800)
这里的 scrollTop: 0 是滚动目标,800 是动画时长,单位为毫秒。jQuery 是可选依赖;如果页面本身不需要这个库,请使用原生方法。若要添加自定义动画或其他动态效果,请尊重访客的减少动态效果偏好。
选择合适的方法
若要通过 JavaScript 直接跳转,请使用 window.scrollTo(0, 0)。需要平滑滚动且浏览器控制的时长足够时,可选择选项形式。若希望操作像普通页面导航一样无需 JavaScript 即可使用,请采用锚点。若项目已经使用 jQuery,且其时长参数适合此交互,也可以选择 jQuery。在单页应用中,如果应用本身不会管理滚动位置,可在路由或视图切换后调用原生方法。对于普通链接或按钮,应让辅助技术能够清楚识别控件的用途,并确保键盘用户可以操作它。