JavaScript를 사용하여 요소를 어떻게 스크롤합니까?


152

페이지를 <div> 요소 .

다음 코드를 사용해 보았습니다.

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

1
visibilitydisplay요소 (투입)을 표시하기 위해 사용된다. 화면에서 div를 스크롤 하시겠습니까?
Lekensteyn

어떤 종류의 초점? 양식 요소를 탭하거나 요소를 강조하는 의미에서 초점을 맞출 때와 같은 초점? 요소를 표시하는 것이 유일한 방법이며 이미 표시되어있는 경우에는 효과가 없습니다.
Felix Kling

스크롤하여 화면에 초점을 맞추시겠습니까?
epascarello

답변:


123

앵커를 사용하여 div에 "포커스"할 수 있습니다. 즉 :

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

다음 자바 스크립트를 사용하십시오.

// 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

8
나는이 정확한 문제가 있었지만 WebKit "수정"은 FF 3.6.13에서 나에게 문제를 일으킨다. "#"줄없이 작동하지만 추가하면 "#"로 이동하고 "#myDiv"로 이동하지 않습니다. 나는 "#"없이 해결책을 고수 할 것입니다.
TimFoolery

1
이것은 브라우저 기록에 이러한 탐색 모든 이벤트를 추가하기 때문에 나를 위해 잘 작동하지 않습니다와 나는 쉽게 이전 페이지로 돌아갈 수 없습니다
bikeman868

아래의 'AnhSirk Dasarp'은 원하는 요소를 보이는 화면의 상단으로 스크롤하는 더 좋은 방법이라고 생각합니다.
Curious101

스크롤러가 내부 div에 있다면?
Qian Chen

241

scrollIntoView가 잘 작동합니다.

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

MDN 문서에서 전체 참조 :
https://developer.mozilla.org/en-US/docs/Web/API/Element.scrollIntoView


11
@CameronMcCluskie 독점적 인 파이어 폭스를 지원하는 것은 "scrollIntoViewOptions"(매끄러운 스크롤링 등)뿐입니다. 내 대답에있는 기본적인 용도는 거의 모든 것에서 작동해야합니다.
schpet

4
4 월 16 일 현재 Opera 및 Chrome에서도 작동합니다.
lvr123

2
이 솔루션을 사용할 때 맨 위에 고정 탐색 표시 줄이 있으면이를 고려해야합니다. 올바르게 계산 된 posY를 가진 windows.scrollTo (posX, posY)와 같은 다른 솔루션이 더 적합 할 수 있습니다.
Manfred

2
Firefox, Opera 및 Safari에서 근무했습니다.
Jagdeep Singh

3
다음 은 브라우저 호환성을위한 또 다른 소스 (캐니 우스) 입니다.scrollIntoView
The Red Pea

99

귀하의 질문과 답변이 다르게 보입니다. 실수인지 모르겠지만 Google에 접속하여 여기에 도달하는 사람들의 경우 내 대답은 다음과 같습니다.

  1. stackoverflow에 대한 나의 대답
  2. 비슷한 질문

내 답변은 다음과 같이 설명했다.

여기에 간단한 자바 스크립트가 있습니다.

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

2
고맙습니다.이 답변은 자바 스크립트이며 HTML이 아니라 현재 답변이되지 않는 자바 스크립트입니다.
Steve Byrne

즉, 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, 에지 및 사파리에서 지원되지 않습니다. 이 경우을 사용하는 것이 가장 좋습니다 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

의견 주셔서 감사합니다, 나는 브라우저 호환성을 포함하도록 답변을 업데이트합니다.
Caveman

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; 두 번째는 Firefox에서는 작동하지만 Chrome에서는 작동하지 않습니다 (적어도 얼마 전에 시도했을 때). 물론,하는 HTML 속성을 모두 사용 tabIndextabindex작업 (및 XHTML에 tabindex사용되어야한다)
오리올

6

주어진 요소로 스크롤하려면 아래 에서이 자바 스크립트 전용 솔루션을 만들었습니다.

간단한 사용법 :

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 Yap은 실제 수량이 중요하지 않은 iOS와 유사한 코드와 비슷하므로 수행 / 포함 후 모든 것을 명명 할 수 있습니다. 나는 부족보다 그것을 선호합니다.
Geri Borbás

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')


오, 당신은 내 하루를 구했습니다. 많은 것들을 테스트했지만 이것이 나를 위해 일한 유일한 것이었고 모든 브라우저를 지원합니다. Btw 입력을 만들고 1px 높이와 너비를 제공하고 입력에 초점을 맞췄습니다. 감사합니다
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 및 다른 브라우저에서는 아직 작동하지 않습니다. 이 polyfill github.com/iamdustan/smoothscroll 과 함께 작동 합니다. ;)
Íhor Mé

2

대화 형 요소에만 포커스를 설정할 수 있습니다. Div는 페이지의 논리적 섹션 만 나타냅니다.

아마도 div 주위에 테두리를 설정하거나 색상을 변경하여 포커스를 시뮬레이션 할 수 있습니다. 그리고 그렇습니다. 가시성은 초점이 아닙니다.


1

div에 tabindex를 추가하면 포커스를 얻을 수 있다고 생각합니다.

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

나는 그것이 유효하다고 생각하지 않습니다 .tabindex는 a, area, button, input, object, select 및 textarea에만 적용될 수 있습니다. 그러나 시도해보십시오.


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를 사용해 보았지만 웹 페이지에 여러 div가 있으므로 제대로 작동하지 않았습니다. 포커스가있는 주 창이 하나만 있으면 작동합니다. 이것은 내가 원하지 않는 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');
    }
};

Whish가 전역 적으로 재정의되는 경우 다음을 수행 할 수도 있습니다.

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

나는 $ j가 jQuery를 참조한다고 가정합니다. 질문에는 Javascript가 필요하다는 것입니다.
Cameron W.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.