2011-07-05 20 views
6

Mój problem polega na tym, że pionowy pasek przewijania okna przeglądarki, który został usunięty na przykład przez overflow:hidden; spowoduje przeskoczenie strony, kiedy pojawi się ponownie. Używam jQuery usunąć opcję przewijania z gościem, podczas gdy skrypt jest uruchomiony i przewijając stronę do określonego punktu, a następnie zrobić to ponownie ponownie później:Tworzenie paska przewijania

www.nebulafilm.dk/index.html?content

mogę zrobić zastępczy pasek przewijania, gdy nie jest obecny, więc nie będzie skoku wróć?

Czy jest możliwe "wyłączenie" go i "wyszarzenie"?

Nie mogę znaleźć żadnych rozwiązań, wyszukując. Znalazłem coś podobnego tutaj: stackoverflow.com, gdzie pasek przewijania jest zawsze tam. Różnica polega na tym, że pasek przewijania musi pozostać wyłączony, nawet jeśli strona jest dłuższa niż okno. Musi być ponownie "włączony" przez inny skrypt, który kontroluję.

Czy jest to w jakikolwiek sposób możliwe?

Dzięki.


Aktualizacja:

Czas na status.

Miałem problemy z obrazem tła chmury gwiazd, który został ustawiony na tagu body.
Gdy skrypt jQuery (z odpowiedzi na wilki) dodał dopełnienie do znacznika html, a zatem powinien wypchnąć wszystkie elementy na stronie po lewej stronie, obraz tła nadal nie zachowywał się prawidłowo.

Cóż, dowiedziałem się, że element body nie reaguje jak każdy element div. To nie jest tylko "blok" wewnątrz znacznika html, jak każdy inny element blokowy. Ma własne zachowania i najwyraźniej nie można ich oszukać w ten sam sposób. Dlatego obraz tła był niemożliwy do dotknięcia, podczas gdy był on na body.
Ale zajęło mi trochę czasu, aby zrealizować ...

Koniec Rozwiązaniem tego problemu jest tak proste, że przerzucanie głupio mi było niemal ze łzami w oczach, gdy dowiedzieć się, myśląc o nieskończonych (może trochę przesadzam) godzinach badanie body.
Po prostu zapakowałem wszystko w <div id="body"> i nadałem temu obrazowi tła. Nagle wszystko ułożyło się na swoim miejscu.

Od:

<body> 
... 
</body> 

I

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

Do:

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

I:

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

d trochę mądrzejszy o body.

Brak "skakania". Pyszne.

Efekt jest teraz w pełni uruchomiony i prawie nie zauważysz zmiany za pomocą paska przewijania i każdy detal pasuje. Skrypt Cwolve jest idealne i robi dokładną kalkulację:

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

getScrollBarWidth() będzie zawierać dokładnie szerokość paska przewijania, bez względu na przeglądarkę i można go używać do dodawania i usuwania Podkładki jak chcę:

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}); 

    }); 

Dziękuję bardzo. To było miłe.

Odpowiedz

5

Jak o tym:

  • Ustal szerokość paska przewijania w bieżącej przeglądarki
  • Ustaw div zawartości do padding-right: scrollbar-width
  • Ukryj przewijania na rodzica

i po animacji :

  • Usuń padding-tuż przy zawartości
  • pokaz przewijania na rodzica

Zrobiłem Demo: http://jsfiddle.net/cwolves/ezLfU/1/

+0

Tak, to rozwiązanie, jeśli nie jest możliwa bezpośrednia manipulacja paska przewijania. Ale to zależy od przeglądarki i jest pracochłonną pracą. – Steeven

+0

Jak jest pracochłonne? Dałem ci wersję demonstracyjną, która oblicza szerokość paska przewijania :) Rzeczywista implementacja wymaga dodania utworzonej przeze mnie funkcji i 3 wierszy kodu, które są również w wersji demonstracyjnej (wystarczy zmienić selektory). –

+0

Cóż, musisz znaleźć dokładną szerokość paska przewijania dla każdego rodzaju przeglądarki i zaimplementować rodzaj kontroli przeglądarki. I nadal nie będzie to bezpieczne rozwiązanie. Ale jest to część drogi i możliwe rozwiązanie, więc dziękuję za odpowiedź. – Steeven

-1

Wyświetlanie wyłączonego paska przewijania jest tak proste, jak ustawienie przepełnienia: przewiń;

pionie tylko byłoby overflow-y:scroll

+0

Nie, nie spowoduje to wyłączenia paska przewijania, gdy strona jest dłuższa niż ekran. Wtedy zaczyna się "praca", której próbuję zapobiec. Musi zostać wyłączony lub usunięty i zastąpiony przez symbol zastępczy. – Steeven

+0

Ah nie Nie wierzę, że jest to możliwe w javascript, potrzebna byłaby wtyczka przeglądarki do manipulowania elementami przeglądarki. Pomyślałem, że chcesz, aby twoja strona nie "skakała", gdy pasek przewijania był obecny. Jedną rzeczą, którą możesz zrobić, to ustawić pasek przewijania tak, by pasował do twojej strony, ale niestety działa tylko w IE (Przykład: http://www.steve-terada.com). – AlienWebguy

1

po prostu spojrzał na swoim miejscu i myślenia alternatywnego podejścia. Jeśli ukrywasz pasek przewijania z przepełnieniem: ukryty, możesz również ponownie zaimplementować przewijanie.

Dołączyć zdarzenia do strony up/page down/home/end/strzałka w górę/Strzałka w dół, kółko myszy w górę/w kółko myszy w dół, a następnie wykonaj

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

Powyższy kod jest oczywiście złe i tylko przykład, ale prawdopodobnie coś, co możesz spróbować.

+0

Okay, to jest rozwiązanie, które będzie działać w różnych przeglądarkach. Jest to jednak dość zawiłe, a nie tylko wyszarzanie paska przewijania. Ale i tak wydaje się to niemożliwe. – Steeven

+1

Dobrze. Zazwyczaj przeglądarka nie pozwoli ci zbytnio przesadzić z paskiem przewijania. Chcesz zrobić coś, co pasuje do Twojej witryny, więc prawdopodobnie dostaniesz rozwiązanie bardziej skomplikowane niż eleganckie. – Jordan

1

Jak na temat tworzenia treści kilka pikseli węższa niż pojemnika i przełączanie atrybut overflow-y ?

Paski przewijania mogą mieć różne szerokości w różnych przeglądarkach/systemach operacyjnych. Jeśli nie zamierzasz obliczyć szerokości paska przewijania, najlepiej zmieść go na tyle, aby działał we wszystkich przeglądarkach.

Example

+1

Wymaga to dokładnego poznania szerokości kontenera i obserwowania zdarzenia 'resize 'okna oraz aktualizacji zmian. Poza tym różnica "20px" nie jest bezpieczna, ponieważ paski przewijania mogą być szersze. –

+0

To jest interesujące! Ale czy nie będę miał problemu, próbując ustawić szerokość o 20 px mniejszą niż okno? Na stronie nie ustawiam żadnych konkretnych szerokości pól elementów strony, ale tylko zmienne szerokości, aby były wyrównane do środka. Czy nadal będą podskakiwać, jak to widzę? – Steeven

+0

@cwolves prawda, to zależy od złożoności, którą chcesz umieścić na swojej stronie. To zawsze kompromis. Myślałem, że twoje rozwiązanie było zbyt zaawansowane, więc postawiłem alternatywę z niewielką kompromisową funkcjonalnością, ale zwiększoną wydajnością. – Jan

Powiązane problemy