it-swarm.com.de

Wie scrolle ich mit JavaScript zu einem Element?

Ich versuche, die Seite in ein <div>-Element zu verschieben.

Ich habe den nächsten Code ohne Erfolg ausprobiert:

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

Sie können einen Anker verwenden, um das div zu "fokussieren". I.e:

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

und dann das folgende Javascript verwenden:

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

scrollIntoView funktioniert gut:

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

vollständige Referenz in den MDN-Dokumenten:
https://developer.mozilla.org/en-US/docs/Web/API/Element.scrollIntoView

134
schpet

ihre Frage und die Antworten sehen anders aus. Ich weiß nicht, ob ich falsch liege, aber für diejenigen, die hier googeln und erreichen, wäre meine Antwort Folgendes:

  1. Meine Antwort zu stackoverflow
  2. Eine ähnliche Frage

Meine Antwort erklärt:

hier ist ein einfaches Javascript dafür

rufen Sie dies auf, wenn Sie den Bildschirm zu einem Element mit der ID = "yourSpecificElementId" scrollen müssen.

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

dh. für die obige Frage, wenn Sie den Bildschirm mit der ID 'divFirst' zum div bewegen möchten 

der Code wäre: window.scroll(0,findPos(document.getElementById("divFirst")));

und Sie benötigen diese Funktion für die Arbeit:

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

der Bildschirm wird zu Ihrem spezifischen Element gescrollt.

90
AnhSirk Dasarp

Ich habe ein bisschen in diese Sache hineingeschaut und habe diese herausgefunden, die sich irgendwie als die natürlichste Methode anfühlt. Natürlich ist dies jetzt meine persönliche Lieblingsrolle. :)

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

Versuche dies:

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

z.B @: 

http://jsfiddle.net/Vgrey/

7
Chandu

Um zu einem bestimmten Element zu scrollen, haben Sie diese Lösung nur für Javascript gemacht.

Einfache Verwendung:

EPPZScrollTo.scrollVerticalToElementById('signup_form', 20);

Engine-Objekt (Sie können mit Filtern, fps-Werten arbeiten):

/**
 *
 * 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);
    }
};
6
Geri

Hier ist eine Funktion, die einen optionalen Versatz für diese festen Header enthalten kann. Keine externen Bibliotheken erforderlich. 

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

Sie können die Höhe eines Elements mit JQuery erfassen und zu diesem scrollen. 

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

Update März 2018

Blättern Sie zu dieser Antwort, ohne JQuery zu verwenden

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

Sie können den Fokus auf das Element setzen. Es funktioniert besser als scrollIntoView

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

node.focus()

node.removeAttribute('tabindex')

3
ZhenyaUsenko

Der Fokus kann nur auf interaktive Elemente gesetzt werden. Div repräsentiert nur einen logischen Bereich der Seite.

Vielleicht können Sie die Ränder um div festlegen oder deren Farbe ändern, um einen Fokus zu simulieren. Und ja, Visiblity steht nicht im Fokus.

2
S M Kamran

Ich denke, wenn Sie Ihrem Div einen Tabindex hinzufügen, wird es in der Lage sein, den Fokus zu erhalten:

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

Ich glaube nicht, dass es gültig ist. Tabindex kann nur auf einen Bereich, eine Schaltfläche, eine Eingabe, ein Objekt, eine Auswahl und eine Textfläche angewendet werden. Aber probieren Sie es aus.

2
Robin

Die beste, kürzeste Antwort, die auch mit Animationseffekten funktioniert:

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

Wenn Sie eine feste Navigationsleiste haben, subtrahieren Sie einfach deren Höhe vom oberen Wert. Wenn Ihre feste Balkenhöhe also 70px beträgt, sieht Zeile 2 folgendermaßen aus:

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

Erklärung: Zeile 1 holt die Elementposition Zeile 2 scrollt zur Elementposition; Die Eigenschaft behavior fügt einen glatten animierten Effekt hinzu

0
DAVID AJAYI

Aufgrund des Verhaltens funktioniert "smooth" in Safari, Safari ios, Explorer nicht. Normalerweise schreibe ich eine einfache Funktion mit 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)
    })
  }

})();
0
Brad Vanderbush

Eine Methode, die ich oft benutze, um einen Container zum Inhalt zu scrollen.

/**
@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');
    }
};

wenn Sie global überschreiben möchten, können Sie auch Folgendes tun:

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
yorg

Ähnlich wie bei @ cavemans Lösung

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

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

Nachdem ich mich viel umgesehen hatte, funktionierte dies endlich für mich:

  1. Finde/finde div in deinem dom, der eine Bildlaufleiste hat . Für mich sah das so aus: "Div class =" table_body_tool_div "scroll_top =" 0 "scroll_left =" 0 "style =" width: 1263px ; Höhe: 499px; "

  2. Ich habe es mit diesem xpath gefunden: // div [@ class = 'table_body table_body_div']

  3. Verwendete JavaScript, um das Scrollen wie folgt auszuführen: (JavascriptExecutor) -Treiber) .executeScript ("arguments [0] .scrollLeft = arguments [1];", element, 2000);

2000 ist die Anzahl der Pixel, die ich nach rechts scrollen wollte. Verwenden Sie scrollTop anstelle von scrollLeft, wenn Sie Ihr div nach unten scrollen möchten.

Hinweis: Ich habe versucht, scrollIntoView zu verwenden, aber es funktionierte nicht richtig, da meine Webseite mehrere Divs hatte. Es wird funktionieren, wenn Sie nur ein Hauptfenster haben, in dem der Fokus liegt ... Dies ist die beste Lösung, die ich gefunden habe, wenn Sie jQuery nicht verwenden möchten, was ich nicht wollte.

0
Anchal Agrawal

Sie können sich nicht auf ein Div konzentrieren. Sie können sich nur auf ein Eingabeelement in diesem div konzentrieren. Außerdem müssen Sie element.focus () anstelle von display () verwenden.

0
Andrey