요소로 jQuery 스크롤


2323

나는이 input요소를 가지고있다 :

<input type="text" class="textfield" value="" id="subject" name="subject">

그런 다음 다른 텍스트 입력, 텍스트 영역 등과 같은 다른 요소가 있습니다.

그 사용자가 클릭을 할 때 input#subject페이지가 멋진 애니메이션 페이지의 마지막 요소로 이동합니다. 맨 아래가 아닌 맨 아래로 스크롤해야합니다.

페이지의 마지막 항목은 다음 submit과 같은 버튼입니다 #submit.

<input type="submit" class="submit" id="submit" name="submit" value="Ok, Done.">

애니메이션은 너무 빠르지 않아야하며 유동적이어야합니다.

최신 jQuery 버전을 실행 중입니다. 플러그인을 설치하지 않고 기본 jQuery 기능을 사용하여이를 달성하는 것을 선호합니다.



scrollTo크롬 플러그인으로 인해 비활성화되었습니다. 확실하지 않습니다.
Jacksonkr

답변:


4020

id 버튼이 있다고 가정하면 button다음 예제를 시도하십시오.

$("#button").click(function() {
    $([document.documentElement, document.body]).animate({
        scrollTop: $("#elementtoScrollToID").offset().top
    }, 2000);
});

기사에서 코드를 얻었습니다 .jQuery 플러그인이없는 요소로 부드럽게 스크롤 하십시오 . 그리고 아래 예제에서 테스트했습니다.

<html>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script>
    <script>
        $(document).ready(function (){
            $("#click").click(function (){
                $('html, body').animate({
                    scrollTop: $("#div1").offset().top
                }, 2000);
            });
        });
    </script>
    <div id="div1" style="height: 1000px; width 100px">
        Test
    </div>
    <br/>
    <div id="div2" style="height: 1000px; width 100px">
        Test 2
    </div>
    <button id="click">Click me</button>
</html>


24
모든 경우에 작동하지는 않습니다. stackoverflow.com/questions/2905867/…
Jānis Elmeris

7
@BarryChapman은 정확하지 않습니다. 인터넷 검색 후 내가 발견 한 당신이 브라우저 종류에 따라 별도의 로직을하지 않으려면 두 태그가 필요하다, 그래서.
s3m3n 05:01에

73
애니메이션을 원하지 않고 대신 요소로 즉시 이동하려면 .scrollTop(…)대신을 사용하십시오 .animate({scrollTop: …}, …).
Rory O'Kane

11
당신은 해결책 일뿐 만 아니라 URL에 해시 태그를 추가하는 완전한 기능을 추가 할 수 있습니다. 이 경우 scrollTo가 이미 올바른 위치로 스크롤 되었기 때문에 스크롤되지 않으며 사용자가 URL을 복사하면 자동으로 페이지의 올바른 위치에 스냅됩니다.
샌더

10
애니메이션이 완료 될 때 콜백을 사용하여 실행하고이 솔루션으로 콜백이 두 번 발생하는 것을 발견하면 "$ ( 'html, body') 대신"$ ( 'html body'). animate (... " .animate (... "쉼표는 두 개의 애니메이션 이벤트를 생성했습니다. 하나는 html, 하나는 본문입니다. 실제로는 html 본문을위한 하나만 원합니다. @TJ Crowder stackoverflow.com/questions/8790752/…
BoatCode

526

jQuery .scrollTo () 메소드

jQuery .scrollTo () : 보기-데모, API, 소스

페이지 / 요소 스크롤을 훨씬 쉽게하기 위해이 경량 플러그인을 작성했습니다. 대상 요소 또는 지정된 값을 전달할 수있는 유연성이 있습니다. 아마도 이것은 jQuery의 다음 공식 릴리스의 일부일 수 있습니다. 어떻게 생각하십니까?


사용 예 :

$('body').scrollTo('#target'); // Scroll screen to target element

$('body').scrollTo(500); // Scroll screen 500 pixels down

$('#scrollable').scrollTo(100); // Scroll individual element 100 pixels down

옵션 :

scrollTarget : 원하는 스크롤 위치를 나타내는 요소, 문자열 또는 숫자입니다.

offsetTop : 스크롤 대상 위에 추가 간격을 정의하는 숫자입니다.

duration : 애니메이션 실행 시간을 결정하는 문자열 또는 숫자입니다.

easing : 전환에 사용할 여유 함수를 나타내는 문자열입니다.

complete : 애니메이션이 완료되면 호출하는 함수입니다.


2
크롬에 대한 최신 업데이트까지 작동했습니다. 현재 memoryboxweddings.com/photography-posts에서 사용하고있는 버전이 있습니다 (시험 해보고 싶다면). 수정되면 업데이트를 게시하겠습니다.
Timothy Perez

고정, 실제로 jquery.com의 JS 파일이 죽이고 있다는 것이 밝혀졌습니다. 당신이 그것을 시도하면 지금 작동합니다.
Timothy Perez

4
@TimothyPerez : 상업적 용도로 허용되는 것을 의미한다고 확신합니까? 웹 사이트 어디에서나 해당 코드 스 니펫을 사용하고 밤에 좀 더 쉽게 자고 싶어하는 사람들이 많이 있다고 확신합니까? MIT 라이센스와 같은 것이 귀하의 요구에 적합 할 수 있습니까? en.wikipedia.org/wiki/MIT_License
Robert Massaioli

13
$ ( 'body')는 FF에서 작동하지 않았으므로 $ ( 'html, body') 시도했습니다.
kiranvj

5
이 스크립트 소스가 필요한 사람이라면 여기에서 얻을 수 있습니다. flesler.com/jquery/scrollTo/js/jquery.scrollTo-min.js
Arturs

370

부드러운 스크롤 효과에 관심이없고 특정 요소로 스크롤하는 데 관심이 있다면이를 위해 jQuery 함수가 필요하지 않습니다. Javascript는 귀하의 사례를 다루었습니다.

https://developer.mozilla.org/en-US/docs/Web/API/element.scrollIntoView

따라서 필요한 것은 다음과 같습니다. $("selector").get(0).scrollIntoView();

.get(0) JQuery의 DOM 요소가 아닌 JavaScript의 DOM 요소를 검색하려고하기 때문에 사용됩니다.


12
당신은 또한 사용할 수 $(selector)[0]있습니까?
RobW

16
RobW, 예. [0] 만 사용할 수 있지만 get (0)은 정의되지 않은 인덱스 나 음의 인덱스로부터 보호합니다. 출처 : james.padolsey.com/jquery/#v=1.10.2&fn=jQuery.fn.get
corbacho

21
jQuery를 전혀 사용하지 않으려면을 사용하십시오 document.getElementById('#elementID').scrollIntoView(). ~ 100k 라이브러리를로드하여 요소를 선택한 다음 일반 JavaScript로 변환하지 마십시오.
Gavin

62
@Gavin 나는 당신이 그것을 의미한다고 확신합니다 :document.getElementById('elementID').scrollIntoView()
Brian

3
멋있는. 그러나 사용하기 전에 브라우저가이를 지원하는지 확인하십시오. Mozilla에 따르면 "이것은 실험적인 기술입니다"
Tejasvi Hegde

48

이 간단한 스크립트를 사용하여

if($(window.location.hash).length > 0){
        $('html, body').animate({ scrollTop: $(window.location.hash).offset().top}, 1000);
}

URL에 해시 태그가 있으면 scrollTo가 ID로 애니메이션되도록 정렬하십시오. 해시 태그가 없으면 스크립트를 무시하십시오.


$(window.location.hash)jQuery의 정규식 ID 감지를 충족시키지 못하는 해시에는 작동하지 않습니다. 예를 들어 숫자가 포함 된 해시입니다. 또한 약간 위험합니다. 다른 요소를 선택하지 않도록 입력 형식을 확인해야합니다.
dchacke

35

jQuery(document).ready(function($) {
  $('a[href^="#"]').bind('click.smoothscroll',function (e) {
    e.preventDefault();
    var target = this.hash,
        $target = $(target);

    $('html, body').stop().animate( {
      'scrollTop': $target.offset().top-40
    }, 900, 'swing', function () {
      window.location.hash = target;
    } );
  } );
} );
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


<ul role="tablist">
  <li class="active" id="p1"><a href="#pane1" role="tab">Section 1</a></li>
  <li id="p2"><a href="#pane2" role="tab">Section 2</a></li>
  <li id="p3"><a href="#pane3" role="tab">Section 3</a></li>
</ul>

<div id="pane1"></div>
<div id="pane2"></div>
<div id="pane3"></div>


1
좀 더 보편적으로 만들고 브라우저 링크 창에 해시 태그를 불필요하게 배치하지 않기 위해 방금 코드를 다음과 같이 수정했습니다.jQuery(document).ready(function($) { $(document).on( "click", 'a[href^="#"]', function( e ) { e.preventDefault(); var target = this.hash, $target = $(target); $('html, body').stop().animate({ scrollTop: $target.offset().top - 100}, 1000); }); });
bubencode

31

Steve와 Peter의 솔루션은 매우 잘 작동합니다.

그러나 경우에 따라 값을 정수로 변환해야 할 수도 있습니다. 이상하게도에서 반환 된 값 $("...").offset().top은에 float있습니다.
사용하다:parseInt($("....").offset().top)

예를 들면 다음과 같습니다.

$("#button").click(function() {
    $('html, body').animate({
        scrollTop: parseInt($("#elementtoScrollToID").offset().top)
    }, 2000);
});

22

"애니메이션"솔루션의 컴팩트 버전.

$.fn.scrollTo = function (speed) {
    if (typeof(speed) === 'undefined')
        speed = 1000;

    $('html, body').animate({
        scrollTop: parseInt($(this).offset().top)
    }, speed);
};

기본 사용법 : $('#your_element').scrollTo();


21

이것이 내가하는 방법입니다.

document.querySelector('scrollHere').scrollIntoView({ behavior: 'smooth' })

모든 브라우저에서 작동합니다.

기능에 쉽게 감쌀 수 있습니다

function scrollTo(selector) {
    document.querySelector(selector).scrollIntoView({ behavior: 'smooth' })
}

다음은 실제 예입니다

$(".btn").click(function() {
  document.getElementById("scrollHere").scrollIntoView( {behavior: "smooth" })
})
.btn {margin-bottom: 500px;}
.middle {display: block; margin-bottom: 500px; color: red;}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<button class="btn">Scroll down</button>

<h1 class="middle">You see?</h1>

<div id="scrollHere">Arrived at your destination</div>

문서


6
꽤 짧고 달콤합니다. 한 가지 알아 두어야 할 점-이것은 scrollTop을 설정하는 것처럼 뷰포트의 맨 위로 스크롤하지 않고 뷰로 스크롤하는 것입니다 (뷰포트의 맨 아래에있을 수 있음).
OG 숀

20

jQuery가없는 방법을 알고 있습니다.

document.getElementById("element-id").scrollIntoView();

편집 : 그것은 2 년이 지났으며 여전히이 게시물 lmao에서 무작위로 명성을 얻고 있습니다


18

입력 요소로 스크롤 만 처리하는 경우을 사용할 수 있습니다 focus(). 예를 들어, 첫 번째 보이는 입력으로 스크롤하려면 다음을 수행하십시오.

$(':input:visible').first().focus();

또는 클래스가있는 컨테이너에서 첫 번째로 보이는 입력 .error:

$('.error :input:visible').first().focus();

이것을 지적 해 주신 Tricia Ball 에게 감사드립니다 !


17

이 솔루션 을 사용하면 플러그인이 필요 없으며 닫는 </body>태그 앞에 스크립트를 배치하는 것 외에 설정이 필요하지 않습니다 .

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

if ($(window.location.hash).length > 1) {
  $("html, body").animate({
    scrollTop: $(window.location.hash).offset().top
  }, 1000);
}

로드시 주소에 해시가 있으면 스크롤합니다.

그리고- 예를 들어 해시가 있는 a링크 를 클릭 할 때마다 스크롤됩니다.href#top


아마도이 스크립트 > 1대신 스크립트가 중단 0되기 때문일 것입니다./#
Tallboy

링크가 잘못 구성되었지만 TY가 아니면 기술적으로 빈 해시 URL로 끝나서는 안됩니다. (이 코드의 내 버전에는 이미이 패치가 포함되어 있지만 ^^)
Jonathan

이 코드와 관련된 지터가 있지만 쉽게 고칠 수 있습니다. return false;기본 동작 (즉, 앵커로 즉시 스크롤)이 발생하지 않도록하려면 on click 이벤트의 끝에서 해야합니다 .
roncli

2
@roncli 좋은 지적-또는 대안으로 할 수 있습니다e.preventDefault();
Jonathan

e.preventDefault()그러나 클릭시 URL의 해시를 업데이트하지 않습니다. 항상 해시가없는 URL
jayasurya_j

8

대부분의 경우 플러그인을 사용하는 것이 가장 좋습니다. 진심으로. 나는 여기에 내 것을 선전하겠습니다 . 물론 다른 것도 있습니다. 그러나 플러그인이 원하는 함정을 피하지 않는지 먼저 확인하십시오. 모두가하지는 않습니다.

나는 다른 곳 에서 플러그인을 사용하는 이유에 대해 썼다 . 간단히 말해서, 하나의 라이너는 대부분의 대답을 뒷받침합니다.

$('html, body').animate( { scrollTop: $target.offset().top }, duration );

UX가 잘못되었습니다.

  • 애니메이션이 사용자 작업에 응답하지 않습니다. 사용자가 클릭, 탭 또는 스크롤을 시도하더라도 계속 수행됩니다.

  • 애니메이션의 시작점이 대상 요소에 가까워지면 애니메이션 속도가 느려집니다.

  • 대상 요소가 페이지 하단 근처에 있으면 창의 맨 위로 스크롤 할 수 없습니다. 스크롤 애니메이션이 중간에 갑자기 멈 춥니 다.

이러한 문제 (및 다른 여러 가지 ) 를 처리하기 위해 내 플러그인 jQuery.scrollable을 사용할 수 있습니다 . 그러면 전화가됩니다

$( window ).scrollTo( targetPosition );

그리고 그게 다야. 물론 더 많은 옵션이 있습니다 .

목표 위치와 관련하여 $target.offset().top대부분의 경우 작업을 수행합니다. 그러나 반환 된 값은 html요소 의 테두리 를 고려 하지 않습니다 ( 이 데모 참조 ). 어떤 상황에서도 목표 위치가 정확해야하는 경우 사용하는 것이 좋습니다

targetPosition = $( window ).scrollTop() + $target[0].getBoundingClientRect().top;

html요소 의 테두리 가 설정된 경우에도 작동합니다 .


8

애니메이션 :

// slide to top of the page
$('.up').click(function () {
    $("html, body").animate({
        scrollTop: 0
    }, 600);
    return false;
});

// slide page to anchor
$('.menutop b').click(function(){
    //event.preventDefault();
    $('html, body').animate({
        scrollTop: $( $(this).attr('href') ).offset().top
    }, 600);
    return false;
});

// Scroll to class, div
$("#button").click(function() {
    $('html, body').animate({
        scrollTop: $("#target-element").offset().top
    }, 1000);
});

// div background animate
$(window).scroll(function () {

    var x = $(this).scrollTop();

    // freezze div background
    $('.banner0').css('background-position', '0px ' + x +'px');

    // from left to right
    $('.banner0').css('background-position', x+'px ' +'0px');

    // from right to left
    $('.banner0').css('background-position', -x+'px ' +'0px');

    // from bottom to top
    $('#skills').css('background-position', '0px ' + -x + 'px');

    // move background from top to bottom
    $('.skills1').css('background-position', '0% ' + parseInt(-x / 1) + 'px' + ', 0% ' + parseInt(-x / 1) + 'px, center top');

    // Show hide mtop menu  
    if ( x > 100 ) {
    $( ".menu" ).addClass( 'menushow' );
    $( ".menu" ).fadeIn("slow");
    $( ".menu" ).animate({opacity: 0.75}, 500);
    } else {
    $( ".menu" ).removeClass( 'menushow' );
    $( ".menu" ).animate({opacity: 1}, 500);
    }

});

// progres bar animation simple
$('.bar1').each(function(i) {
  var width = $(this).data('width');  
  $(this).animate({'width' : width + '%' }, 900, function(){
    // Animation complete
  });  
});

8

$('html, body')위 의 답변 대신 오버 플로우 컨테이너 내에서 스크롤하려면 절대 위치 지정 작업을 수행하십시오.

var elem = $('#myElement'),
    container = $('#myScrollableContainer'),
    pos = elem.position().top + container.scrollTop() - container.position().top;

container.animate({
  scrollTop: pos
}

7

div id를 대상으로 페이지를 스크롤하는 쉬운 방법

var targetOffset = $('#divID').offset().top;
$('html, body').animate({scrollTop: targetOffset}, 1000);

6

이것은 일반적인 클래스 선택기를 사용하여 ID와 href를 추상화하는 나의 접근 방식입니다.

$(function() {
  // Generic selector to be used anywhere
  $(".js-scroll-to").click(function(e) {

    // Get the href dynamically
    var destination = $(this).attr('href');

    // Prevent href=“#” link from changing the URL hash (optional)
    e.preventDefault();

    // Animate scroll to destination
    $('html, body').animate({
      scrollTop: $(destination).offset().top
    }, 500);
  });
});
<!-- example of a fixed nav menu -->
<ul class="nav">
  <li>
    <a href="#section-1" class="nav-item js-scroll-to">Item 1</a>
  </li>
  <li>
    <a href="#section-2" class="nav-item js-scroll-to">Item 2</a>
  </li>
  <li>
    <a href="#section-3" class="nav-item js-scroll-to">Item 3</a>
  </li>
</ul>


6

매우 간단하고 사용하기 쉬운 사용자 정의 jQuery 플러그인. scroll=클릭 가능한 요소에 속성 을 추가하고 스크롤하려는 선택기로 값을 설정하십시오.

그렇습니다 : <a scroll="#product">Click me</a>. 모든 요소에 사용할 수 있습니다.

(function($){
    $.fn.animateScroll = function(){
        console.log($('[scroll]'));
        $('[scroll]').click(function(){
            selector = $($(this).attr('scroll'));
            console.log(selector);
            console.log(selector.offset().top);
            $('html body').animate(
                {scrollTop: (selector.offset().top)}, //- $(window).scrollTop()
                1000
            );
        });
    }
})(jQuery);

// RUN
jQuery(document).ready(function($) {
    $().animateScroll();
});

// IN HTML EXAMPLE
// RUN ONCLICK ON OBJECT WITH ATTRIBUTE SCROLL=".SELECTOR"
// <a scroll="#product">Click To Scroll</a>

4
var scrollTo = function($parent, $element) {
    var topDiff = $element.position().top - $parent.position().top;

    $parent.animate({
        scrollTop : topDiff
    }, 100);
};

4

$('html, body').animate(...) 아이폰, 안드로이드 크롬 사파리 브라우저에서 나를 위해하지 않습니다.

페이지의 루트 콘텐츠 요소를 타겟팅해야했습니다.

$ ( '# cotnent'). animate (...)

여기에 내가 끝낸 것입니다

if (navigator.userAgent.match(/(iPod|iPhone|iPad|Android)/)) {           
    $('#content').animate({
    scrollTop: $("#elementtoScrollToID").offset().top
   }, 'slow');
}
else{
    $('html, body').animate({
    scrollTop: $("#elementtoScrollToID").offset().top
    }, 'slow');
}

#content div에 연결된 모든 본문 내용

<html>
....
<body>
<div id="content">
....
</div>
</body>
</html>

사용자 에이전트 스니핑을 사용해서는 안됩니다. webaim.org/blog/user-agent-string-history
Alex Podworny

단어 구분 추가 : break-all; 문제가있는 CSS 요소에. Android / iOS webview jQuery.animate ({scrollTop : y}) 위치가 올바르지 않습니다. medium.com/@ellery.leung/…
daliaessam


3
$('html, body').animate({scrollTop: 
  Math.min( 
    $(to).offset().top-margintop, //margintop is the margin above the target
    $('body')[0].scrollHeight-$('body').height()) //if the target is at the bottom
}, 2000);

3

사용자가 #subject를 사용하여 해당 입력을 클릭하면 페이지가 멋진 애니메이션으로 페이지의 마지막 요소로 스크롤되어야합니다. 맨 아래가 아닌 맨 아래로 스크롤해야합니다.

페이지의 마지막 항목은 #submit이있는 제출 버튼입니다.

$('#subject').click(function()
{
    $('#submit').focus();
    $('#subject').focus();
});

먼저 아래로 스크롤하여 #submit클릭 한 입력으로 커서를 다시 복원합니다.이 입력은 아래로 스크롤을 모방하며 대부분의 브라우저에서 작동합니다. 또한 순수한 JavaScript로 작성할 수 있으므로 jQuery가 필요하지 않습니다.

focus체인 focus호출을 통해 이러한 방식으로 함수 를 사용하여 애니메이션을 더 잘 모방 할 수 있습니까 ? 이 이론을 테스트하지는 않았지만 다음과 같이 보일 것입니다.

<style>
  #F > *
  {
    width: 100%;
  }
</style>

<form id="F" >
  <div id="child_1"> .. </div>
  <div id="child_2"> .. </div>
  ..
  <div id="child_K"> .. </div>
</form>

<script>
  $('#child_N').click(function()
  {
    $('#child_N').focus();
    $('#child_N+1').focus();
    ..
    $('#child_K').focus();

    $('#child_N').focus();
  });
</script>

3

모듈 scroll-element를 설정했습니다 npm install scroll-element. 다음과 같이 작동합니다.

import { scrollToElement, scrollWindowToElement } from 'scroll-element'

/* scroll the window to your target element, duration and offset optional */
let targetElement = document.getElementById('my-item')
scrollWindowToElement(targetElement)

/* scroll the overflow container element to your target element, duration and offset optional */
let containerElement = document.getElementById('my-container')
let targetElement = document.getElementById('my-item')
scrollToElement(containerElement, targetElement)

다음 SO 게시물의 도움으로 작성되었습니다.

코드는 다음과 같습니다.

export const scrollToElement = function(containerElement, targetElement, duration, offset) {
  if (duration == null) { duration = 1000 }
  if (offset == null) { offset = 0 }

  let targetOffsetTop = getElementOffset(targetElement).top
  let containerOffsetTop = getElementOffset(containerElement).top
  let scrollTarget = targetOffsetTop + ( containerElement.scrollTop - containerOffsetTop)
  scrollTarget += offset
  scroll(containerElement, scrollTarget, duration)
}

export const scrollWindowToElement = function(targetElement, duration, offset) {
  if (duration == null) { duration = 1000 }
  if (offset == null) { offset = 0 }

  let scrollTarget = getElementOffset(targetElement).top
  scrollTarget += offset
  scrollWindow(scrollTarget, duration)
}

function scroll(containerElement, scrollTarget, duration) {
  let scrollStep = scrollTarget / (duration / 15)
  let interval = setInterval(() => {
    if ( containerElement.scrollTop < scrollTarget ) {
      containerElement.scrollTop += scrollStep
    } else {
      clearInterval(interval)
    }
  },15)
}

function scrollWindow(scrollTarget, duration) {
  let scrollStep = scrollTarget / (duration / 15)
  let interval = setInterval(() => {
    if ( window.scrollY < scrollTarget ) {
      window.scrollBy( 0, scrollStep )
    } else {
      clearInterval(interval)
    }
  },15)
}

function getElementOffset(element) {
  let de = document.documentElement
  let box = element.getBoundingClientRect()
  let top = box.top + window.pageYOffset - de.clientTop
  let left = box.left + window.pageXOffset - de.clientLeft
  return { top: top, left: left }
}

2

전체 요소를 표시하려면 (현재 창 크기에서 가능한 경우) :

var element       = $("#some_element");
var elementHeight = element.height();
var windowHeight  = $(window).height();

var offset = Math.min(elementHeight, windowHeight) + element.offset().top;
$('html, body').animate({ scrollTop: offset }, 500);

2

jQuery 객체, CSS 선택기 또는 숫자 값으로 스크롤하는 범용 함수를 작성했습니다.

사용법 예 :

// scroll to "#target-element":
$.scrollTo("#target-element");

// scroll to 80 pixels above first element with class ".invalid":
$.scrollTo(".invalid", -80);

// scroll a container with id "#my-container" to 300 pixels from its top:
$.scrollTo(300, 0, "slow", "#my-container");

함수 코드 :

/**
* Scrolls the container to the target position minus the offset
*
* @param target    - the destination to scroll to, can be a jQuery object
*                    jQuery selector, or numeric position
* @param offset    - the offset in pixels from the target position, e.g.
*                    pass -80 to scroll to 80 pixels above the target
* @param speed     - the scroll speed in milliseconds, or one of the
*                    strings "fast" or "slow". default: 500
* @param container - a jQuery object or selector for the container to
*                    be scrolled. default: "html, body"
*/
jQuery.scrollTo = function (target, offset, speed, container) {

    if (isNaN(target)) {

        if (!(target instanceof jQuery))
            target = $(target);

        target = parseInt(target.offset().top);
    }

    container = container || "html, body";
    if (!(container instanceof jQuery))
        container = $(container);

    speed = speed || 500;
    offset = offset || 0;

    container.animate({
        scrollTop: target + offset
    }, speed);
};

2

가치가있는 것은 이것이 스크롤과 함께 DIV 내부에있을 수있는 일반적인 요소에 대해 이러한 동작을 달성하는 방법입니다. 우리의 경우 우리는 몸 전체를 스크롤하지 않고 오버플로가있는 특정 요소 만 스크롤합니다 : auto; 더 큰 레이아웃 내에서.

대상 요소의 높이를 가짜로 입력 한 다음 초점을 맞추고 스크롤 가능한 계층 구조의 깊이에 관계없이 브라우저가 나머지 부분을 처리합니다. 매력처럼 작동합니다.

var $scrollTo = $('#someId'),
inputElem = $('<input type="text"></input>');

$scrollTo.prepend(inputElem);
inputElem.css({
  position: 'absolute',
  width: '1px',
  height: $scrollTo.height()
});
inputElem.focus();
inputElem.remove();

2

이것은 나를 위해 일했다 :

var targetOffset = $('#elementToScrollTo').offset().top;
$('#DivParent').animate({scrollTop: targetOffset}, 2500);

2

jQuery(document).ready(function($) {
  $('a[href^="#"]').bind('click.smoothscroll',function (e) {
    e.preventDefault();
    var target = this.hash,
        $target = $(target);

    $('html, body').stop().animate( {
      'scrollTop': $target.offset().top-40
    }, 900, 'swing', function () {
      window.location.hash = target;
    } );
  } );
} );
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


<ul role="tablist">
  <li class="active" id="p1"><a href="#pane1" role="tab">Section 1</a></li>
  <li id="p2"><a href="#pane2" role="tab">Section 2</a></li>
  <li id="p3"><a href="#pane3" role="tab">Section 3</a></li>
</ul>

<div id="pane1"></div>
<div id="pane2"></div>
<div id="pane3"></div>


2

짧막 한 농담

subject.onclick = e=> window.scroll({ top: submit.offsetTop, behavior: 'smooth'});


1
완벽하게 작동합니다!
jjoselon

1

2019 년 업데이트 된 답변 :

$('body').animate({
    scrollTop: $('#subject').offset().top - $('body').offset().top + $('body').scrollTop()
}, 'fast');

본문에 대해이 선택기를 사용해야합니다. [document.documentElement, document.body] 그리고 방정식에 본문 오프셋이 필요하지 않습니다. $ ( '# subject'). offset (). top으로 충분합니다.
ali6p
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.