jQuery – poziomy scroll
Kilka dni temu zajmowałem się prostą stroną. Nic wielkiego, większość statyczna, tylko na stronie głównej miał się znaleźć przewijalny boks z listą osób. Ruch miał się odbywać w poziomie, tak żeby strona była jak najniższa. Większość była już gotowa, jednakże samo przewijanie nie działało jak trzeba. Gotowiec ściągnięty z sieci dawał niezbyt ciekawe rezultaty. Trzeba było napisać coś własnego działającego prawidłowo.
Na początek sama konstrukcja takiego przewijanego boksu. Można zrobić go przy pomocy diva z określoną szerokością. Wewnątrz elementy z float: left. Będzie działało, ale szerokość diva trzeba będzie wyliczyć na podstawie szerokości wewnętrznych elementów. Do tego przewijanie nie będzie funkcjonować w przypadku ludzi z wyłączonym javascriptem (być może da się to obejść, ale miałem za mało czasu, żeby się z tym bawić). Dlatego też wybrałem inną konstrukcję. Główny boks (#scroller) ma szerokość ustawioną na 100% oraz jest położony względnie (width: 100%; position: relative;). Elementy umieszczone wewnątrz mają położenie bezwzględne, ze zmienną wartością przesunięcia względem lewej krawędzi (position: absolute; left: **px;). Po wyjściu elementów poza ekran pokaże się domyślny suwak, dlatego też potrzebny będzie overflow:hidden. Poniżej wstawiamy #scrollbar (width: 100%; position: relative; height: px; background: ….;) z umieszczonym w środku elementem #scroll_button (position:absolute;width: px; height: px;background …;). Na koniec trzeba napisać kilka linijek w javascript, dzięki którym #scroll_button zacznie się poruszać w poziomie, a tym samym zmieniać elementy widoczne w przewijanym boksie.
Całość będzie wyglądać mniej więcej tak:
<div id="scroller"> <div style="left: 0px;" class="scroll_in"> </div> /** kolejne elementy **/ </div> <div id="scrollbar"> <div id="scroll_button"></div> </div>
<style type="text/css"> div#scroller { height: 356px; left: 0; overflow: hidden; position: relative; width: 100%; } div.scroll_in { position: absolute ; top: 0 ; width: 200px ; height: 356px ; } #scrollbar { background: url("images/scroll_bg.jpg") repeat scroll 0 0 #DDDDDD; float: left; height: 18px; margin-bottom: 15px; position: relative; width: 100%; } #scroll_button { background: url("images/scroller.png") no-repeat scroll right top transparent; cursor: move; height: 18px; position: absolute; width: 166px; } </style>
<script type="text/javascript"> $(document).ready( function() { var actScroll = $("#scrollbar").width() ; var maxScroll = $("#scroller").attr("scrollWidth") - $("#scroller").width() ; var pos_left = 0 ; var multipler = 1.2 ; $("#scroll_button").draggable({ axis: 'x', containment: 'parent', drag: function(event, ui) { pos_left = ui.position.left * multipler / actScroll * (maxScroll) ; $("#scroller").attr({scrollLeft: pos_left }); }, stop: function(event, ui) { pos_left = ui.position.left * multipler / actScroll * (maxScroll) ; $("#scroller").attr({scrollLeft: pos_left }); } }); } ) ; </script>
Skrypt określa stosunek liczbowy w szerokości przewijanego boksa do szerokości suwaka. Do diva #scroll_button przypięte zostaje drag&drop działające tylko po x i ograniczone do obszaru zajmowanego przez obiekt rodzicielski (dzięki temu nie da się wyjechać poza ekran). Na koniec ruch i zatrzymanie powodują wyliczenie o ile należy przewinąć zawartość boksa. Multipler dodałem, żeby zniwelować małą niedogodność: w skrajnej lewej pozycji suwak ma left:0, w skrajnej prawej wartość tą ogranicza szerokość suwaka. Jak znajdę wolną chwilę, to postaram się znaleźć rozwiązanie działające z punktem leżącym pośrodku suwaka.
W przypadku ludzi z wyłączonym javascriptem suwak nie będzie działać jak trzeba, dlatego warto zadbać o pokazanie domyślnego suwaka:
<noscript> <style type="text/css"> #scrollbar { display: none ; } #scroller { overflow: auto ; } </style> </noscript>
Ale wytłumaczyłeś, nic nie rozumiem, powinna być paczka, wgl to nawet nie działa…
Działa poprawnie.