2012-08-10 27 views
9

Tôi có div vùng chứa có kích thước cố định và tràn: cuộn, nó được lấp đầy với các div nhỏ hơn tạo ra một loại danh sách. Dưới đây là ví dụ về fiddle: http://jsfiddle.net/etYSC/2/Làm thế nào tôi có thể làm cho một thanh cuộn chỉ cuộn trong khoảng thời gian cố định?

điều tôi muốn là cuộn không bao giờ cắt hộp, luôn hiển thị 3 hộp đầy đủ (trong ví dụ này), vì vậy nó sẽ luôn cuộn số lượng pixel cố định.

Làm cách nào để thực hiện việc này?

Tôi đang sử dụng thư viện jquery.

Google đã là một tình nhân khắc nghiệt về câu hỏi này vì các từ khóa gây hiểu lầm.

- giải pháp

tôi đã có thể tinh chỉnh đang kiranvj hơn một chút và tôi rất hài lòng với kết quả cuối cùng.

snapping div trước:

var scrollTimerHandle = ""; 
var positionTimerHandle = ""; 

$("#container").scroll(function() { 
    var boxSize = 84; 
    var newScrollPosition = parseInt(this.scrollTop/boxSize) * boxSize, 
    _this = this; 

    clearInterval(scrollTimerHandle); 
    scrollTimerHandle = setTimeout(function() { 
     positionTimerHandle = setInterval(function(){ 
      if (_this.scrollTop == newScrollPosition){ 
      clearInterval(positionTimerHandle);     
      } else { 
      _this.scrollTop--; 
      } 
     }, 5);   

    }, 600); 
}); 

http://jsfiddle.net/etYSC/7/

chụp để div gần

var scrollTimerHandle = ""; 
var positionTimerHandle = ""; 

$("#container").scroll(function() { 
var boxSize = 84;  
var preScrollPosition = parseInt(this.scrollTop/boxSize) * boxSize; 
var newScrollPosition = this.scrollTop - preScrollPosition < boxSize /2 
          ? preScrollPosition : preScrollPosition + boxSize; 
_this = this; 

clearInterval(scrollTimerHandle); 

    scrollTimerHandle = setTimeout(function() { 
     positionTimerHandle = setInterval(function(){  
      if (_this.scrollTop == newScrollPosition){ 
      clearInterval(positionTimerHandle); 
      } else { 
       if (_this.scrollTop > newScrollPosition){ 
       _this.scrollTop--; 
       } else { 
       _this.scrollTop++; 
       }   
      } 
     }, 5);  

    }, 700); 
}); 

http://jsfiddle.net/etYSC/8/

Cảm ơn tất cả sự giúp đỡ, tôi đã mất đi cách làm thế nào để thực hiện điều này và học được một thỏa thuận tốt ngày hôm nay.

+0

Đây là một trong những khó khăn, bởi vì nếu tôi không nhầm, bạn chỉ kiểm tra vị trí cuộn * sau * cuộn xuất hiện. Điều đó có nghĩa, nếu bạn buộc phải cuộn theo từng bước (trong trường hợp này, chiều cao của các khối của bạn), sẽ có rất nhiều nói lắp khi vùng chứa cuộn vài pixel và sau đó nhảy lùi lại hoặc tiến lên. Bạn có thể loại bỏ toàn bộ thanh cuộn và cung cấp các nút của riêng bạn để cuộn vùng chứa theo mức mong muốn. – jackwanders

+0

@kiranvj có hình thức cuối cùng của tôi, nó không phải là cách tôi hình dung khi tôi hỏi nhưng tôi thích điều này tốt hơn. Cảm ơn bạn đã giúp đỡ. – petervaz

Trả lời

6

Không phải là một giải pháp hoàn hảo.

Nhưng một cái gì đó như thế này nên làm việc (NB: cần phải tinh chỉnh)

​$("#container").scroll(function() { 

    this.scrollTop = parseInt(this.scrollTop/84) * 84; // 84 = height + top and bottom margin 

});​​​ 

Fiddle đây http://jsfiddle.net/R7tAK/1/

Cập nhật

Một số những gì tinh chế mã hơn ở trên, mà không cần bất kỳ plugin khác hoặc libs. (Nhấp nháy loại bỏ)

var scrollTimerHandle = ""; 

$("#container").scroll(function() { 

var newScrollPosition = parseInt(this.scrollTop/84) * 84, 
    _this = this; 

    clearInterval(scrollTimerHandle); 

scrollTimerHandle = setTimeout(function() { 
    _this.scrollTop = newScrollPosition ; 

}, 1000); 


});​ 

Chơi ở đây http://jsfiddle.net/R7tAK/4/

+0

Điều này làm việc như một sự quyến rũ, tôi khá chắc chắn nó sẽ phù hợp với mã của tôi. Cảm ơn rất nhiều cho sự giúp đỡ. – petervaz

+0

Tôi thấy rất nhiều jitter trong cuộn, như tôi đã đề cập trong bình luận của tôi ở trên. – jackwanders

+0

Như đã đề cập trong câu trả lời là mã thô rất cơ bản, cần phải tinh chỉnh nhiều hơn và có thể thêm một số logic xung quanh. HOẶC bạn cần phải thêm một cuộn tùy chỉnh và sử dụng một số logic tương tự – kiranvj

4

Có thể bạn sẽ phải xóa thanh cuộn và sử dụng băng chuyền vì bạn đang sử dụng jQuery, bạn có thể sử dụng plugin jCarousel. Dưới đây là một ví dụ sử dụng một vertical carousel

+0

Cảm ơn bạn đã anwser nhưng những gì cần là quá đơn giản để thêm băng chuyền này vào nó và sẽ không nhìn đúng. Đây là một plugin tốt đẹp, mặc dù. – petervaz

+1

Giao diện của băng chuyền hoàn toàn tùy thuộc vào cách bạn tạo kiểu quay vòng, ví dụ không phải là cách duy nhất mà nó phải xem xét. – JaredMcAteer

0

Bạn có thể thử mã này nếu tôi hiểu bạn phải:

$("#container").scroll(function(){ 
     if($("#container").scrollTop()>=10) { 
      $("#container").scrollTop(10); 
     } 
    } 
); 

http://jsfiddle.net/nnwsx/

+0

Điều đó không hiệu quả; tất cả những gì nó làm là ngăn người dùng cuộn hơn 10 pixel xuống dưới trang. – jackwanders

+0

Điều đó không hoàn toàn chính xác. Nhưng bạn có thể sử dụng scrollTop (x) để cuộn xuống cho vị trí cố định. – LLAlive

2

Dưới đây là một lựa chọn thay thế các thanh cuộn với một số nút cuộn.Tôi đã gỡ bỏ thanh cuộn bằng cách thiết lập overflow:hidden; trên #container

HTML

<div id="container"> 
    <!-- your blocks --> 
</div> 
<div id="buttons"> 
    <button id="scrollUp">Up</button> 
    <button id="scrollDown">Down</button> 
</div> 

Javascript

var container = $('#container'); 
var inc = 84; 
$('#scrollUp').on('click',function(){ 
    container.scrollTop(container.scrollTop()-inc); 
});   
$('#scrollDown').on('click',function(){ 
    container.scrollTop(container.scrollTop()+inc); 
}); 

jsFidle DEMO

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