如何转到页面上的特定元素?

Cug*_*uga 162 html javascript jquery

在我的HTML页面上,我希望能够"转到"/"滚动到"/"关注"页面上的元素.

通常情况下,我会使用带有a的锚标记href="#something",但我已经使用hashchange事件和BBQ插件来加载此页面.

那么有没有其他方法,通过JavaScript,让页面转到页面上的给定元素?

这是我正在尝试做的基本概述:

function focusOnElement(element_id) {
     $('#div_' + element_id).goTo(); // need to 'go to' this element
}

<div id="div_element1">
   yadda yadda 
</div>
<div id="div_element2">
   blah blah
</div>

<span onclick="focusOnElement('element1');">Click here to go to element 1</span>
<span onclick="focusOnElement('element2');">Click here to go to element 2</span>
Run Code Online (Sandbox Code Playgroud)

use*_*716 216

如果元素当前在页面上不可见,则可以使用本机scrollIntoView()方法.

$('#div_' + element_id)[0].scrollIntoView( true );
Run Code Online (Sandbox Code Playgroud)

其中的true意思是与页面顶部对齐,并false与底部对齐.

否则,有一个scrollTo()插件的jQuery就可以使用.

或者只是得到top position()(文档)的元素,并设置scrollTop()(文档)到该位置:

var top = $('#div_' + element_id).position().top;
$(window).scrollTop( top );
Run Code Online (Sandbox Code Playgroud)

  • 本机scrollIntoView的+1,我完全不知道.一时间,我以为这是jquery.:) (22认同)
  • `position().top`不正确,因为它相对于父元素.你应该使用相对于文档的`offset().top`. (5认同)
  • @yetanothercode:感谢您添加MDN链接.我昨晚有点懒惰.:O) (2认同)
  • 来自 MDN:“scrollIntoView 是实验性技术”,并且它们的兼容性仅适用于 Firefox (2认同)

mu *_*ort 184

插件形式的标准技术看起来像这样:

(function($) {
    $.fn.goTo = function() {
        $('html, body').animate({
            scrollTop: $(this).offset().top + 'px'
        }, 'fast');
        return this; // for chaining...
    }
})(jQuery);
Run Code Online (Sandbox Code Playgroud)

然后你可以说$('#div_element2').goTo();滚动到<div id="div_element2">.选项处理和可配置性留给读者练习.

  • @Lior:老实说,我现在这样做是因为我总是那样做; 我认为''html,body'`的最初原因是处理浏览器差异. (5认同)
  • 我添加了一个变量,这样,如果有一个标题表示元素仍然存在,我可以传递一个负数来提前停止滚动:**用法:**`$('#element').goTo(-50 );`**function:**`(function($){$ .fn.goTo = function(addToScroll){if(!addToScroll){addToScroll = 0;} $('html,body').animate({ scrollTop:($(this).offset().top + addToScroll)+'px'},'fast'); return this; // for chaining ...}})(jQuery);` (2认同)

Gle*_*nnG 168

document.getElementById("elementID").scrollIntoView();
Run Code Online (Sandbox Code Playgroud)

同样的事情,但将其包装在一个函数中:

function scrollIntoView(eleID) {
   var e = document.getElementById(eleID);
   if (!!e && e.scrollIntoView) {
       e.scrollIntoView();
   }
}
Run Code Online (Sandbox Code Playgroud)

这甚至适用于iPhone上的IFrame.

使用getElementById的示例:http://www.w3schools.com/jsref/tryit.asp? filename = tryjsref_document_getelementbyid

  • 截至2016年,`scrollIntoView()`在技术上是非标准的([ref](https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView)),但你可以相当多无论如何要在任何地方使用它([参考](http://caniuse.com/#feat=scrollintoview)). (2认同)
  • 这是一个基本的 JavaScript 方法,没有动画。但是,它不需要框架(例如 JQuery)来运行。如果您想要动画,请使用此处提到的类似内容:http://stackoverflow.com/questions/1586341/how-can-i-scroll-to-a-specific-location-on-the-page-using-jquery (2认同)

Anh*_*arp 33

这是一个简单的javascript

当您需要将屏幕滚动到具有id ="yourSpecificElementId"的元素时调用此方法

window.scroll(0,findPos(document.getElementById("yourSpecificElementId")));
Run Code Online (Sandbox Code Playgroud)

你需要这个功能来工作:

//Finds y value of given object
function findPos(obj) {
    var curtop = 0;
    if (obj.offsetParent) {
        do {
            curtop += obj.offsetTop;
        } while (obj = obj.offsetParent);
    return [curtop];
    }
}
Run Code Online (Sandbox Code Playgroud)

屏幕将滚动到您的特定元素.

  • 是否有特定原因要在数组中返回值? (3认同)
  • @Zze 这样就可以直接传给window.scroll。https://developer.mozilla.org/en-US/docs/Web/API/Window/scroll 或者至少我猜这是他的意图。编辑:我现在意识到滚动不接受数组作为参数。无视我的评论。 (2认同)

lor*_*arq 22

要滚动到页面上特定元素,可以jQuery(document).ready(function($){...})按如下方式向函数添加函数:

$("#fromTHIS").click(function () {
    $("html, body").animate({ scrollTop: $("#toTHIS").offset().top }, 500);
    return true;
});
Run Code Online (Sandbox Code Playgroud)

它在所有浏览器中都像魅力一样.根据您的需要调整速度.