2013-08-06 35 views
51

Điều tôi đang cố gắng thực hiện là làm cho nó sao cho nếu bạn nhấp vào một nút, nó cuộn xuống (mượt mà) đến một div cụ thể trên trang.Cuộn mượt mà đến div cụ thể khi nhấp vào

Tôi đã bắt đầu một JSFiddle đây: http://jsfiddle.net/ryXFt/2/

Những gì tôi cần là nếu bạn nhấp vào nút, nó mịn cuộn để div 'thứ hai'.

HTML:

<div class="first"><button type="button">Click Me!</button></div> 
<div class="second">Hi</div> 

CSS:

.first { 
    width: 100%; 
    height: 1000px; 
    background: #ccc; 
} 

.second { 
    width: 100%; 
    height: 1000px; 
    background: #999; 
} 

Xin vui lòng giúp.

+1

thêm liên kết vào jsfiddle mà không cần bất kỳ mã nào cố gắng, không hiển thị những gì bạn đã thử, ít nhất là tìm kiếm các câu hỏi tương tự trước khi hỏi ...! –

+0

Tôi đã thử một loạt các phương pháp khác nhau, không có phương pháp nào hiệu quả và vì vậy tôi đã loại bỏ chúng. :/ –

+1

điều này sẽ giúp bạn :: http://stackoverflow.com/questions/3432656/scroll-to-a-div-using-jquery –

Trả lời

120

làm:

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

Cập nhật Jsfiddle

+0

Bạn đang sử dụng javaScript tại đây hay jQuery? –

+0

@FahadUddin jQuery của nó. –

+0

@SudhirBastakoti: Tại sao JsFiddle không bao gồm thư viện jquery cho nó trên trang đó? –

17

Có rất nhiều ví dụ về di chuyển mượt mà sử dụng thư viện JS như jQuery, Mootools, Prototype vv

Ví dụ sau đây là trên tinh khiết JavaScript. Nếu bạn không có jQuery/Mootools/Prototype trên trang hoặc bạn không muốn quá tải trang với các thư viện JS nặng, ví dụ sẽ được trợ giúp.

http://jsfiddle.net/rjSfP/

HTML Part:

<div class="first"><button type="button" onclick="smoothScroll(document.getElementById('second'))">Click Me!</button></div> 
<div class="second" id="second">Hi</div> 

CSS Phần:

.first { 
    width: 100%; 
    height: 1000px; 
    background: #ccc; 
} 

.second { 
    width: 100%; 
    height: 1000px; 
    background: #999; 
} 

JS Phần:

window.smoothScroll = function(target) { 
    var scrollContainer = target; 
    do { //find scroll container 
     scrollContainer = scrollContainer.parentNode; 
     if (!scrollContainer) return; 
     scrollContainer.scrollTop += 1; 
    } while (scrollContainer.scrollTop == 0); 

    var targetY = 0; 
    do { //find the top of target relatively to the container 
     if (target == scrollContainer) break; 
     targetY += target.offsetTop; 
    } while (target = target.offsetParent); 

    scroll = function(c, a, b, i) { 
     i++; if (i > 30) return; 
     c.scrollTop = a + (b - a)/30 * i; 
     setTimeout(function(){ scroll(c, a, b, i); }, 20); 
    } 
    // start scrolling 
    scroll(scrollContainer, scrollContainer.scrollTop, targetY, 0); 
} 
+0

Tôi đang sử dụng nó và nó hoạt động rất tốt. Làm thế nào để làm cho di chuyển chậm hơn mặc dù? – jamescampbell

+0

Bất kỳ ý tưởng làm thế nào để thêm bù đắp cho navbar cố định trong mã này? Đây là ví dụ tôi đã thực hiện [fiddle] (http: // jsfiddle.net/rjSfP/93 /) – Plavookac

5

tôi đã chơi xung quanh với của nico trả lời một chút và nó cảm thấy buồn rầu. Đã làm một chút điều tra và tìm thấy window.requestAnimationFrame là một chức năng được gọi là trên mỗi chu kỳ repaint. Điều này cho phép một hình ảnh động rõ ràng hơn. Vẫn cố gắng trau dồi các giá trị mặc định tốt cho kích thước bước nhưng đối với ví dụ của tôi, mọi thứ trông khá tốt bằng cách sử dụng triển khai này.

var smoothScroll = function(elementId) { 
    var MIN_PIXELS_PER_STEP = 16; 
    var MAX_SCROLL_STEPS = 30; 
    var target = document.getElementById(elementId); 
    var scrollContainer = target; 
    do { 
     scrollContainer = scrollContainer.parentNode; 
     if (!scrollContainer) return; 
     scrollContainer.scrollTop += 1; 
    } while (scrollContainer.scrollTop == 0); 

    var targetY = 0; 
    do { 
     if (target == scrollContainer) break; 
     targetY += target.offsetTop; 
    } while (target = target.offsetParent); 

    var pixelsPerStep = Math.max(MIN_PIXELS_PER_STEP, 
           (targetY - scrollContainer.scrollTop)/MAX_SCROLL_STEPS); 

    var stepFunc = function() { 
     scrollContainer.scrollTop = 
      Math.min(targetY, pixelsPerStep + scrollContainer.scrollTop); 

     if (scrollContainer.scrollTop >= targetY) { 
      return; 
     } 

     window.requestAnimationFrame(stepFunc); 
    }; 

    window.requestAnimationFrame(stepFunc); 
} 
+0

cách onclick = "?" mã cho điều này? – kloshar4o

+1

@Alfonso Xem ở trên. Đây chỉ đơn giản là một phiên bản tối ưu hóa của mã nico trong một câu trả lời trước đó. –

+0

@NedRockson Không hoạt động cho tôi cung cấp cho giao diện điều khiển thông báo "Uncaught TypeError: Không thể đọc thuộc tính 'parentNode' của null" nhưng mã của nico đang hoạt động, Tôi nên làm gì để có thể áp dụng hoạt ảnh sạch? –

Các vấn đề liên quan