Di chuyển mượt mà đến div id jQuery


248

Tôi đã cố gắng để có được một cuộn đến mã div jquery để hoạt động chính xác. Dựa trên một câu hỏi khác về stack stack, tôi đã thử như sau

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

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

Nhưng nó không hoạt động. Nó chỉ chộp lấy div. Tôi cũng đã thử

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

Không có tiến bộ.


1
Bạn đã xem cái này chưa? stackoverflow.com/questions
43232656 / Mạnh

@TheVanillaThrilla Tôi đã làm nhưng dường như quá cồng kềnh cho một lần sử dụng liên kết
StevenPHP

1
@StevenPHP, tôi đã thay thế mã JavaScript trong ví dụ của bạn theo câu trả lời stackoverflow.com/a/26129950/947687 của tôi . Và nó hoạt động jsfiddle.net/8tLdq/643 .
dizel3d

OP đã cũ nhưng tôi sẽ chia sẻ bài đăng này cho những người khác đến từ SE. Đây là một bài viết chia sẻ một chức năng đơn giản giải quyết vấn đề: smartik.ws/2015/01/ Kẻ
Andrew Surdu

Câu trả lời:


667

Bạn cần phải làm động html, body

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

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

9
@vector Tôi có một vấn đề, một khi đã nhấp vào, tôi phải chiến đấu với jquery để cuộn lên, giải pháp nào?
YesItsMe

@yesitsme ... lên hoặc xuống trong trường hợp của tôi
Grey Spectrum

@GraySpectrum lên, chỉ ngay sau khi nhấp, có vẻ như có độ trễ.
YesItsMe

1
Tôi có cùng một câu hỏi, nếu tôi có vài nút cần cuộn đến các vị trí khác nhau, đã thử sửa đổi mã này nhưng nó không hoạt động. Bạn có thể vui lòng cung cấp một ví dụ khác?
Dreadlord

Tìm thấy một số "sửa chữa" cho nó. Hiện tại, việc cuộn phần tử thích hợp đã được sửa, nhưng nó vẫn tăng và giảm bằng cách nhấp vào cùng một mục tiêu "cuộn đến": var target = $(this).data("target"); $(".basics-content").animate({scrollTop: $(target).offset().top}, 1000); });Giải thích: .basics-contentlà div bên trong của phương thức mà tôi thực sự muốn cuộn, với targettôi cung cấp số id của yếu tố ...
Roland

111

Nếu bạn muốn ghi đè điều hướng id chuẩn trên trang mà không thay đổi đánh dấu HTML để cuộn trơn tru , hãy sử dụng ( ví dụ ) này:

// 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
Điều này hoạt động tốt, tôi có thể đề xuất một tinh chỉnh rất nhỏ var pos = $(id).offset().top;có thểvar pos = $id.offset().top;
Davey

Rất đẹp. Nếu bạn chỉ muốn điều này xảy ra trên một số liên kết nhất định (giả sử bạn có một số để hiển thị hoặc ẩn thông tin), chỉ cần thêm một tên lớp cho chúng và giải quyết tên lớp của bạn (nói là trình điều khiển) vào cuối tuyên bố trận đấu (ví dụ: [href ^ = "#"]. thanh cuộn).
Privateer

Làm thế nào để bạn làm điều đó mà không có jQuery?
Vadorequest

21

đây là 2 xu của tôi:

Javascript:

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

Html:

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

và mục tiêu:

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

Đường nối này chỉ hoạt động nếu bạn không khai báo doctype.
David Martins

6
Việc sử dụng evalở đây để làm gì?
Seer

Tôi nghĩ rằng nó là bắt buộc $('html, body').animateđể di chuyển
Irshad Khan

6

Đây là những gì tôi sử dụng:

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

Cái hay của cái này là bạn có thể sử dụng vô số liên kết băm và id tương ứng mà không cần phải thực thi một tập lệnh mới cho mỗi tập lệnh.

Nếu bạn đang sử dụng WordPress, hãy chèn mã vào footer.phptệp chủ đề của bạn ngay trước thẻ đóng </body>.

Nếu bạn không có quyền truy cập vào các tệp chủ đề, bạn có thể nhúng mã ngay bên trong trình chỉnh sửa bài / trang (bạn phải chỉnh sửa bài ở chế độ Văn bản) hoặc trên tiện ích Văn bản sẽ tải lên trên tất cả các trang.

Nếu bạn đang sử dụng bất kỳ CMS nào khác hoặc chỉ HTML, bạn có thể chèn mã vào phần tải lên trên tất cả các trang ngay trước thẻ đóng </body>.

Nếu bạn cần thêm chi tiết về điều này, hãy xem bài viết nhanh của tôi ở đây: jQuery mượt mà di chuyển đến id

Hy vọng rằng sẽ giúp, và cho tôi biết nếu bạn có câu hỏi về nó.


Yêu cách đơn giản và vani này, hoàn hảo.
DoPeT

5

một ví dụ nữa:

Liên kết 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);
  });

Neo HTML:

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

3

bạn có chắc là bạn đang tải tệp jQuery scrollTo Plugin không?

bạn có thể nhận được một đối tượng: phương thức không tìm thấy lỗi "scrollTo" trong bàn điều khiển.

phương thức scrollTO không phải là phương thức jquery riêng. để sử dụng nó, bạn cần bao gồm cuộn jquery Để tập tin plugin.

ref: http://flesler.blogspot.in/2009/05/jqueryscrollto-142-release.html http://flesler.blogspot.in/2007/10/jqueryscrollto.html

soln: thêm phần này vào phần đầu

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

Đây phải là câu trả lời được chấp nhận. Mã trong câu hỏi là chính xác, và hoạt động tốt. Dường như plugin scrollTo không / không hoạt động. . Ông không hỏi về những cách khác nhau để làm điều gì đó tương tự.
Chris Kavanagh

3

Kịch bản này là một cải tiến của kịch bản từ Vector. Tôi đã thực hiện một chút thay đổi cho nó. Vì vậy, tập lệnh này hoạt động cho mọi liên kết với cuộn trang lớp trong đó.

Lúc đầu mà không nới lỏng:

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

Để nới lỏng, bạn sẽ cần Jquery UI:

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

Thêm phần này vào tập lệnh:

'easeOutExpo'

Sau cùng

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

Tất cả các nới lỏng bạn có thể tìm thấy ở đây: Cheat Sheet .


3

Mã này sẽ hữu ích cho bất kỳ liên kết nội bộ nào trên web

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

1

Bạn có thể làm điều đó bằng cách sử dụng mã jQuery đơn giản sau đây.

Hướng dẫn, Demo và mã nguồn có thể được tìm thấy từ đây - Di chuyển mượt mà đến div bằng 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

Ở đây tôi đã thử điều này, công việc tuyệt vời cho tôi.

$('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>

Câu trả lời của bạn là gì?
yunandtidus



0

Điều này làm việc với tôi.

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

Cảm ơn.


0

Đây là giải pháp của tôi để cuộn trơn tru đến div / neo bằng jQuery trong trường hợp bạn có một tiêu đề cố định để nó không cuộn bên dưới nó. Ngoài ra nó hoạt động nếu bạn liên kết nó từ trang khác.

Chỉ cần thay thế ".site-header" thành div có chứa tiêu đề của bạn.

$(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;
  }
}
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.