Плавне прокручування до div id jQuery


248

Я намагався отримати прокрутку, щоб ділити код jquery коду, щоб правильно працювати. На основі іншого питання про переповнення стека я спробував наступне

DEMO http://jsfiddle.net/kevinPHPkevin/8tLdq/

$('#myButton').click(function() {
   $.scrollTo($('#myDiv'), 1000);
});

Але це не спрацювало. Це просто підходить до діву. Я також спробував

$('#myButton').click(function(event) {
     event.preventDefault();
   $.scrollTo($('#myDiv'), 1000);
});

Без прогресу.


1

@TheVanillaThrilla я зробив, але це здалося занадто роздутим для використання одного посилання
StevenPHP

1
@StevenPHP, я замінив код JavaScript у вашому прикладі відповідно до моєї відповіді stackoverflow.com/a/26129950/947687 . І це працює jsfiddle.net/8tLdq/643 .
dizel3d

ОП старий, але я поділюсь цим постом для інших, що приїжджають з ДП. Ось стаття, яка розділяє просту функцію вирішення проблеми: smartik.ws/2015/01/…
Ендрю Сурду,

Відповіді:


667

Вам потрібно анімувати html, body

DEMO http://jsfiddle.net/kevinPHPkevin/8tLdq/1/

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

9
@vector У мене є одна проблема, після її натискання мені доведеться боротися з jquery, щоб прокрутити вгору, будь-яке рішення?
YesItsMe

@yesitsme ... в моєму випадку вгору або вниз
Сірий спектр

@GraySpectrum вгору, лише відразу після натискання, здається, що затримка є.
ТакItsMe

1
У мене те саме питання, що робити, якщо у мене є кілька кнопок, які потрібно прокрутити до різних місць, спробував змінити цей код, але він не працює. Чи можете ви надати ще один приклад?
Dreadlord

Знайшов для цього «виправлення». Прокрутка належного елемента тепер виправлена, але все-таки вона йде вгору і вниз, натискаючи на ту саму ціль "прокручування до": var target = $(this).data("target"); $(".basics-content").animate({scrollTop: $(target).offset().top}, 1000); });Пояснення: .basics-contentце внутрішній діл модала, до якого я фактично хочу прокрутити, з targetнадаю ідентифікаційний номер стихії ...
Роланд

111

Якщо ви хочете змінити стандартну навігацію href-id на сторінці, не змінюючи розмітку HTML для плавного прокручування , використовуйте це ( приклад ):

// handle links with @href started with '#' only
$(document).on('click', 'a[href^="#"]', function(e) {
    // target element id
    var id = $(this).attr('href');

    // target element
    var $id = $(id);
    if ($id.length === 0) {
        return;
    }

    // prevent standard hash navigation (avoid blinking in IE)
    e.preventDefault();

    // top position relative to the document
    var pos = $id.offset().top;

    // animated top scrolling
    $('body, html').animate({scrollTop: pos});
});

3
Це добре працює, я можу припустити, що дуже маленький твіт var pos = $(id).offset().top;може бутиvar pos = $id.offset().top;
Дейві

Дуже хороша. Якщо ви хочете, щоб це відбувалося лише на певних посиланнях (скажімо, у вас є дещо показати або приховати інформацію), просто додайте до них ім’я класу і торкніться свого імені класу (скажімо, скроллер) до кінця декларації відповідності (наприклад, [href ^ = "#"]. прокрутка).
Приватник

Як це зробити без jQuery?
Vadorequest

21

ось мої 2 копійки:

Javascript:

$('.scroll').click(function() {
    $('body').animate({
        scrollTop: eval($('#' + $(this).attr('target')).offset().top - 70)
    }, 1000);
});

Html:

<a class="scroll" target="contact">Contact</a>

і ціль:

<h2 id="contact">Contact</h2>

Це працює лише в тому випадку, якщо ви не декларуєте doctype.
Девід Мартінс

6
Для чого evalтут користь?
провидця

Я думаю, що потрібно $('html, body').animateпрокрутити
Іршад Хан

6

Ось що я використовую:

<!-- jquery smooth scroll to id's -->   
<script>
$(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
        }, 500);
        return false;
      }
    }
  });
});
</script>

Краса цього - ви можете використовувати необмежену кількість хеш-посилань та відповідних ідентифікаторів, не виконуючи новий сценарій для кожного.

Якщо ви використовуєте WordPress, вставте код у footer.phpфайл своєї теми безпосередньо перед закритим тегом body </body>.

Якщо у вас немає доступу до файлів тем, ви можете вставити код прямо у редактор публікації / сторінки (ви повинні редагувати публікацію в текстовому режимі) або у текстовий віджет, який завантажиться на всі сторінки.

Якщо ви використовуєте будь-яку іншу CMS або просто HTML, ви можете вставити код у розділ, який завантажується на всі сторінки безпосередньо перед закритим тегом body </body>.

Якщо вам потрібна додаткова інформація про це, перегляньте мою швидку публікацію тут: jQuery плавно прокрутіть до id

Сподіваюся, що це допоможе, і повідомте мене, якщо у вас є питання з цього приводу.


Любити, як це просто і ванільно, ідеально.
DoPeT

5

ще один приклад:

HTML посилання:

<a href="#featured" class="scrollTo">Learn More</a>

JS:

  $(".scrollTo").on('click', function(e) {
     e.preventDefault();
     var target = $(this).attr('href');
     $('html, body').animate({
       scrollTop: ($(target).offset().top)
     }, 2000);
  });

HTML-якір:

  <div id="featured">My content here</div>

3

Ви впевнені, що Ви завантажуєте файл прокрутки jQueryTo?

ви можете отримати об'єкт: метод не знайде помилку "scrollTo" в консолі.

метод scrollTO не є власним методом jquery. для його використання потрібно включити файл прокрутки jquery To plugin.

посилання: http://flesler.blogspot.in/2009/05/jqueryscrollto-142-released.html http://flesler.blogspot.in/2007/10/jqueryscrollto.html

soln: додайте це в розділ голови.

<script src="\\path\to\the\jquery.scrollTo.js file"></script>

Це мала бути прийнятою відповіддю. Код у питанні правильний і працює чудово. Схоже, плагін scrollTo не працює / не працює. . . Він не питав про різні способи зробити щось подібне.
Кріс Кавана

3

Цей сценарій є вдосконаленням сценарію від Vector. Я трохи змінив це. Отже, цей скрипт працює для кожного посилання зі сторінкою класу - прокручуйте в ньому.

Спочатку без ослаблення:

$("a.page-scroll").click(function() {
    var targetDiv = $(this).attr('href');
    $('html, body').animate({
        scrollTop: $(targetDiv).offset().top
    }, 1000);
});

Для полегшення вам знадобиться інтерфейс Jquery:

<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script>

Додайте це до сценарію:

'easeOutExpo'

Фінал

$("a.page-scroll").click(function() {
    var targetDiv = $(this).attr('href');
    $('html, body').animate({
        scrollTop: $(targetDiv).offset().top
    }, 1000, 'easeOutExpo');
});

Усі послаблення ви можете знайти тут: Cheat Sheet .


3

Цей код буде корисний для будь-якого внутрішнього посилання в Інтернеті

    $("[href^='#']").click(function() {
        id=$(this).attr("href")
        $('html, body').animate({
            scrollTop: $(id).offset().top
        }, 2000);
    });


1

Ви можете зробити це за допомогою наступного простого коду jQuery.

Підручник, демонстраційний та вихідний код можна знайти звідси - Плавне прокручування, щоб ділитися за допомогою jQuery

JavaScript:

$(function() {
    $('a[href*=#]:not([href=#])').click(function() {
        var target = $(this.hash);
        target = target.length ? target : $('[name=' + this.hash.substr(1) +']');
        if (target.length) {
            $('html,body').animate({
              scrollTop: target.offset().top
            }, 1000);
            return false;
        }
    });
});

HTML:

<a href="#section1">Go Section 1</a>
<div id="section1">
    <!-- Content goes here -->
</div>

1

Ось я спробував це, що для мене чудово працює.

$('a[href*="#"]').on('click', function (e) {
    e.preventDefault();

    $('html, body').animate({
        scrollTop: $($(this).attr('href')).offset().top
    }, 500, 'linear');
});

HTML:

 <a href="#fast-food" class="active" data-toggle="tab" >FAST FOOD</a>

<div id="fast-food">
<p> Scroll Here... </p>
  </div>

Що відрізняється у вашій відповіді?
юнантдідус


0

Це працює для мене.

<div id="demo">
        <h2>Demo</h2>
</div>
<script src="https://code.jquery.com/jquery-1.10.2.js"></script>
<script>
    $(document).ready(function () {
        // Handler for .ready() called.
        $('html, body').animate({
            scrollTop: $('#demo').offset().top
        }, 'slow');
    });
</script>

Дякую.


0

Ось моє рішення згладити прокрутку до div / anchor за допомогою jQuery, якщо у вас є фіксований заголовок, щоб він не прокручувався під ним. Також це працює, якщо ви пов'язуєте його з іншої сторінки.

Просто замініть ".site-header" на div, який містить ваш заголовок.

$(function() {

$('a[href*="#"]:not([href="#"])').click(function() {
var headerheight = $(".site-header").outerHeight();
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 - headerheight)
    }, 1000);
    return false;
  }
}
});

//Executed on page load with URL containing an anchor tag.
if($(location.href.split("#")[1])) {
var headerheight = $(".site-header").outerHeight();
  var target = $('#'+location.href.split("#")[1]);
  if (target.length) {
    $('html,body').animate({
      scrollTop: target.offset().top - headerheight
    }, 1);
    return false;
  }
}
});
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.