2012-07-02 13 views
17

Mam listę elementów wewnątrz ukrytego elementu div z przepełnieniem. Więc nie wszystkie elementy są widoczne. Teraz, jeśli element zostanie aktywowany, powinien stać się widoczny w div.Jak przewinąć ukryty element div do pewnego aktualnie niewidocznego elementu?

Jak przewinąć do aktywnego elementu za pomocą jQuery?

To tylko udogodnienie, że ostatni element ma aktywną klasę. Zostanie przełączony dynamicznie.

var scrollToEl = $("div.element.active"); 
 
console.log(zoomToEl);
#main, 
 
#sidebar { 
 
    height: 200px; 
 
} 
 
#wrapper { 
 
    width: 190px; 
 
    float: left; 
 
    background: grey; 
 
    overflow: auto; 
 
    overflow-x: hidden; 
 
} 
 
#sidebar div.element { 
 
    height: 150px; 
 
    width: 150px; 
 
    background-color: green; 
 
    margin-bottom: 10px; 
 
} 
 
#sidebar div.element.active { 
 
    background-color: red; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="main"> 
 
    <div id="wrapper" class="sidebar"> 
 
    <div id="sidebar"> 
 
     <div class="element" data-slide-id="0">a 
 
     </div> 
 
     <div class="element" data-slide-id="1">b 
 
     </div> 
 
     <div class="element" data-slide-id="2">c 
 
     </div> 
 
     <div class="element" data-slide-id="3">d 
 
     </div> 
 
     <div class="element" data-slide-id="4">e 
 
     </div> 
 
     <div class="element" data-slide-id="5">f 
 
     </div> 
 
     <div class="element" data-slide-id="6">g 
 
     </div> 
 
     <div class="element active" data-slide-id="7">h 
 
     </div> 
 
    </div> 
 
    </div> 
 
</div>

Element, który powinien stać się widoczny:

var scrollToEl = $("div.element.active"); 

Odpowiedz

23

Można ustawić scrollTop div otoki być top z position aktywnego elementu.

$("#wrapper").scrollTop($("#wrapper").scrollTop() + $("div.element.active").position().top); 

DEMO

+3

Wypróbowałem twoje demo, ale działa ono tylko raz, spróbuj powtórzyć, a zobaczysz dziwne zachowanie. Wydaje się, że naprawiono to za pomocą następującego kodu: $ ("# wrapper"). ScrollTop ($ ("# wrapper"). ScrollTop() + $ ("div.element.active"). Position(). Top); DEMO: http://jsfiddle.net/pA2Qh/ – Rob

+0

Dobre łapanie, @Rob! Dzieje się tak dlatego, że kiedy przewija się do aktywnego div, to 'position.top' staje się 0. Następnym razem, gdy spróbujesz uruchomić ten kod, przewinie on do pozycji 0, rzeczywistej góry kontenera. Zaktualizowałem mój kod. – sachleen

+0

@Rob, to jest świetne. Jest to najlepsze rozwiązanie dla przypadków, które mają "nadrzędny: 100% wysokości" i/lub "przepełnienie: ukryte" - co jest jak zawsze, w przypadku urządzeń mobilnych – KingJulian

16

Może szukasz scrollIntoView metody.

scrollToEl[0].scrollIntoView(); 

DEMO:http://jsfiddle.net/yuFk5/14/

+0

Wydaje mają kilka wad: http://stackoverflow.com/a/9446004/457268 ESP. "po prostu przeskakuje do konkretnego elementu, który równie dobrze może znajdować się na końcu strony" to dla mnie przełom. – k0pernikus

+0

@ k0pernikus Lepiej dodaj adnotację w pytaniu, że szukasz rozwiązania animowanego. W przeciwnym razie metoda działa idealnie dobrze i prosto, IMO. – VisioN

+0

Nie miałem na myśli braku szacunku dla rozwiązania, które podałeś. To po prostu nie pasuje do moich potrzeb :) – k0pernikus

Powiązane problemy