2011-07-05 75 views
6

Vấn đề của tôi là thanh cuộn dọc của cửa sổ trình duyệt bị xóa theo ví dụ overflow:hidden; sẽ làm cho trang nhảy, khi nó xuất hiện lại sau. Tôi sử dụng jQuery để loại bỏ các tùy chọn cuộn từ khách truy cập, trong khi một kịch bản đang chạy và cuộn trang để một điểm cụ thể, và sau đó để làm cho nó xuất hiện trở lại một lần nữa sau:Cách tạo trình giữ chỗ trên thanh cuộn

www.nebulafilm.dk/index.html?content

Tôi có thể làm cho một giữ chỗ cho thanh cuộn, khi nó không hiện diện, vì vậy nó sẽ không nhảy trở lại?

Hoặc có thể "vô hiệu hóa" và làm cho nó "chuyển thành màu xám" không?

Tôi không thể tìm thấy bất kỳ giải pháp nào bằng cách tìm kiếm. Tôi đã tìm thấy một cái gì đó tương tự ở đây: stackoverflow.com nơi thanh cuộn luôn ở đó. Nhưng sự khác biệt là thanh cuộn phải được giữ nguyên, ngay cả khi trang dài hơn cửa sổ. Nó chỉ phải được "bật" một lần nữa thông qua một kịch bản khác mà tôi kiểm soát.

Điều này có theo bất kỳ cách nào có thể không?

Cảm ơn.


Cập nhật:

Thời gian cập nhật trạng thái.

Tôi đã gặp một số vấn đề với hình nền đám mây sao, được đặt trên thẻ body.
Khi tập lệnh jQuery (từ câu trả lời cwolves) thêm phần đệm vào thẻ html và do đó sẽ đẩy tất cả các phần tử trên trang sang bên trái, hình nền vẫn không hoạt động đúng.

Vâng, tôi phát hiện ra rằng phần tử body không phản ứng như bất kỳ phần tử div nào. Nó không chỉ là một "khối" bên trong thẻ html giống như bất kỳ phần tử khối nào khác. Nó có hành vi riêng của nó và dường như không thể bị lừa theo cùng một cách. Do đó, hình nền không thể chạm được, trong khi đó là trên body.
Nhưng phải mất một thời gian để tôi nhận ra ...

Giải pháp cuối cùng cho điều này là quá đơn giản mà tôi gần như rơi nước mắt khi tìm ra, suy nghĩ về vô tận (tôi có thể phóng đại một chút) giờ điều tra số body.
Tôi chỉ đơn giản là bọc mọi thứ trong một <div id="body"> và đã cho hình nền này thay thế. Đột nhiên tất cả mọi thứ rơi vào vị trí.

Từ:

<body> 
... 
</body> 

body {background-image: url(...);} 

Để:

<body> 
<div id="body"> 
... 
</div> 
</body> 

Và:

#body {background-image: url(...);} 

Một d một chút khôn ngoan hơn về body.

Không còn "nhảy" nữa. Thơm ngon.

Hiệu ứng hiện đang chạy hoàn toàn và bạn hầu như không nhận thấy thay đổi với thanh cuộn và mọi chi tiết đều phù hợp. kịch bản Cwolve là hoàn hảo và làm việc tính toán chính xác:

function getScrollBarWidth(){ 
    var div = $('<div><div>' + new Array(100).join('content<br />') + '</div></div>'), 
     div2 = div.find('div'), 
     body = $(document.body); 

    div.css({ overflow : 'hidden', width: 100, height: 100, position : 'absolute', left : -1000, top : -1000 }); 
    body.append(div); 

    var width1 = div2.width(); 
    div.css({ overflow : 'auto' }); 
    var width2 = div2.width(); 

    div.remove(); 

    return width1 - width2; 
} 

Các getScrollBarWidth() sẽ chứa chính xác độ rộng của thanh cuộn không thành vấn đề trình duyệt, và tôi có thể sử dụng nó để thêm và loại bỏ miếng đệm không như tôi muốn:

var sWidth = getScrollBarWidth(); 

    $("body").css({'overflow': 'hidden'}); 
    $("html").css({'padding-right': sWidth}); 

    $('html, body').delay(1000).animate({ 

     scrollTop: $(hash).offset().top - 170 

    }, 2000, 'swing', function(){ 

     $("body").css({'overflow': 'auto'}); 
     $("html").css({'padding-right': 0}); 

    }); 

Cảm ơn rất nhiều. Đây là một điều tốt đẹp.

Trả lời

5

Làm thế nào về điều này:

  • Xác định độ rộng của thanh cuộn trong trình duyệt hiện tại
  • Đặt một div nội dung để padding-right: scrollbar-width
  • Ẩn cuộn vào cha mẹ

và sau khi hình ảnh động :

  • Remove padding-phải vào nội dung
  • chương cuộn vào cha mẹ

tôi đã thực hiện một bản demo: http://jsfiddle.net/cwolves/ezLfU/1/

+0

Vâng, đó là một giải pháp, nếu không có thao tác thanh cuộn trực tiếp nào là có thể. Nhưng nó sẽ phụ thuộc vào trình duyệt và là một công việc mất thời gian. – Steeven

+0

Làm thế nào là mất thời gian? Tôi đã cho bạn một bản demo để tính toán chiều rộng thanh cuộn :) Việc thực hiện thực tế đòi hỏi bạn phải thêm hàm tôi đã tạo và 3 dòng mã, cũng nằm trong bản trình diễn (chỉ thay đổi bộ chọn). –

+0

Vâng, bạn sẽ phải tìm chiều rộng thanh cuộn chính xác cho từng loại trình duyệt và thực hiện một số loại kiểm tra trình duyệt. Và nó vẫn không phải là một giải pháp an toàn. Nhưng nó là một phần của con đường, và một giải pháp có thể, vì vậy cảm ơn cho câu trả lời. – Steeven

-1

Hiển thị thanh cuộn bị tắt cũng đơn giản như cài đặt tràn: cuộn;

Vertical chỉ sẽ overflow-y:scroll

+0

Không không, thao tác này sẽ không cung cấp thanh cuộn bị tắt khi trang dài hơn màn hình. Sau đó, nó bắt đầu "làm việc" mà tôi đang cố gắng để ngăn chặn. Nó phải được vô hiệu hóa hoặc loại bỏ và thay thế bằng một trình giữ chỗ. – Steeven

+0

Ah không, tôi không tin rằng có thể với javascript, bạn sẽ cần một plugin trình duyệt để thao tác các yếu tố trình duyệt. Tôi nghĩ bạn chỉ muốn trang của bạn không "nhảy" khi có thanh cuộn. Một điều bạn có thể làm là tạo kiểu cho thanh cuộn của bạn để phù hợp với trang của bạn, nhưng tiếc là nó chỉ hoạt động trong IE (Ví dụ: http://www.steve-terada.com) – AlienWebguy

1

Tôi chỉ nhìn trang web và suy nghĩ của bạn về một cách tiếp cận khác. Nếu bạn đang ẩn thanh cuộn có tràn: ẩn, bạn cũng có thể thực hiện lại thao tác cuộn.

Đính kèm các sự kiện để trang lên/page down/home/kết thúc/mũi tên lên/mũi tên xuống, chuột bánh xe lên/chuột bánh xe xuống, và sau đó làm

$(window).scrollTop($(window).scrollTop() + 15) 

Đoạn mã trên rõ ràng là xấu và chỉ một ví dụ, nhưng có thể bạn muốn thử.

+0

Được rồi, đây là giải pháp sẽ hoạt động trên các trình duyệt. Đó là mặc dù khá phức tạp thay vì chỉ màu xám ra thanh cuộn. Nhưng điều đó dường như không thể nào được. – Steeven

+1

Phải. Thông thường trình duyệt sẽ không cho phép bạn gây rối quá nhiều với thanh cuộn. Bạn đang tìm cách làm điều gì đó phức tạp với trang web của bạn, vì vậy bạn có thể sẽ nhận được một giải pháp phức tạp hơn thanh lịch. – Jordan

1

Làm thế nào về làm cho nội dung của bạn một vài điểm ảnh ít rộng hơn so với container và chuyển đổi qua lại các thuộc tính overflow-y ?

Thanh cuộn có thể có độ rộng khác nhau trên các trình duyệt/hệ điều hành khác nhau. Nếu bạn không tính toán chiều rộng của thanh cuộn thì tốt nhất bạn nên lấy nó đủ rộng để nó hoạt động trên tất cả các trình duyệt.

Example

+1

Điều đó đòi hỏi phải biết chính xác độ rộng của vùng chứa và quan sát sự kiện 'resize' của cửa sổ và cập nhật thay đổi. Ngoài ra, sự khác biệt '20px' của bạn không an toàn vì thanh cuộn có thể rộng hơn thế. –

+0

Vâng, điều này thật thú vị! Nhưng tôi sẽ không gặp vấn đề gì khi cố gắng đặt chiều rộng nhỏ hơn 20 px so với cửa sổ? Tại trang web, tôi không đặt bất kỳ độ rộng cụ thể nào cho các hộp phần tử trang, nhưng chỉ có độ rộng biến để làm cho chúng được căn giữa. Sau đó, họ vẫn sẽ nhảy, như tôi thấy nó? – Steeven

+0

@cwolves đúng, tùy thuộc vào độ phức tạp mà bạn sẵn sàng đặt trên trang của mình. Nó luôn luôn là một sự cân bằng. Tôi nghĩ giải pháp của bạn đã được thiết kế quá mức nên tôi đặt một giải pháp thay thế bằng chức năng cân bằng nhỏ trong chức năng nhưng đạt được hiệu suất. – Jan

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