2014-12-05 33 views
15

Spojrzałem na Myślę, że wszystkie paski przewijania, ale jeszcze nie były w stanie znaleźć prosty, który nie używa jQuery lub nieco skomplikowanej biblioteki.Jak utworzyć prosty pionowy pasek przewijania strony bez korzystania z jQuery?

ktoś stworzył tam właścicielem proste przewijania za pomocą tylko javascript? To, czego szukam, to przykład tego, jak można to zrobić. W szczególności mam proste bootstrap stronę internetową z:

<body> 
    <header> ....</header> 
    <main> ......</main> 
</body> 

Co chciałbym zrobić to, aby móc mieć mały w widoku paska przewijania są wyświetlane po prawej stronie obszaru, jeśli zawartość nie jest większa niż zmieści się na jednej stronie. Dla celów stylizacyjnych chciałbym, aby ten , a nie był domyślnym paskiem przewijania przeglądarki.

Oto przykład tego, co szukam, ale ten używa jQuery, więc nie mogę go używać na moim miejscu:

http://manos.malihu.gr/repository/custom-scrollbar/demo/examples/complete_examples.html

szukam jakiś sposób to zrobić przy użyciu JavaScript na nowoczesna przeglądarka IE9 i wyżej. Sądzę, że przydałoby się to wielu osobom, dla których otwieram nagrodę w wysokości 200 w nadziei, że ktoś mógłby podać dobry przykład przewijanego paska przewijania strony, który reagowałby również na kółko myszy nad obszarem zawartości strony.

Po prostu aktualizacja. Nie szukam dla tego rozwiązania mobilnego. Po prostu szukam rozwiązania, które działałoby w przeglądarce PC/Mac. Witryna nie jest skonfigurowana lub nadaje się do telefonu. Można go używać na iPadzie/tablecie, ale dla tych potrzeb chciałbym mieć domyślny pasek przewijania, aby używać zwykłej metody przewijania tabletu.

+1

Niektóre przeglądarki umożliwiają stylowanie natywnego paska przewijania. Nie polecam używania niestandardowego paska przewijania, ponieważ jeśli coś pęknie w kodzie JS, użytkownicy nie będą mogli przewijać. – Oriol

+1

Czy ['noraesae/perfect-scrollbar'] (https://github.com/noraesae/perfect-scrollbar) będzie dla ciebie działał? [** DEMO **] (http://noraesae.github.io/perfect-scrollbar/). Określa "* perfect-scrollbar jest minimalistyczną, ale idealną (dla mnie, a może dla większości programistów) wtyczką scrollbar współpracującą z jQuery lub ** vanilla JavaScript również **.* " – h2ooooooo

+0

Możesz utworzyć własny pasek przewijania za pomocą js, używając zdarzeń i ręcznie ustawiając pozycję elementów i przewijając zawartość, co nie byłoby takie trudne, ale domyślam się, że musi być jakieś lepsze rozwiązanie. – Mykybo

Odpowiedz

20

Co ciekawe, nie jest super, proste rozwiązanie tam za pomocą wanilii JavaScript. Zrobiłem czyste, lekkie JS, minimalne rozwiązanie dla przeglądarki krzyżowej. Dostosuj do własnych potrzeb i estetyki

Aktualizacja obejmuje Draggable przewiń:
Oto fiddle i CodePen

HTML

<body> 
    <div id="main" class="scrollable"> 
     <div class="content-wrapper"> 
      <div class="content"> 
       <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Incidunt accusamus maxime voluptatem quasi. Recusandae optio nobis ratione iste consectetur consequatur cupiditate saepe laborum natus neque a provident eum explicabo delectus qui accusantium nostrum reiciendis soluta hic ut at sed laboriosam possimus repudiandae deserunt velit rerum. Aliquam ratione itaque corrupti aperiam quisquam unde aspernatur odio id repellendus corporis eaque expedita in ab minus possimus! Quo tempore consequatur repellat consectetur nemo molestiae perferendis ipsum esse nesciunt blanditiis nobis dicta? Laudantium quaerat inventore deleniti exercitationem explicabo quos pariatur sunt earum labore sed eius blanditiis architecto consequuntur ad consectetur unde sapiente nisi. Sunt eos.</p> 
       <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Incidunt accusamus maxime voluptatem quasi. Recusandae optio nobis ratione iste consectetur consequatur cupiditate saepe laborum natus neque a provident eum explicabo delectus qui accusantium nostrum reiciendis soluta hic ut at sed laboriosam possimus repudiandae deserunt velit rerum. Aliquam ratione itaque corrupti aperiam quisquam unde aspernatur odio id repellendus corporis eaque expedita in ab minus possimus! Quo tempore consequatur repellat consectetur nemo molestiae perferendis ipsum esse nesciunt blanditiis nobis dicta? Laudantium quaerat inventore deleniti exercitationem explicabo quos pariatur sunt earum labore sed eius blanditiis architecto consequuntur ad consectetur unde sapiente nisi. Sunt eos.</p> 
      </div> 
     </div> 
    </div> 
    <div>Not special and not contained within scrolling</div> 
</body> 

CSS

.scrollable { 
    padding: 0% 10%; 
    position: relative; 
    border: 1px solid gray; 
    overflow: hidden; 
    height: 400px; 
} 

.scrollable.showScroll::after { 
    position: absolute; 
    content: ''; 
    top: 5%; 
    right: 7px; 
    height: 90%; 
    width: 3px; 
    background: rgba(224, 224, 255, .3); 
} 

.scrollable .content-wrapper { 
    width: 100%; 
    height: 100%; 
    padding-right: 50%; 
    overflow-y: scroll; 
} 
.scroller { 
    z-index: 5; 
    cursor: pointer; 
    position: absolute; 
    width: 10px; 
    border-radius: 5px; 
    background: rgb(111, 111, 190); 
    top: 0px; 
    right: 3px; 
    -webkit-transition: top .08s; 
    -moz-transition: top .08s; 
    -ms-transition: top .08s; 
    -o-transition: top .08s; 
    transition: top .08s; 
} 
.content { 
    -webkit-touch-callout: none; 
    -webkit-user-select: none; 
    -khtml-user-select: none; 
    -moz-user-select: none; 
    -ms-user-select: none; 
    user-select: none; 
} 

JS

(function() { 

var scrollContainer = document.querySelector('.scrollable'), 
    scrollContentWrapper = document.querySelector('.scrollable .content-wrapper'), 
    scrollContent = document.querySelector('.scrollable .content'), 
    contentPosition = 0, 
    scrollerBeingDragged = false, 
    scroller, 
    topPosition, 
    scrollerHeight; 

function calculateScrollerHeight() { 
    // *Calculation of how tall scroller should be 
    var visibleRatio = scrollContainer.offsetHeight/scrollContentWrapper.scrollHeight; 
    return visibleRatio * scrollContainer.offsetHeight; 
} 

function moveScroller(evt) { 
    // Move Scroll bar to top offset 
    var scrollPercentage = evt.target.scrollTop/scrollContentWrapper.scrollHeight; 
    topPosition = scrollPercentage * (scrollContainer.offsetHeight - 5); // 5px arbitrary offset so scroll bar doesn't move too far beyond content wrapper bounding box 
    scroller.style.top = topPosition + 'px'; 
} 

function startDrag(evt) { 
    normalizedPosition = evt.pageY; 
    contentPosition = scrollContentWrapper.scrollTop; 
    scrollerBeingDragged = true; 
} 

function stopDrag(evt) { 
    scrollerBeingDragged = false; 
} 

function scrollBarScroll(evt) { 
    if (scrollerBeingDragged === true) { 
     var mouseDifferential = evt.pageY - normalizedPosition; 
     var scrollEquivalent = mouseDifferential * (scrollContentWrapper.scrollHeight/scrollContainer.offsetHeight); 
     scrollContentWrapper.scrollTop = contentPosition + scrollEquivalent; 
    } 
} 

function createScroller() { 
    // *Creates scroller element and appends to '.scrollable' div 
    // create scroller element 
    scroller = document.createElement("div"); 
    scroller.className = 'scroller'; 

    // determine how big scroller should be based on content 
    scrollerHeight = calculateScrollerHeight(); 

    if (scrollerHeight/scrollContainer.offsetHeight < 1){ 
     // *If there is a need to have scroll bar based on content size 
     scroller.style.height = scrollerHeight + 'px'; 

     // append scroller to scrollContainer div 
     scrollContainer.appendChild(scroller); 

     // show scroll path divot 
     scrollContainer.className += ' showScroll'; 

     // attach related draggable listeners 
     scroller.addEventListener('mousedown', startDrag); 
     window.addEventListener('mouseup', stopDrag); 
     window.addEventListener('mousemove', scrollBarScroll) 
    } 

} 

createScroller(); 


// *** Listeners *** 
scrollContentWrapper.addEventListener('scroll', moveScroller); 
}()); 

Koncepcja jest prosta. Mamy główny div z klasą "przewijaną". JavaScript rozpoznaje ten element i dołącza element div rolki, dzięki któremu możesz stworzyć styl za pomocą CSS. Poprzez zagnieżdżenie elementu potomnego content-wrapper możemy efektywnie wypchnąć rodzimy scroller poza element div, zachowując jednocześnie kontrolę nad dopełnieniem.

Oto schemat: Scroll Diagram

Powodem musimy zachować natywną możliwość przewijania dlatego przewijania zdarzeń JavaScript pożary tylko na elementach, które przelewowy zestaw do przewijania.Zobacz MDN reference on scroll. Zaletą jest to, że jeśli JS jest wyłączony, nadal będziemy wdzięcznie zastępować przewijanie bez paska przewijania.


UWAGA
Należy pamiętać, że trzeba będzie dostosować swoją wersję, aby przeliczyć rozmiar scroller w niektórych przypadkach:
1.) W przypadku, gdy ekran jest zmieniany lub
2) Jeśli więcej treść została dołączona.

Po drugie, należy wprowadzić modyfikacje, jeśli istnieje wiele elementów przewijanych. W takim przypadku należy zapętlić te elementy, aby dołączyły element div rolki i odsłuchały zdarzenia przewijania.

+0

AdamSchuld - Dziękuję bardzo za poświęcenie czasu, aby pomóc mi z moim problemem. Próbowałem skrzypiec w IE i Chrome, ale nie widzę paska przewijania. Kiedy masz trochę czasu, możesz to sprawdzić. Może jest coś, czego mi brakuje. Zauważyłem, że masz stronę internetową do swojej pracy. Może byłoby możliwe dodanie przykładowej strony do tej strony, aby pokazać zwój. Po prostu coś takiego jak http://designgumption.com/scroll.html To tylko myśl, ponieważ czasami trudno jest zobaczyć wyniki skrzypiec w małym oknie, którego używają. Jeszcze raz dziękuję –

+1

W Codepen (http://codepen.io/ElGrecode/pen/LEmbBE) Wyjąłem efekt flashy animacji, może to była właściwość css powodująca problemy. Poza IE, jest to sprawdzane w przeglądarce krzyżowej. – AdamSchuld

+0

Dziękuję. Ponownie sprawdziłem twoją implementację jsfiddle i działa, gdy poruszę kółkiem myszy lub kursorem, a następnie znowu zniknie z widoku. To mnie zdezorientowało, ponieważ spodziewałem się zobaczyć cały czas. Więc twoja wersja codepen jest lepsza. Kiedy patrzę na codepen, widzę zwój, z którego korzystają, co jest naprawdę miłe. Czy sądzisz, że byłbyś w stanie dodać do swojej implementacji, aby umożliwić użytkownikowi przeciągnięcie paska przewijania tak jak z pasków przewijania w kodeku? –

2

Jest niesamowity baron.js library. Może to być również użytkownik z jQuery lub bez niego. Pomysł jest dokładnie taki sam, jak @AdamSchuld w swojej odpowiedzi.

Jego zalety:

  • nie zastępuje natywną przewijania System Mechanic (to jest ważne, gdy chcesz, aby wyglądać dostosowany do przewijania, ale zapisać oryginalną platformę lub zachowania urządzenia).

  • Konfigurowalny pasek przewijania z pełną obsługą CSS.

  • Brak silnych zależności od jQuery.

  • system wtyczek (naprawić nagłówki, stopki, lepki autotestów i więcej)

  • Może być inited na ukrytych bloków

Oto simple demo of it.

3

Wiem, że istnieje już odpowiedź na to pytanie, ale jak tylko OP chciał prostego rozwiązania z javascript wanilią, które działa na nowoczesnych przeglądarkach - i myślę, że więcej ludzi prawdopodobnie też będzie tego potrzebowało, ja spóźnij się, odpowiadając na to pytanie tutaj, ponieważ rozwinąłem very simple and lightweight library in pure vanilla JS (DEMO), a to jest tylko 1KB po gzipowaniu i zminimalizowaniu.

Używa natywnego przewijania, więc działa we wszystkich nowoczesnych przeglądarkach (Firefox, Chrome, Opera, Safari, Edge) oraz na IE10 i IE11. Można go również używać w IE9, włączając polyfill classList.

Obsługiwane są również wszystkie przeglądarki Android, iOS i Windows Phone.

Zobacz dokładniejszy odpowiedź tutaj: Custom scrollbars

Albo przeczytać cały poradnik w SimpleScrollbar's Github README page.