如何使用 jQuery 让元素滚动到视图中?

IT技术 javascript jquery
2021-02-28 23:36:36

我有一个 HTML 文档,其中包含使用<ul><li><img.... 浏览器窗口具有垂直和水平滚动。

问题: 当我单击图像时<img>,如何让整个文档滚动到我刚刚单击的图像所在的位置top:20px; left:20px

我在这里浏览过类似的帖子……尽管我对 JavaScript 很陌生,并且想了解我自己是如何实现这一点的。

6个回答

有一个名为 的 DOM 方法scrollIntoView,所有主要浏览器都支持该方法,它将元素与视口的顶部/左侧对齐(或尽可能靠近)。

$("#myImage")[0].scrollIntoView();

在支持的浏览器上,您可以提供以下选项:

$("#myImage")[0].scrollIntoView({
    behavior: "smooth", // or "auto" or "instant"
    block: "start" // or "end"
});

或者,如果所有元素都有唯一的 ID,您可以更改对象hash属性以location支持后退/前进按钮:

$(document).delegate("img", function (e) {
    if (e.target.id)
        window.location.hash = e.target.id;
});

之后,只需将scrollTop/scrollLeft属性调整为-20:

document.body.scrollLeft -= 20;
document.body.scrollTop -= 20;
谢谢!其他 5 篇 SO 文章,您完美地完成了。我的用例是引导对话框中的一个容器,需要滚动到视图中。
2021-04-20 23:36:36
@JohnHenckel:这是不正确的,即使 IE 5.5 也scrollIntoView有布尔参数。我稍后会尝试向 caniuse.com 发送拉取请求。
2021-04-22 23:36:36
注意:使用 Chrome,我无法将<td>元素滚动到视图中,而是必须滚动它们的父元素 ( <tr>) 并且它起作用了。
2021-04-26 23:36:36
注意:$("#myImage")[0].scrollIntoView(false);将对齐窗口底部的元素。
2021-05-01 23:36:36
请注意:“平滑”行为并未得到广泛支持,scrollIntoView对于没有某种动画的用户来说可能会造成混乱的体验。
2021-05-11 23:36:36

既然你想知道它是如何工作的,我会一步一步地解释它。

首先,您要绑定一个函数作为图像的点击处理程序:

$('#someImage').click(function () {
    // Code to do scrolling happens here
});

这会将点击处理程序应用到带有id="someImage". 如果要对所有图像执行此操作,请替换'#someImage''img'.

现在是实际的滚动代码:

  1. 获取图像偏移量(相对于文档):

    var offset = $(this).offset(); // Contains .top and .left
    
  2. 减去 20topleft

    offset.left -= 20;
    offset.top -= 20;
    
  3. 现在动画的滚动顶部和滚动左CSS属性<body><html>

    $('html, body').animate({
        scrollTop: offset.top,
        scrollLeft: offset.left
    });
    
为什么要重新发明轮子?Element.scrollIntoView(): developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView
2021-04-18 23:36:36
@Serge 因为它是一个尚未在所有浏览器中实现的工作草案
2021-04-18 23:36:36
这仅适用于简单的布局。.scrollIntoView当元素嵌套在多个溢出容器中时,它不会像 W3C方法那样处理所有情况
2021-04-22 23:36:36
@JohnSmith 请仔细阅读我发布的链接,“浏览器兼容性”部分,您会看到没有浏览器不支持 scrollIntoView
2021-05-01 23:36:36
@Serge 抱歉,我没有意识到,还有 scrollIntoViewOption (这是一个不够广泛的支持)。我想这已经足够了。
2021-05-14 23:36:36

我见过的最简单的解决方案

var offset = $("#target-element").offset();
$('html, body').animate({
    scrollTop: offset.top,
    scrollLeft: offset.left
}, 1000);

教程在这里

冒着让它变得不那么简单的风险,我编辑了它以支持水平滚动。
2021-04-23 23:36:36

有一些方法可以将元素直接滚动到视图中,但是如果要滚动到元素的相对点,则必须手动进行:

在点击处理程序中,获取元素相对于文档的位置,减去20并使用window.scrollTo

var pos = $(this).offset();
var top = pos.top - 20;
var left = pos.left - 20;
window.scrollTo((left < 0 ? 0 : left), (top < 0 ? 0 : top));

看看jQuery.scrollTo插件。这是一个演示

这个插件有很多选项超出了原生 scrollIntoView为您提供的功能。例如,您可以将滚动设置为平滑,然后设置滚动完成时的回调。

您还可以查看所有标记为 "scroll" 的 JQuery 插件

在我的案例中,我在每个浏览器中获得了不同的偏移/位置,这个插件帮助我修复了它!谢谢!
2021-05-13 23:36:36