JavaScriptを使用して要素にスクロールするにはどうすればよいですか?


152

ページを<div>要素に移動しようとしています。

私は役に立たないように次のコードを試しました:

document.getElementById("divFirst").style.visibility = 'visible';
document.getElementById("divFirst").style.display = 'block';

1
visibilityそしてdisplay要素(で)目に見えるを作るために使用されます。画面でdivをスクロールしますか?
Lekensteyn

どのような焦点ですか?フォーム要素をタブで移動するときと同じ焦点、または何らかの方法で要素を強調表示するという意味で焦点を当てていますか?あなたがする唯一のことは、要素を表示することです、それがすでに表示されている場合は効果がありません。
Felix Kling、2011

スクロールしてビューにフォーカスしますか?
epascarello

回答:


123

アンカーを使用してdivを「フォーカス」できます。すなわち:

<div id="myDiv"></div>

次に、次のJavaScriptを使用します。

// the next line is required to work around a bug in WebKit (Chrome / Safari)
location.href = "#";
location.href = "#myDiv";

9
Chrome(WebKit)には、アンカーを設定するとページがスクロールしないというバグがあります。使用:location.href="#";location.href="#myDiv"。を使用することid="myDiv"をお勧めしname="myDiv"ます。
Lekensteyn、2011

8
私はこの正確な問題を抱えていましたが、FF3.6.13ではWebKitの「修正」が原因で問題が発生しました。「#」行がなくても機能しますが、追加すると「#」に移動し、「#myDiv」に移動することはありません。私は「#」なしでソリューションを使い続けます。
TimFoolery、2011

1
それはブラウザの履歴にこれらのナビゲーションイベントのすべてを追加し、私は簡単に前のページに戻ることはできませんので、これは私のためにうまく動作しません
bikeman868

以下の「AnhSirk Dasarp」は、表示されている画面の上部に目的の要素をスクロールするためのより良い方法だと思います。
Curious101

スクローラーが内側のdivにある場合はどうなりますか?
陳陳

241

scrollIntoViewはうまく機能します:

document.getElementById("divFirst").scrollIntoView();

MDNドキュメントの完全なリファレンス:https :
//developer.mozilla.org/en-US/docs/Web/API/Element.scrollIntoView


11
@CameronMcCluskieこれは、Firefoxだけがサポートしている奇妙な "scrollIntoViewOptions"(スムーズスクロールなど)だけです。私の回答での基本的な使用法は、ほとんど何でも機能するはずです。
2015

4
4月16日現在、OperaとChromeでも動作します。
lvr123

2
このソリューションを使用していて、上部に固定されたナビゲーションバーがある場合は、それも考慮する必要があります。適切に計算されたposYを持つwindows.scrollTo(posX、posY)などの別のソリューションの方が適している場合があります。
Manfred 2016年

2
Firefox、Opera、Safariで作業しました。
Jagdeep Singh

3
ブラウザの互換性のための別のソース(caniuse)次のとおりですscrollIntoView
The Red Pea

99

あなたの質問と答えは異なって見えます。私が間違っているかどうかはわかりませんが、グーグルでここに到達する人にとって、私の答えは次のようになります:

  1. Stackoverflowに関する私の答え
  2. 同様の質問

私の答えは説明しました:

ここにそのための簡単なJavaScriptがあります

id = "yourSpecificElementId"の要素まで画面をスクロールする必要がある場合は、これを呼び出します

window.scroll(0,findPos(document.getElementById("yourSpecificElementId")));

すなわち。上記の質問で、画面をスクロールしてid 'divFirst'のdivに移動する場合

コードは次のようになります。 window.scroll(0,findPos(document.getElementById("divFirst")));

そしてあなたは作業のためにこの関数が必要です:

//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];
    }
}

画面が特定の要素にスクロールされます。


12
このソリューションには、MyIDアンカーを追加して、ブラウザーのナビゲーションバーに表示されるURLをいじらないという利点があります。
Renaud Bompuis 2013年

2
ありがとう、これは受け入れられた答えである必要があるように感じますそれは私にとってうまくいかない現在の答えのようなHTMLではなく、java-scriptですが、これはうまくいきました!
スティーブバーン

つまりwindow、オーバーフローする表示領域ではなく、スクロールしたい場合
WebWanderer

1
最後に変更[curtop]して動作curtopします
goldylucks

この要素をページの最上部にプッシュしたくない場合は、スクロールして要素が画面の中央に(window.screen.height/2)来るようにしたい場合は、findPosから減算します
Albert Renshaw

47

ChromeおよびFirefoxの場合

私はこれについて少し調べてみましたが、これはどういうわけかそれを行うのに最も自然な方法のように感じられるものだと考えました。もちろん、これは私の個人的なお気に入りのスクロールです。:)

const y = element.getBoundingClientRect().top + window.scrollY;
window.scroll({
  top: y,
  behavior: 'smooth'
});

IE、Edge、Safariサポーター向け

window.scroll({ ...options })IE、Edge、Safariではサポートされていないことに注意してください。その場合は、を使用するのが最も良いでしょう element.scrollIntoView()。(IE 6でサポートされています)。ほとんどの場合、副作用なしでオプションを渡すことができます(読み取り:未テスト)。

もちろん、これらは使用されているブラウザに応じて動作する関数にラップすることができます。


3
魅力のように働く:)
midzer

1
これは私がChromeで機能した唯一のソリューションです。
wkille

1
位置を微調整することが可能であるため、私はあなたの解決策を取りたかったのです(私の場合はy-80)。var element = document.getElementById( "Div");のようです。あなたの例に欠けていますか?さらに、IE11では動作しません。IE11はwindow.scrollYを知りません-値を受け取るには、代わりにwindow.pageYOffsetを使用する必要があります。それを変更した後、さまざまな(理解できない)jqueryエラーが発生しました(もちろん-ほとんどの場合-IE11のみです。そのため、document.getElementById( "divFirst")。scrollIntoView();を実装し、次に$(window ).scrollTop($(window).scrollTop()-80);すべてのブラウザで機能するもの
FredyWenger

Safariではサポートされていません(オプションを渡すwindow.scroll
goldylucks

コメントをありがとう、私はブラウザの互換性を含めるために答えを更新します。
穴居人

8

これを試して:

var divFirst = document.getElementById("divFirst");
divFirst.style.visibility = 'visible'; 
divFirst.style.display = 'block';  
divFirst.tabIndex = "-1";  
divFirst.focus();

例:@:

http://jsfiddle.net/Vgrey/


DOMプロパティはそうではelement.tabIndexないことを強調したいだけですelement.tabindex。2つ目は、Firefoxでは機能しますが、Chromeでは機能しません(少なくとも少し前に試したとき)。もちろん、HTML属性の両方として使用tabIndexし、tabindex仕事(およびXHTMLで、tabindex使用する必要があります)
オリオール

6

特定の要素にスクロールするには、以下のJavaScriptのみのソリューションを作成します。

簡単な使い方:

EPPZScrollTo.scrollVerticalToElementById('signup_form', 20);

エンジンオブジェクト(フィルター、fps値をいじることができます):

/**
 *
 * Created by Borbás Geri on 12/17/13
 * Copyright (c) 2013 eppz! development, LLC.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
 * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 *
 */


var EPPZScrollTo =
{
    /**
     * Helpers.
     */
    documentVerticalScrollPosition: function()
    {
        if (self.pageYOffset) return self.pageYOffset; // Firefox, Chrome, Opera, Safari.
        if (document.documentElement && document.documentElement.scrollTop) return document.documentElement.scrollTop; // Internet Explorer 6 (standards mode).
        if (document.body.scrollTop) return document.body.scrollTop; // Internet Explorer 6, 7 and 8.
        return 0; // None of the above.
    },

    viewportHeight: function()
    { return (document.compatMode === "CSS1Compat") ? document.documentElement.clientHeight : document.body.clientHeight; },

    documentHeight: function()
    { return (document.height !== undefined) ? document.height : document.body.offsetHeight; },

    documentMaximumScrollPosition: function()
    { return this.documentHeight() - this.viewportHeight(); },

    elementVerticalClientPositionById: function(id)
    {
        var element = document.getElementById(id);
        var rectangle = element.getBoundingClientRect();
        return rectangle.top;
    },

    /**
     * Animation tick.
     */
    scrollVerticalTickToPosition: function(currentPosition, targetPosition)
    {
        var filter = 0.2;
        var fps = 60;
        var difference = parseFloat(targetPosition) - parseFloat(currentPosition);

        // Snap, then stop if arrived.
        var arrived = (Math.abs(difference) <= 0.5);
        if (arrived)
        {
            // Apply target.
            scrollTo(0.0, targetPosition);
            return;
        }

        // Filtered position.
        currentPosition = (parseFloat(currentPosition) * (1.0 - filter)) + (parseFloat(targetPosition) * filter);

        // Apply target.
        scrollTo(0.0, Math.round(currentPosition));

        // Schedule next tick.
        setTimeout("EPPZScrollTo.scrollVerticalTickToPosition("+currentPosition+", "+targetPosition+")", (1000 / fps));
    },

    /**
     * For public use.
     *
     * @param id The id of the element to scroll to.
     * @param padding Top padding to apply above element.
     */
    scrollVerticalToElementById: function(id, padding)
    {
        var element = document.getElementById(id);
        if (element == null)
        {
            console.warn('Cannot find element with id \''+id+'\'.');
            return;
        }

        var targetPosition = this.documentVerticalScrollPosition() + this.elementVerticalClientPositionById(id) - padding;
        var currentPosition = this.documentVerticalScrollPosition();

        // Clamp.
        var maximumScrollPosition = this.documentMaximumScrollPosition();
        if (targetPosition > maximumScrollPosition) targetPosition = maximumScrollPosition;

        // Start animation.
        this.scrollVerticalTickToPosition(currentPosition, targetPosition);
    }
};

@codeWithMeうん、それは実際の数量が問題ではないiOSのようなコードに似ているので、先に進んで、何が/含まれているのかすべてに名前を付けることができます。私は短さよりもそれを好みます。
GeriBorbás18年

5

以下は、これらの固定ヘッダーのオプションのオフセットを含めることができる関数です。外部ライブラリは必要ありません。

function scrollIntoView(selector, offset = 0) {
  window.scroll(0, document.querySelector(selector).offsetTop - offset);
}

JQueryを使用して要素の高さを取得し、その要素までスクロールできます。

var headerHeight = $('.navbar-fixed-top').height();
scrollIntoView('#some-element', headerHeight)

2018年3月の更新

JQueryを使用せずにこの回答までスクロールします

scrollIntoView('#answer-44786637', document.querySelector('.top-bar').offsetHeight)

5

要素にフォーカスを設定できます。それはよりよく機能しますscrollIntoView

node.setAttribute('tabindex', '-1')

node.focus()

node.removeAttribute('tabindex')


おお、あなたは私の日を救った。多くのものをテストしましたが、これは私にとってうまくいった唯一のものであり、すべてのブラウザをサポートしていました。ところで、私は入力を作成し、1pxの高さと幅を与え、input.itに焦点を当てました。ありがとう
Martian.titan

5

何がアニメーション効果でも機能するという最良かつ最短の答え:

var scrollDiv = document.getElementById("myDiv").offsetTop;
window.scrollTo({ top: scrollDiv, behavior: 'smooth'});

固定ナビゲーションバーがある場合は、上部の値からその高さを引くだけです。したがって、固定バーの高さが70pxの場合、2行目は次のようになります。

window.scrollTo({ top: scrollDiv-70, behavior: 'smooth'});

説明: 1行目は要素の位置を取得します2行目は要素の位置までスクロールします。behaviorプロパティは滑らかなアニメーション効果を追加します


本当にクールですが、Safariや他の一部のブラウザではまだ機能しません。ただし、このポリフィルgithub.com/iamdustan/smoothscrollで動作します。;)
ÍhorMé19年

2

フォーカスはインタラクティブ要素のみに設定できます... Divはページの論理セクションのみを表します。

おそらく、divの周りに境界線を設定したり、色を変更してフォーカスをシミュレートしたりできます。そして、はい、可視性はフォーカスされていません。


1

divにtabindexを追加すると、フォーカスを取得できると思います。

<div class="divFirst" tabindex="-1">
</div>

有効ではないと思いますが、tabindexは、エリア、ボタン、入力、オブジェクト、選択、およびテキストエリアにのみ適用できます。しかし、それを試してみてください。


1
HTML5にtabindexは「コア属性」があり、これは「グローバル属性」(HTML言語のすべての要素に共通の属性)です。w3.org/TR/2011/WD-html-markup-20110113/global-attributes.htmlを
Oriol

1

@cavemanのソリューションに似ています

const element = document.getElementById('theelementsid');

if (element) {
    window.scroll({
        top: element.scrollTop,
        behavior: 'smooth',
    }) 
}


0

たくさん見回した後、これは最終的に私のために働いたものです:

  1. スクロールバーのあるdomでdivを見つけます。私にとっては、このように見えました: "div class =" table_body table_body_div "scroll_top =" 0 "scroll_left =" 0 "style =" width:1263px; 高さ:499px; "

  2. 私はこのxpathでそれを見つけました:// div [@ class = 'table_body table_body_div']

  3. JavaScriptを使用して次のようにスクロールを実行します:(JavascriptExecutor)driver).executeScript( "arguments [0] .scrollLeft = arguments [1];"、element、2000);

2000は、右にスクロールしたいピクセル数です。divを下にスクロールする場合は、scrollLeftではなくscrollTopを使用します。

注:scrollIntoViewを使用しようとしましたが、私のWebページに複数のdivがあるため、正しく機能しませんでした。フォーカスがあるメインウィンドウが1つしかない場合に機能します。これは、私が使いたくないjQueryを使いたくない場合に出会った最高のソリューションです。


0

コンテナーをそのコンテンツにスクロールするためによく使用する方法。

/**
@param {HTMLElement} container : element scrolled.
@param {HTMLElement} target : element where to scroll.
@param {number} [offset] : scroll back by offset
*/
var scrollAt=function(container,target,offset){
    if(container.contains(target)){
        var ofs=[0,0];
        var tmp=target;
        while (tmp!==container) {
            ofs[0]+=tmp.offsetWidth;
            ofs[1]+=tmp.offsetHeight;
            tmp=tmp.parentNode;
        }
        container.scrollTop = Math.max(0,ofs[1]-(typeof(offset)==='number'?offset:0));
    }else{
        throw('scrollAt Error: target not found in container');
    }
};

グローバルにオーバーライドしたい場合は、次のようにすることもできます:

HTMLElement.prototype.scrollAt=function(target,offset){
    if(this.contains(target)){
        var ofs=[0,0];
        var tmp=target;
        while (tmp!==this) {
            ofs[0]+=tmp.offsetWidth;
            ofs[1]+=tmp.offsetHeight;
            tmp=tmp.parentNode;
        }
        container.scrollTop = Math.max(0,ofs[1]-(typeof(offset)==='number'?offset:0));
    }else{
        throw('scrollAt Error: target not found in container');
    }
};

0

動作が原因で、「スムーズ」はSafari、Safari ios、Explorerでは機能しません。私は通常requestAnimationFrameを利用して簡単な関数を書きます

(function(){
    var start;
    var startPos = 0;

    //Navigation scroll page to element
    function scrollTo(timestamp, targetTop){
      if(!start) start = timestamp
      var runtime = timestamp - start
      var progress = Math.min(runtime / 700, 1)

      window.scroll(0, startPos + (targetTop * progress) )

      if(progress >= 1){
        return;
      }else {
        requestAnimationFrame(function(timestamp){
            scrollTo(timestamp, targetTop)
        })
      }
   };

  navElement.addEventListener('click', function(e){

    var target = e.target  //or this 
    var targetTop = _(target).getBoundingClientRect().top
    startPos = window.scrollY

    requestAnimationFrame(function(timestamp){
        scrollTo(timestamp, targetTop)
    })
  }

})();

-1

htmlを使用する場合は、次のように使用できます。

a href="samplewebsite.com/subdivision.html#id

特定の要素IDへのhtmlリンクにします。基本的にはgetElementByIdhtmlバージョンです。


-3

この機能を試してください

function navigate(divId) {
$j('html, body').animate({ scrollTop: $j("#"+divId).offset().top }, 1500);
}

div idをパラメーターとして渡し、機能します。すでに使用しています。


どの図書館の$j出身ですか?
EoghanM 2017年

$ jはjQueryを参照していると思います-質問にはJavascriptが必要であると述べています。
Cameron W.17年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.