CSS dostosowany pasek przewijania w div

Jak mogę dostosować pasek przewijania za pomocą CSS (kaskadowe arkusze stylów) dla jednego div, a nie całej strony?

Author: JSuar, 2012-02-12

14 answers

Pomyślałem, że pomocne będzie skonsolidowanie najnowszych informacji na temat pasków przewijania, CSS i kompatybilności przeglądarki.

Scroll Bar obsługa CSS

Obecnie nie istnieje definicja stylów CSS paska przewijania między przeglądarkami. artykuł W3C wspominam na końcu ma następujące stwierdzenie i został ostatnio zaktualizowany (10 paź 2014):

Niektóre przeglądarki (IE, Konqueror) obsługują niestandardowe właściwości 'scrollbar-shadow-color', 'scrollbar-track-color' i inni te właściwości są nielegalne: nie są zdefiniowane w żadnej specyfikacji CSS ani oznaczone jako własnościowe (przez przedrostek " - vendor-")

Microsoft

Jak wspomnieli inni, Microsoft obsługuje stylizację paska przewijania, ale tylko dla IE8 i wyższych.

Przykład:

<!-- language: lang-css -->

    .TA {
        scrollbar-3dlight-color:gold;
        scrollbar-arrow-color:blue;
        scrollbar-base-color:;
        scrollbar-darkshadow-color:blue;
        scrollbar-face-color:;
        scrollbar-highlight-color:;
        scrollbar-shadow-color:
    }

Chrome & Safari (WebKit)

Podobnie WebKit ma teraz swoją własną wersję:

Firefox (Gecko)

Firefox nie ma własnej wersji stylów paska przewijania zgodnie z to więc odpowiedz.

Nie ma odpowiednika Gecko ::-webkit-scrollbar i przyjaciół.

Będziesz musiał trzymać się jQuery.

Wielu osobom spodobałaby SIĘ Ta funkcja, zobacz:
https://bugzilla.mozilla.org/show_bug.cgi?id=77790

Ten raport prosi o dokładnie to samo, o co prosisz: https://bugzilla.mozilla.org/show_bug.cgi?id=547260

Style paska przewijania między przeglądarkami

Biblioteki JavaScript i wtyczki mogą zapewnić rozwiązanie między przeglądarkami. Istnieje wiele opcji.

Lista może trwać. Najlepiej będzie szukać, badać i testować dostępne rozwiązania. Jestem pewien, że znajdziesz coś, co będzie pasowało do Twoich potrzeb.

Zapobieganie Nielegalnej Stylizacji Paska Przewijania

Na wypadek, gdybyś chciał zapobiec stylowaniu paska przewijania, które nie zostało poprawnie poprzedzone "-vendor", Ten artykuł w W3C zawiera podstawowe instrukcje. Zasadniczo, będziesz musisz dodać następujący CSS do arkusza stylów użytkownika powiązanego z przeglądarką. Te definicje zastąpią nieprawidłową stylizację paska przewijania na każdej odwiedzanej stronie.

body, html {
  scrollbar-face-color: ThreeDFace !important;
  scrollbar-shadow-color: ThreeDDarkShadow !important;
  scrollbar-highlight-color: ThreeDHighlight !important;
  scrollbar-3dlight-color: ThreeDLightShadow !important;
  scrollbar-darkshadow-color: ThreeDDarkShadow !important;
  scrollbar-track-color: Scrollbar !important;
  scrollbar-arrow-color: ButtonText !important;
}

Duplikat lub podobne pytania / źródło Nie linkowane powyżej

Uwaga: Ta odpowiedź zawiera informacje z różnych źródeł. Jeśli użyto źródła, to jest ono również powiązane w tej odpowiedzi.

 644
Author: JSuar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-02 18:41:28

Niestandardowe paski przewijania nie są możliwe z CSS, będziesz potrzebował trochę magii JavaScript.

Niektóre przeglądarki obsługują niestandardowe reguły CSS, takie jak ::-webkit-scrollbar W Webkit, ale nie jest to idealne rozwiązanie, ponieważ będzie działać tylko w Webkit. IE też coś takiego miało, ale chyba już tego nie popierają.

 11
Author: elclanrs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-25 19:02:49

Spróbuj

Źródło: http://areaaperta.com/nicescroll/

Prosta Implementacja

<script type="text/javascript">
 $(document).ready(

  function() { 

    $("html").niceScroll();

  }

);
</script>

Jest to pasek przewijania wtyczki jQuery, więc twoje paski przewijania są sterowane i wyglądają tak samo w różnych systemach operacyjnych.

 11
Author: Dilusha Gonagala,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-14 08:43:48

Myślę, że w tym wątku brakuje jednej rzeczy. Jeśli chciałbyś zaimplementować przewijanie za pomocą wtyczki, zdecydowanie najlepszy w 2014 jest Sly .

Jest to czysty pasek przewijania javascript, więc twoje paski przewijania są sterowalne i wyglądają tak samo na różnych systemach operacyjnych.

Ma najlepszą wydajność i funkcje. Żaden inny nawet nie jest blisko. Nie trać czasu wybierając z miriady halfbaked buggy innych bibliotek.

 8
Author: Capaj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-10 23:07:21

Próbowałem wielu wtyczek, większość z nich nie obsługuje wszystkich przeglądarek, wolę iScroll oraz nanoScroller działa dla wszystkich tych przeglądarek:

  • IE11 - > IE6
  • IE10 - WP8
  • IE9 - WP7
  • IE Xbox One
  • IE Xbox 360
  • Google Chrome
  • FireFox
  • Opera
  • Safari

Ale iScroll nie działa z dotykiem!

Demo iScroll : http://lab.cubiq.org/iscroll/examples/simple/
demo nanoScroller : http://jamesflorentino.github.io/nanoScrollerJS/

 4
Author: Ouadie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-08 13:56:43

Oto przykład webkit, który działa dla Chrome i Safari:

CSS:

::-webkit-scrollbar 
{
    width: 40px;
    background-color:#4F4F4F;
}

::-webkit-scrollbar-button:vertical:increment 
{
    height:40px;
    background-image: url(/Images/Scrollbar/decrement.png);
    background-size:39px 30px;
    background-repeat:no-repeat;
}

::-webkit-scrollbar-button:vertical:decrement 
{
    height:40px;
    background-image: url(/Images/Scrollbar/increment.png);    
    background-size:39px 30px;
    background-repeat:no-repeat;
}

Wyjście:

Tutaj wpisz opis obrazka

 3
Author: Denys Wessels,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-12 07:20:31

Jak wielu ludzi, szukałem czegoś, co było:

  • konsekwentnie stylizowane i funkcjonalne w większości nowoczesnych przeglądarek
  • nie jakieś śmieszne 3000-liniowe rozszerzenie jQuery cr * p

...Ale niestety-nic!

Cóż, jeśli praca jest warta wykonania... Udało mi się coś uruchomić w około 30 minut. Zastrzeżenie: jest sporo znanych (i prawdopodobnie kilka jeszcze nieznanych) problemów z nim, ale to sprawia, że zastanawiam się, co na ziemi inne 2920 linii JS jest w wielu ofertach!

var dragParams;
	window.addEventListener('load', init_myscroll);

	/* TODO: Much to do for v axis! */

	function bardrag_mousemove(e) {
	  var pos = (e.clientX - dragParams.clientX) + dragParams.offsetLeft;
	  pos = Math.min(Math.max(0, pos), dragParams.maxLeft);
	  dragParams.slider.style.left = pos + 'px';
	  updateScrollPosition(dragParams.slider, pos);
	}

	function updateScrollPosition(slider, offsetVal) {
	  var bar = slider.parentNode;
	  var myscroll = bar.parentNode;
	  var maxView = myscroll.scrollWidth - myscroll.offsetWidth;
	  var maxSlide = bar.offsetWidth - slider.offsetWidth;
	  var viewX = maxView * offsetVal / maxSlide;
	  myscroll.scrollLeft = viewX;
	  bar.style.left = viewX + 'px';
	}

	function drag_start(e) {
	  var slider = e.target;
	  var maxLeft = slider.parentNode.offsetWidth - slider.offsetWidth;
	  dragParams = {
	    clientX: e.clientX,
	    offsetLeft: slider.offsetLeft,
	    slider: e.target,
	    maxLeft: maxLeft
	  };
	  e.preventDefault();
	  document.addEventListener('mousemove', bardrag_mousemove);
	}

	function drag_end(e) {
	  e.stopPropagation();
	  document.removeEventListener('mousemove', bardrag_mousemove);
	}

	function bar_clicked(e) {
	  var bar = e.target;
	  var slider = bar.getElementsByClassName('slider')[0];
	  if (bar.className == 'h bar') {
	    var maxSlide = bar.offsetWidth - slider.offsetWidth;
	    var sliderX = e.offsetX - (slider.offsetWidth / 2);
	    sliderX = Math.max(0, Math.min(sliderX, maxSlide));
	    slider.style.left = sliderX + 'px';
	    updateScrollPosition(slider, sliderX);
	  }
	}

	function init_myscroll() {
	  var myscrolls = document.getElementsByClassName('container');
	  for (var i = 0; i < myscrolls.length; i++) {
	    var myscroll = myscrolls[i];
	    var style = window.getComputedStyle(myscroll);
	    if (style.overflowY == 'scroll' || (style.overflowY == 'auto' && myscroll.offsetHeight < myscroll.scrollHeight)) {
	      addScroller(false, myscroll);
	    }
	    if (style.overflowX == 'scroll' || (style.overflowX == 'auto' && myscroll.offsetWidth < myscroll.scrollWidth)) {
	      addScroller(true, myscroll);
	    }
	  }
	}

	function addScroller(isX, myscroll) {
	  myscroll.className += ' myscroll';
	  var bar = document.createElement('div');
	  var slider = document.createElement('div');
	  var offsetDim = isX ? myscroll.offsetWidth : myscroll.offsetHeight;
	  var scrollDim = isX ? myscroll.scrollWidth : myscroll.scrollHeight;
	  var sliderPx = Math.max(30, (offsetDim * offsetDim / scrollDim));
	  slider.style.width = 100 * sliderPx / offsetDim + '%';
	  slider.className = 'slider';
	  bar.className = isX ? 'h bar' : 'v bar';
	  bar.appendChild(slider);
	  myscroll.appendChild(bar);

	  bar.addEventListener('click', bar_clicked);
	  slider.addEventListener('mousedown', drag_start);
	  slider.addEventListener('mouseup', drag_end);
	  bar.addEventListener('mouseup', drag_end);
	  document.addEventListener('mouseup', drag_end);
	}
body {
  background-color: #66f;
}
.container {
  background-color: #fff;
  width: 50%;
  margin: auto;
  overflow: auto;
}
.container > div:first-of-type {
  width: 300%;
  height: 100px;
  background: linear-gradient(to right, red, yellow);
}
/* TODO: Much to do for v axis! */

.myscroll {
  overflow: hidden;
  position: relative;
}
.myscroll .bar {
  background-color: lightgrey;
  position: absolute;
}
.myscroll {
  padding-bottom: 20px;
}
.myscroll .h {
  height: 20px;
  width: 100%;
  bottom: 0;
  left: 0;
}
.myscroll .slider {
  background-color: grey;
  position: absolute;
}
.myscroll .h .slider {
  height: 100%;
}
<div class="container">
  <div></div>
</div>
 3
Author: ne1410s,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-14 21:19:12

Proszę sprawdzić ten link. Przykład z roboczym demo

   #style-1::-webkit-scrollbar-track
{
    -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.3);
    border-radius: 10px;
    background-color: #F5F5F5;
}

#style-1::-webkit-scrollbar
{
    width: 12px;
    background-color: #F5F5F5;
}

#style-1::-webkit-scrollbar-thumb
{
    border-radius: 10px;
    -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,.3);
    background-color: #555;
}

CSS Scroll Bars

 3
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-12 06:40:01

FYI, to jest to, co google używa w niektórych swoich aplikacjach od dawna. Sprawdź w jsfiddle, że jeśli zastosujesz następne klasy, w jakiś sposób ukryją pasek przewijania w chrome, ale nadal działa.

jfk-scrollbar jfk-scrollbar-borderless jfk-scrollbar-dark

Http://jsfiddle.net/76kcuem0/32/

Po prostu uznałem, że warto usunąć strzałki z pasków przewijania. od 2015 roku jest używany w maps.google.com podczas wyszukiwania miejsc na liście wyników w interfejsie projektowania materiałów.

 2
Author: le0diaz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-25 05:01:06

Webkit scrollbar nie obsługuje większości przeglądarek.

Obsługuje CHROME

Oto demo webkit scrollbar WebKit scrollbar DEMO

Jeśli szukasz więcej przykładów sprawdź to więcej przykładów


Inną metodą jest jQuery Scroll Bar Plugin

Obsługuje wszystkie przeglądarki i jest łatwy do zastosowania

Pobierz plugin z Pobierz tutaj

Jak używać i więcej opcji sprawdź to

DEMO

 1
Author: Nikz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-03 10:26:53

Wypróbowałem wiele JS i CSS scroll i stwierdziłem, że jest to bardzo łatwe w użyciu i przetestowane na IE, Safari i FF i działało dobrze

Jak sugeruje @thebluefox

Oto Jak to działa

Dodaj poniższy skrypt do

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.18/jquery-ui.min.js"></script>
<script type="text/javascript" src="jquery.ui.touch-punch.min.js"></script>

<script type="text/javascript" src="facescroll.js"></script>

<script type="text/javascript">
    jQuery(function(){ // on page DOM load
        $('#demo1').alternateScroll();
        $('#demo2').alternateScroll({ 'vertical-bar-class': 'styled-v-bar', 'hide-bars': false });  
    })
</script>

I to tutaj w akapicie gdzie trzeba przewijać

<div id="demo1" style="width:300px; height:250px; padding:8px; resize:both; overflow:scroll">
**Your Paragraph Comes Here**
</div>

Po Więcej szczegółów odwiedź Stronę wtyczki

FaceScroll Custom scrollbar

Hope it help ' S

 1
Author: Yousef Altaf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-21 09:28:29
.className::-webkit-scrollbar {
  width: 10px;
  background-color: rgba(0,0,0,0);
}

.className::-webkit-scrollbar-thumb {
  background: rgba(255, 255, 255, 0.5);
  border-radius: 5px;
}

Dał mi ładny mobile / osx jak jeden.

 1
Author: csomakk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-28 12:41:25

Istnieje sposób, w jaki można zastosować niestandardowe paski przewijania do niestandardowych elementów div w dokumentach HTML. Oto przykład, który pomaga. https://codepen.io/adeelibr/pen/dKqZNb ale w skrócie. Możesz zrobić coś takiego.

<div class="scrollbar" id="style-1">
  <div class="force-overflow"></div>
</div>

Plik CSS wygląda tak.

.scrollbar
{
  margin-left: 30px;
  float: left;
  height: 300px;
  width: 65px;
  background: #F5F5F5;
  overflow-y: scroll;
  margin-bottom: 25px;
}

.force-overflow
{
  min-height: 450px;
}

#style-1::-webkit-scrollbar-track
{
  -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.3);
  border-radius: 10px;
  background-color: #F5F5F5;
}

#style-1::-webkit-scrollbar
{
  width: 12px;
  background-color: #F5F5F5;
}

#style-1::-webkit-scrollbar-thumb
{
  border-radius: 10px;
  -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,.3);
  background-color: #555;
}
 0
Author: Adeel Imran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-26 11:38:25

Lub użyj czegoś takiego:

var MiniScroll=function(a,b){function e(){c.scrollUpdate()}function f(){var a=new Date,b=Math.abs(a-c.animation.frame),d=c.countScrollHeight();c.animation.frame=a,c.render(b),d.height!=c.controls.height&&(e(),c.controls.height=d.height),requestAnimationFrame(f)}function g(){c.scrollUpdate()}function h(a){var b=c.target.scrollTop,d=Math.abs(a.wheelDeltaY/(10-c.speed));c.target.scrollTop=a.wheelDeltaY>0?b-d:b+d,c.scrollUpdate()}function i(a){if(a.target.classList.contains("scroll"))return a.preventDefault(),!1;var b=c.countScrollHeight();c.target.scrollTop=a.offsetY*b.mul-parseInt(b.height)/2,c.scrollUpdate()}b=b||{};var c=this,d={speed:"speed"in b?b.speed:7};this.target=document.querySelector(a),this.animation={frame:new Date,stack:[]},this.identity="scroll"+parseInt(1e5*Math.random()),this.controls={place:null,scroll:null,height:0},this.speed=d.speed,this.target.style.overflow="hidden",this.draw(),requestAnimationFrame(f),this.target.onscroll=g,this.target.addEventListener("wheel",h),this.controls.place.onclick=i};MiniScroll.prototype.scrollUpdate=function(){this.controls.place.style.height=this.target.offsetHeight+"px";var a=this.countScrollHeight();this.controls.scroll.style.height=a.height,this.controls.scroll.style.top=a.top},MiniScroll.prototype.countScrollHeight=function(){for(var a=this.target.childNodes,b=parseInt(this.target.offsetHeight),c=0,d=0;d<a.length;d++)a[d].id!=this.identity&&(c+=parseInt(a[d].offsetHeight)||0);var e=this.target.offsetHeight*parseFloat(1/(parseFloat(c)/this.target.offsetHeight)),f=this.controls.place.offsetHeight*(this.target.scrollTop/c)+"px";return{mul:c/this.target.offsetHeight,height:e>b?b+"px":e+"px",top:f}},MiniScroll.prototype.draw=function(){var a=document.createElement("div"),b=document.createElement("div");a.className="scroll-place",b.className="scroll",a.appendChild(b),a.id=this.identity,this.controls.place=a,this.controls.scroll=b,this.target.insertBefore(a,this.target.querySelector("*")),this.scrollUpdate()},MiniScroll.prototype.render=function(a){for(var b=0;b<this.animation.stack.length;b++){var c=this.animation.stack[b],d=parseInt(c.target);c.element.style[c.prop]=d+c.points}};

I inicjalizuj:

<body onload="new MiniScroll(this);"></body>

I dostosuj:

.scroll-place { // ... // }
.scroll { // ... // }
 -1
Author: Максим Владимирович,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-23 13:47:51