jQuery scroll to element
我有一个input元素:
1
| <input type="text" class="textfield" value="" id="subject" name="subject"> |
然后我还有一些其他元素,比如其他文本输入、文本区域等。
当用户单击带有#subject的input时,页面应滚动到页面的最后一个元素,并显示一个漂亮的动画。它应该是一个滚动到底部而不是顶部。
页面的最后一项是带#submit的submit按钮:
1
| <input type="submit" class="submit" id="submit" name="submit" value="Ok, Done."> |
动画不应该太快,应该是流畅的。
我正在运行最新的jquery版本。我不喜欢安装任何插件,而是使用默认的jquery功能来实现这一点。
- developer.mozilla.org /美国/文档/网络/ API /元/ zwnj scrollintov &;& # iew 8203;
假设您有一个ID为button的按钮,请尝试以下示例:
1 2 3 4 5
| $("#button").click(function() {
$([document.documentElement, document.body]).animate({
scrollTop: $("#elementtoScrollToID").offset().top
}, 2000);
}); |
我从文章中获得了代码,它可以顺利地滚动到一个没有jquery插件的元素。我已经在下面的例子中对它进行了测试。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| <html>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js">
$(document).ready(function (){
$("#click").click(function (){
$('html, body').animate({
scrollTop: $("#div1").offset().top
}, 2000);
});
});
Test
<br/>
Test 2
<button id="click">Click me</button>
</html> |
- 这在所有情况下都不起作用。请参阅stackoverflow.com/questions/2905867/&hellip;
- 您不应该将其动画化为多个元素(HTML和Body)
- @巴里查普曼不完全是。在谷歌搜索之后,我发现了这一点,所以如果您不想为每种浏览器类型都提供额外的逻辑,那么这两个标签都是必需的。
- 这个函数使我的页面在执行前反弹。若要停止此操作,请在函数"…单击(函数(e)…"上使用"e.PreventDefault();"。
- 这似乎不适用于所有iOS设备,在某些设备上,它会停止单击事件的工作,直到用户手动滚动。不知道为什么,真想不知道为什么。
- 我的元素"elementtocrolltoid"的偏移量没有顶值,那么我如何滚动到它呢?
- 如果不需要动画,而是希望立即跳转到元素,请使用.scrollTop(…)而不是.animate({scrollTop: …}, …)。
- @Roryo'Kane你能提供一个没有动画的jsFiddle吗?
- @FranciscoCorrales是一个没有动画的JS小提琴。在click处理函数中,编写$('html, body').scrollTop( $("#div2").offset().top ),它使用.offset()。
- 除了你的解决方案(很好用),你还可以添加一个on-complete函数,将hashtag添加到url中。在这种情况下,它不会滚动,因为滚动到已经滚动到了正确的位置,并且如果用户复制了URL,它将自动捕捉到页面上的正确位置。
- 只是有点进步。我认为最好通过var root=$(html,body)缓存元素$(html,body)
- 谢谢!在我的例子中,我有一个导航条添加了一个偏移量,所以如果你有这个例子,像我一样,减去导航条的高度(在我的例子中:80px):scrollTop: $("#elementtoScrollToID").offset().top - 80。
- 比javascripts的scrollto或scrollby方法要好得多。非常感谢你。
- 对于任何一个在点击这个滚动样本后可能遇到闪光灯问题的人,你可以打电话给e.preventDefault(); ,我从这里得到了这个:stackoverflow.com/questions/10614446/&hellip;
- @简尼斯你指的是什么?我通读了你链接的问题,没有看到任何关于失败的讨论。
- @亨利一世可能指的是offset().top,在任何情况下都不是滚动到所需的值。请参阅这里的claviska的评论,之后接受的答案显然已经被修改,以考虑到容器的滚动条。
- 如果在动画完成时使用回调运行,并注意到回调在此解决方案中触发了两次,请尝试使用"$('html body').animate(…"而不是"$('html,body').animate(…"逗号创建了两个动画事件。一个用于HTML,一个用于正文。你真的只想要一个HTML正文谢谢@t.j.crowder stackoverflow.com/questions/8790752/&hellip;
- 你能解释一下为什么选择html和body?这不会导致两个动画并行运行吗?每个选定元素一个?
- 实际上,如果在animate中设置了回调函数,则此代码可以工作两次。看这里:jsfiddle.net/dxj1d3x8要防止这种情况,只使用一个元素
- 如果您使用的是MaterialDesignLite,那么这个方法有一些问题
- 我添加了"返回错误"以避免打开新浏览器的选项卡。
- 您需要在函数处理程序中添加事件参数,并从事件中调用preventdefault函数以避免意外的功能@steve
- 不幸的是,此解决方案无法在移动设备(Android和iOS)上工作…你知道为什么吗?
- @Steve这很好,但是会触发两次,这意味着如果在animate()的complete函数中运行其他代码,它会执行两次。我强烈建议只进行浏览器检查并在正确的元素上运行动画。
jquery.scrollto():视图-演示,API,源代码
我编写这个轻量级插件是为了让页面/元素滚动更容易。它很灵活,可以在其中传递目标元素或指定值。也许这可能是jquery下一次正式发布的一部分,您认为呢?
实例用法:
1 2 3 4 5
| $('body').scrollTo('#target'); // Scroll screen to target element
$('body').scrollTo(500); // Scroll screen 500 pixels down
$('#scrollable').scrollTo(100); // Scroll individual element 100 pixels down |
选项:
滚动目标:表示所需滚动位置的元素、字符串或数字。
偏移量:在滚动目标上定义额外间距的数字。
持续时间:决定动画运行时间的字符串或数字。
宽松:指示用于过渡的宽松函数的字符串。
完成:动画完成后调用的函数。
- 演示在Chrome上不起作用
- 直到最近对Chrome进行了更新,它才开始工作。我现在在memoryboxweddings.com/photography-posts(如果你想试试的话)上使用一个版本。一旦修复,我会发布一个更新。
- 修正了,原来是jquery.com的一个JS文件杀死了它。如果你尝试的话,现在应该可以工作了。
- 我正在使用这个插件,它工作得很好。谢谢!插件是否有相关联的许可证?
- @蒂莫西佩雷斯:我敢肯定,这意味着一些允许商业使用的东西?我敢肯定,有很多人只想在他们的网站上的任何地方使用这段代码片段,这将帮助他们在晚上睡得更轻松一点?也许麻省理工学院的执照可以满足你的需要?en.wikipedia.org/wiki/mit_许可证
- $('body')在FF中不起作用,所以尝试了$('html,body'),但效果良好。
- 如果有人需要这个脚本源代码,那么您可以在这里得到flesler.com/jquery/scrollto/js/jquery.scrollto-min.js
- 嗨,亚瑟发布的消息来源是可以的,唯一的区别是没有偏移量选项,正确的只是偏移量。
- 我已经测试了网页上的代码,但没有成功。我必须从这里下载github.com/flesler/jquery.scrollto/blob/master/&hellip;
- @Timothyprez似乎您的代码有问题,我们(Mozilla)希望看到解决方案。如果你能帮忙的话那就太酷了。github.com/webcompt/web-bugs/issues/1574
- @Alexrindone这个演示在chrome demos.flesler.com/jquery/scrollto站点中工作,旧的演示现在不工作。
如果您对平滑滚动效果不太感兴趣,只对滚动到某个特定元素感兴趣,那么就不需要使用jquery函数。Javascript为您提供了案例:
https://developer.mozilla.org/en-us/docs/web/api/element.scrollintoview
所以你需要做的就是:$("selector").get(0).scrollIntoView();。
使用.get(0)是因为我们想要检索javascript的dom元素,而不是jquery的dom元素。
- .get(0)是干什么用的?
- 使用.get(0)是因为我们要检索javascript的dom元素,而不是jquery的dom元素。
- 你也可以用$(selector)[0]吗?
- robw,是的,您可以只使用[0],但是get(0)保护您不受未定义或负索引的影响。见来源:james.padolsey.com/jquery/v=1.10.2&fn=jquery.fn.get
- 如果您根本不想使用jquery,只需使用document.getElementById('#elementID').scrollIntoView()。不需要加载~100k库来选择一个元素,然后将其转换为常规的javascript。
- @加文,我相信你的意思是:document.getElementById('elementID').scrollIntoView()。
- 我认为值得注意的是,这不适用于从放置在它上面的元素下面滚动一个元素,比如position: absolute。
- @FranciscoCorralesMorales您不能在jquery选择器上执行本机的javascript方法,除非您将这些jquery选择器存储到变量中。这里,get(0)用于将选择器更改为普通的javascript选择器,以便对其执行本机的javascript方法。
- 我有一个嵌套容器的情况,这是迄今为止最干净的解决方案。我失去了性感的滚动位,但偏移跟踪是疯狂的。
- 酷。但在使用之前,请确保浏览器支持此功能。根据Mozilla的说法,"这是一项实验性技术"
- 实验技术=任何情况下都不要使用
- 我不知道为什么.animate()会如此不精确。所以我使用了ScrollIntoView(选项还没有按说明工作),但是滚动到正确的项目和位置,在Chrome、Firefox和Safari中测试,一切正常!即使它是"实验性的",它也能工作,而不是.animate()(不是实验性的);)
- 93%的全球用户现在不支持平滑滚动canius.com/search=scrollintoview
使用这个简单的脚本
1 2 3
| if($(window.location.hash).length > 0){
$('html, body').animate({ scrollTop: $(window.location.hash).offset().top}, 1000);
} |
如果在URL中找到散列标记,滚动到ID的动画中。如果没有找到散列标记,则忽略该脚本。
1 2 3 4 5 6 7 8 9 10 11 12 13
| jQuery(document).ready(function($) {
$('a[href^="#"]').bind('click.smoothscroll',function (e) {
e.preventDefault();
var target = this.hash,
$target = $(target);
$('html, body').stop().animate( {
'scrollTop': $target.offset().top-40
}, 900, 'swing', function () {
window.location.hash = target;
} );
} );
} ); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js">
<ul role="tablist">
<li class="active" id="p1">Section 1
</li>
<li id="p2">Section 2
</li>
<li id="p3">Section 3
</li>
</ul> |
- 为了使其更通用,并消除在浏览器链接窗口中不必要地放置hashtag,我只调整了下面的代码:jQuery(document).ready(function($) { $(document).on("click", 'a[href^="#"]', function( e ) { e.preventDefault(); var target = this.hash, $target = $(target); $('html, body').stop().animate({ scrollTop: $target.offset().top - 100}, 1000); }); });。
史蒂夫和彼得的解决方案非常有效。
但在某些情况下,您可能需要将值转换为整数。奇怪的是,来自$("...").offset().top的返回值有时在float中。用途:parseInt($("....").offset().top)。
例如:
1 2 3 4 5
| $("#button").click(function() {
$('html, body').animate({
scrollTop: parseInt($("#elementtoScrollToID").offset().top)
}, 2000);
}); |
"动画"解决方案的紧凑版本。
1 2 3 4 5 6 7 8
| $.fn.scrollTo = function (speed) {
if (typeof(speed) === 'undefined')
speed = 1000;
$('html, body').animate({
scrollTop: parseInt($(this).offset().top)
}, speed);
}; |
基本用途:$('#your_element').scrollTo();。
如果只处理滚动到输入元素,则可以使用focus()。例如,如果要滚动到第一个可见输入:
1
| $(':input:visible').first().focus(); |
或容器中具有.error类的第一个可见输入:
1
| $('.error :input:visible').first().focus(); |
感谢特里西娅·鲍尔指出了这一点!
使用此解决方案,您不需要任何插件,并且除了在关闭