Плавне прокручування до 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.