주어진 앵커로 HTML 페이지를 스크롤하는 방법은 무엇입니까?


264

JavaScript를 사용하여 브라우저가 페이지를 주어진 앵커로 스크롤하도록하고 싶습니다.

내 HTML 코드에서 name또는 id속성을 지정했습니다 .

 <a name="anchorName">..</a>

또는

 <h1 id="anchorName2">..</h1>

로 이동하여 얻을 수있는 것과 동일한 효과를 얻고 싶습니다 http://server.com/path#anchorName. 앵커가 페이지의 보이는 부분의 상단 근처에 오도록 페이지를 스크롤해야합니다.

답변:


349
function scrollTo(hash) {
    location.hash = "#" + hash;
}

전혀 jQuery가 필요하지 않습니다!


91
실제로 스크롤되지는 않고 점프합니다. 이 시점에서 앵커로 연결될 수도 있습니다<a href="#anchorName">link</a>
Ryan

52
이것은 한 번만 작동합니다. 해시가 설정되면 더미 해시로 변경 한 다음 다시 설정하지 않으면 페이지가 동일한 해시로 스크롤되지 않습니다.
Cristian Vrabie

13
전역 창 객체에서 이미 사용하고 있기 때문에 scrollTo를 사용하지 않아야합니다. location.hash도 정의되어 있으므로 매개 변수의 이름을 hash로 지정해서는 안됩니다. 이 코드를 사용할 수 있습니다.function scrollToHash(hashName) { location.hash = "#" + hashName; }
Markus Zeller

3
@MarkusZeller, 왜 매개 변수를 해시라고해서는 안됩니까? 위치와 충돌하지 않습니까?
Gherman

3
"스크롤 동작 : 매끄럽게"를 설정하면 스크롤됩니다. html 요소에
스태커

225

더 간단한 방법 :

var element_to_scroll_to = document.getElementById('anchorName2');
// Or:
var element_to_scroll_to = document.querySelectorAll('.my-element-class')[0];
// Or:
var element_to_scroll_to = $('.my-element-class')[0];
// Basically `element_to_scroll_to` just have to be a reference
// to any DOM element present on the page
// Then:
element_to_scroll_to.scrollIntoView();

22
나는 처음에 Mandx가 트롤링이라고 생각했는데 이것을 시도해 보았습니다. 저를 넘어서서이 방법을 한번도 본 적이 없었습니다. 이 방법에 대한 Mozilla 문서 . 또한 이것은 브라우저에서 매우 잘 지원되는 것으로 보입니다.
Jonathan Dumaine

2
jquery 솔루션이 스크롤되지 않는 데 많은 문제가 있습니다. 이것은 나에게 많은 좌절을 구했다.
NuclearPeon

1
경고! 위의 div에 부동 요소가 포함되어 있고 크기를 쉽게 확인할 수없는 경우이 방법에 문제가있을 수 있습니다.
vogomatix

5
이것은 깨끗한 솔루션이지만 현재로서는 조정할 수 없으며 하드 스크롤을 수행합니다. 옵션 이있는 실험적인 매개 변수 scrollIntoViewOptionsbehavior: "smooth"있지만 현재 Firefox 와만 호환됩니다.
rocha

이것을 애니메이션하는 방법?
SkuraZZ

124

jQuerys .animate () , .offset () 및을 사용할 수 있습니다 scrollTop. 처럼

$(document.body).animate({
    'scrollTop':   $('#anchorName2').offset().top
}, 2000);

링크 예 : http://jsbin.com/unasi3/edit

당신은 애니메이션을 사용하지 않으려면 .scrollTop () 와 같은

$(document.body).scrollTop($('#anchorName2').offset().top);

또는 자바 스크립트 location.hash처럼

location.hash = '#' + anchorid;

1
지금까지 선택기를 만드는 것과 찾을 수 <h1 id="anchorName">또는를 <a name="anchorName">사용 $('#'+hash+',a[name='+hash+']')약간 또는 최적화 된 $(document.getElementById(hash) || 'a[name='+hash+']')최초의 ID로 요소를 검색하고 A의 하나가 발견되지 않는 경우에만 검색에 의존합니다.
gnarf

@gnarf-jQuery에서 '#'선택기를 최적화 할 필요가 없습니다. 이미 최적화되어 있습니다. jQuery 소스 코드를 읽었는지 쉽게 알 수 있습니다.
CodeJoust

3
@CodeJoust-나는 jQuery 팀에 있으며 여러 번 읽었으며 예 $("#selector")는 최적화되었지만 $("#selector,a[name='selector']")동일한 최적화를 신속하게 수행하지는 않습니다. 2.5 살짜리 주석이 조금 이상하다고 들었습니다. "최적화"는 a[name='selector']ID 검색을 최적화하지 않고 ID를 찾으면 검색을 피합니다 .
gnarf

1
<a data-hash="about"> 정보 </a> <script> $ ( "[data-hash]"). click (function () {var data = $ (this) .attr ( "data-hash"); $ (document.body) .animate ({ 'scrollTop': $ ( "#"+ data) .offset (). top}, 500);}); </ script>
Jazzy

32

jAndy의 훌륭한 솔루션이지만 부드러운 스크롤은 firefox에서 작동하는 데 문제가있는 것 같습니다.

이 방법으로 작성하면 Firefox에서도 작동합니다.

(function($) {
    $(document).ready(function() {
         $('html, body').animate({
           'scrollTop':   $('#anchorName2').offset().top
         }, 2000);
    });
})(jQuery);

최신 Chrome 릴리스에서는 이것이 일관되게 작동하는 유일한 방법입니다. 팁 고마워!
gaborous

32

2018-2020 순수 js :

요소로 스크롤하는 매우 편리한 방법이 있습니다.

el.scrollIntoView({
  behavior: 'smooth', // smooth scroll
  block: 'start' // the upper border of the element will be aligned at the top of the visible part of the window of the scrollable area.
})

그러나 내가 이해하는 한 그는 아래 옵션과 같은 훌륭한 지원을받지 못합니다.

여기에 이미지 설명을 입력하십시오

방법에 대해 자세히 알아보십시오.


요소가 맨 위에 있어야하는 경우 :

const element = document.querySelector('#element')
const topPos = element.getBoundingClientRect().top + window.pageYOffset

window.scrollTo({
  top: topPos, // scroll so that the element is at the top of the view
  behavior: 'smooth' // smooth scroll
})

Codepen의 데모 예제


요소를 중앙에 배치하려면 다음을 수행하십시오.

const element = document.querySelector('#element')
const rect = element.getBoundingClientRect() // get rects(width, height, top, etc)
const viewHeight = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);

window.scroll({
  top: rect.top + rect.height / 2 - viewHeight / 2,
  behavior: 'smooth' // smooth scroll
});

Codepen의 데모 예제


지원하다:

введите сюда описание изображения

그들은 그것 scroll과 같은 방법을 scrollTo쓰지만, 지원은 더 잘 나타난다 scrollTo.

방법에 대한 추가 정보


이 솔루션은 매우 잘 작동합니다! 공유해 주셔서 감사합니다!
gaborous

29

JQuery가없는 순수한 자바 스크립트 솔루션. Chrome 및 Ie에서 테스트되었으며 IOS에서는 테스트되지 않았습니다.

function ScrollTo(name) {
  ScrollToResolver(document.getElementById(name));
}

function ScrollToResolver(elem) {
  var jump = parseInt(elem.getBoundingClientRect().top * .2);
  document.body.scrollTop += jump;
  document.documentElement.scrollTop += jump;
  if (!elem.lastjump || elem.lastjump > Math.abs(jump)) {
    elem.lastjump = Math.abs(jump);
    setTimeout(function() { ScrollToResolver(elem);}, "100");
  } else {
    elem.lastjump = null;
  }
}

데모 : https://jsfiddle.net/jd7q25hg/12/


1
이전 주제에 대해 언급 한 것에 대해 사과하지만 프로젝트에서 JQuery를 사용하지 않으므로 가장 효과적입니다. 내가 주목 한 문제는 맨 위로 스크롤하면 5 픽셀이 빠진 것입니다.
AntBirch

순수한 js 버전을보기 위해 매우 상쾌합니다. 나는 학생들에게 항상 후드를 살펴보고 JQuery가 무엇을하는지 이해하도록 가르치므로 좋은 예입니다.
Dave Everitt

2
이것은 정답입니다. 순수한 js 예제이며 원하는 스크롤 애니메이션 효과를 얻습니다. 시간 초과 값을 20으로 조정했으며 완벽하게 작동합니다.
Mark Barrasso

감사합니다. 순수한 자바 스크립트 솔루션을 좋아합니다.
R01010010

2
IOS에서 방금 테스트했습니다.
데비 커트

23

2018 년에는 이와 같은 간단한 것을 위해 jQuery가 필요하지 않습니다. 내장 scrollIntoView()메소드는 " behavior"특성을 지원 하여 페이지의 모든 요소로 부드럽게 스크롤합니다. 브라우저 URL을 해시로 업데이트하여 북마크 할 수 있습니다.

에서 HTML 책갈피를 스크롤에이 튜토리얼 , 여기에 자동으로 페이지의 모든 앵커 링크에 부드러운 스크롤을 추가하는 기본 방법입니다 :

let anchorlinks = document.querySelectorAll('a[href^="#"]')
 
for (let item of anchorlinks) { // relitere 
    item.addEventListener('click', (e)=> {
        let hashval = item.getAttribute('href')
        let target = document.querySelector(hashval)
        target.scrollIntoView({
            behavior: 'smooth',
            block: 'start'
        })
        history.pushState(null, null, hashval)
        e.preventDefault()
    })
}

2
jQuery에 대한 의존성을 제거하는 탁월한 답변
zai chang


14

올바른 위치로 부드럽게 스크롤하십시오 (2019)

올바른 y 좌표를 얻고 사용하십시오window.scrollTo({top: y, behavior: 'smooth'})

const id = 'anchorName2';
const yourElement = document.getElementById(id);
const y = yourElement.getBoundingClientRect().top + window.pageYOffset;

window.scrollTo({top: y, behavior: 'smooth'});

오프셋

scrollIntoView좋은 옵션이지만 일부 경우에는 완벽하게 작동하지 않을 수 있습니다. 추가 오프셋이 필요한 경우를 예로들 수 있습니다 . 다음과 scrollTo같이 오프셋을 추가하면됩니다.

const yOffset = -10; 

window.scrollTo({top: y + yOffset, behavior: 'smooth'});

CSS 스타일 파일에 다음을 추가해야한다고 생각합니다. css html { scroll-behavior: smooth; }
parismiguel

5
$(document).ready ->
  $("a[href^='#']").click ->
    $(document.body).animate
      scrollTop: $($(this).attr("href")).offset().top, 1000

5

CSS-Tricks의 솔루션은 더 이상 jQuery 2.2.0에서 작동하지 않습니다. 선택기 오류가 발생합니다.

JavaScript 런타임 오류 : 구문 오류, 인식 할 수없는 표현식 : a [href * = #] : not ([href = #])

선택기를 변경하여 수정했습니다. 전체 스 니펫은 다음과 같습니다.

$(function() {
  $("a[href*='#']:not([href='#'])").click(function() {
    if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'') && location.hostname == this.hostname) {
    var target = $(this.hash);
    target = target.length ? target : $('[name=' + this.hash.slice(1) +']');
    if (target.length) {
      $('html,body').animate({
        scrollTop: target.offset().top
      }, 1000);
      return false;
    }
  }
 });
});

4

대부분의 답변은 불필요하게 복잡합니다.

방금하려면 이동 대상 요소에, 당신은 자바 스크립트를 필요로하지 않습니다

# the link:
<a href="#target">Click here to jump.</a>

# target element:
<div id="target">Any kind of element.</div>

애니메이션으로 대상 으로 스크롤하려면 @Shahil의 답변을 참조하십시오.


때로는 동적으로 수행해야하는 경우도 있습니다. 즉, 사용자의 직접적인 행동을 통해. 나는 그것이 OP가 원하는 것이라고 믿는다.
jpaugh

1
예, 분명히 OP는 이미 앵커 링크 기능을 알고있었습니다.
isherwood


3

이것은 페이지를 앵커로 스크롤하는 작동하는 스크립트입니다. 설정하려면 스크롤하려는 앵커의 이름 속성과 일치하는 ID를 앵커 링크에 제공하십시오.

<script>
jQuery(document).ready(function ($){ 
 $('a').click(function (){ 
  var id = $(this).attr('id');
  console.log(id);
  if ( id == 'cet' || id == 'protein' ) {
   $('html, body').animate({ scrollTop: $('[name="' + id + '"]').offset().top}, 'slow'); 
  }
 }); 
});
</script>

2

나는 이것이 정말로 오래된 질문이라는 것을 알고 있지만 css-tricks 에서 쉽고 간단한 jQuery 솔루션을 발견했다 . 그것이 제가 지금 사용하고있는 것입니다.

$(function() {
  $('a[href*=#]:not([href=#])').click(function() {
    if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'') && location.hostname == this.hostname) {
      var target = $(this.hash);
      target = target.length ? target : $('[name=' + this.hash.slice(1) +']');
      if (target.length) {
        $('html,body').animate({
          scrollTop: target.offset().top
        }, 1000);
        return false;
      }
    }
  });
});

1
jquery 2.2.0에서 선택기가 예외를 throw합니다. 0x800a139e-JavaScript 런타임 오류 : 구문 오류, 인식 할 수없는 표현식 : a [href * = #] : not ([href = #])
Bill Shihara

2

jQuery("a[href^='#']").click(function(){
    jQuery('html, body').animate({
        scrollTop: jQuery( jQuery(this).attr('href') ).offset().top
    }, 1000);
    return false;
});


2

vue2 솔루션 ... 단순 업데이트를 강제로 수행하는 간단한 데이터 속성 추가

  const app = new Vue({ 
  ... 

  , updated: function() {
           this.$nextTick(function() {
           var uri = window.location.href
           var anchor = ( uri.indexOf('#') === -1 ) ? '' : uri.split('#')[1]
           if ( String(anchor).length > 0 && this.updater === 'page_load' ) {
              this.updater = "" // only on page-load !
              location.href = "#"+String(anchor)
           }
         })
        }
     });
     app.updater = "page_load"

 /* smooth scrolling in css - works in html5 only */
 html, body {
     scroll-behavior: smooth;
 }

0

브라우저가 페이지를 주어진 앵커로 스크롤하도록하는 가장 쉬운 방법은 style.css * {scroll-behavior : smooth;}를 입력하고 HTML 탐색에서 #NameOfTheSection을 사용하는 것입니다.

*{scroll-behavior: smooth;}
<a href="#scroll-to">Home<a/>

<p>other sections</p>
<p>other sections</p>
<p>other sections</p>
<p>other sections</p>
<p>other sections</p>
<p>other sections</p>
<p>other sections</p>
<p>other sections</p>
<p>other sections</p>
<p>other sections</p>
<p>other sections</p>
<p>other sections</p>
<p>other sections</p>

<section id="scroll-to">
<p>it will scroll down to this section</p>
</section>

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.