CSS настроенная полоса прокрутки в div

Как настроить полосу прокрутки через CSS (Каскадные Таблицы Стилей) для одного div а не всю страницу?

14 ответов


Я подумал, что было бы полезно объединить последнюю информацию о полосах прокрутки, CSS и совместимости браузера.

поддержка CSS полосы прокрутки

В настоящее время не существует определений стилей CSS для кросс-браузера. статьи консорциума W3C я упоминаю в конце имеет следующее заявление и был недавно обновлен (10 октября 2014):

некоторые браузеры (т. е. Konqueror) поддерживают нестандартные свойства 'scrollbar-shadow-color', 'scrollbar-track-color' и другие. эти свойства являются незаконными: они не определены ни в какой спецификации CSS, ни отмечены как проприетарные (путем префикса их с "-vendor-")

Microsoft

как уже упоминалось, Microsoft поддерживает стиль полосы прокрутки, но только для IE8 и выше.

пример:

<!-- 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)

аналогично, WebKit сейчас имеет свою версию:

В Firefox (Движок Gecko)

Firefox не имеет собственной версии стилей полосы прокрутки в соответствии с этой так ответ.

нет геккона, эквивалентного ::-webkit-scrollbar и друзей.

вам придется придерживаться jQuery.

многие люди хотели бы эту функцию, см.:
https://bugzilla.mozilla.org/show_bug.cgi?id=77790

этот отчет просит то же самое, что и вы просите: https://bugzilla.mozilla.org/show_bug.cgi?id=547260

прокрутка через браузер Bar Styling

библиотеки JavaScript и плагины могут обеспечить кросс-браузерное решение. Вариантов много.

список можно продолжать. Ваш лучший выбор-искать, исследовать и протестировать имеющиеся решения. Я уверен, что вы сможете найти то, что будет соответствовать вашим потребностям.

Предотвратить Незаконный Стиль Полосы Прокрутки

на всякий случай, если вы хотите предотвратить стиль полосы прокрутки, который не был должным образом префиксом "- vendor",эта статья в W3C предоставляет некоторые основные инструкции. В принципе, вам нужно добавить следующий CSS в таблицу стилей пользователя, связанную с вашим браузером. Эти определения переопределят недопустимый стиль полосы прокрутки на любой странице вы посещаете.

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

дубликаты или аналогичные вопросы / источник не связан выше

Примечание: этот ответ содержит информацию из различных источников. Если источник был использован, то он также связанный в этом ответе.


пользовательские полосы прокрутки невозможны с CSS, вам понадобится магия JavaScript.

некоторые браузеры поддерживают нестандартные правила CSS, такие как ::-webkit-scrollbar в Webkit, но не идеально, так как он будет работать только в Webkit. У IE тоже было что-то подобное, но я не думаю, что они это поддерживают.


попробовать

источник : http://areaaperta.com/nicescroll/

Простая Установка

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

  function() { 

    $("html").niceScroll();

  }

);
</script>

это jQuery плагин полосы прокрутки, так что ваши полосы прокрутки являются управляемыми и выглядят одинаково в различных ОС.


Я думаю, что в этой теме не хватает одной вещи. Если вы случайно хотите реализовать прокрутку через плагин, на сегодняшний день лучшим в 2014 году является хитрый.

Это чистая полоса прокрутки javascript, поэтому ваши полосы прокрутки управляемы и выглядят одинаково в различных ОС.

Он имеет лучшую производительность и функции. Никто даже близко не подходит. Не тратьте время, выбирая из мириад полугорячих багги другие библиотеки.


Я перепробовал много плагинов, большинство из них не поддерживают все браузеры, я предпочитаю iScroll и nanoScroller работает для всех этих браузеров:

  • IE11 - > IE6
  • В IE10 - КР8
  • ИЕ9 - НА WP7
  • IE Xbox One
  • IE Xbox 360
  • Google Хром
  • в Firefox
  • Опера
  • сафари

но iScroll не работают с touch!

демо iScroll : http://lab.cubiq.org/iscroll/examples/simple/
демо nanoScroller : http://jamesflorentino.github.io/nanoScrollerJS/


вот пример webkit, который работает для Chrome и 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;
}

выход:

enter image description here


как и многие люди, я искал что-то, что было:

  • последовательно стилизованный и функциональный в большинстве современных браузеров
  • не какой-то смешной 3000-линейный раздутый jQuery extension cr * p

...Но увы - ничего!

хорошо, если работа стоит того... Я смог что-то поднять и запустить примерно за 30 минут. Отказ от ответственности: есть довольно много известных (и, вероятно, несколько пока неизвестных) проблем с ним, но это делает меня интересно, для чего во многих предложениях есть другие 2920 строк JS!

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>

пожалуйста, проверьте эту ссылку. Пример с рабочей демонстрацией

   #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 полосы прокрутки


FYI, это то, что google использует в некоторых своих приложениях с давних пор. Проверьте в jsfiddle, что если вы применяете следующие классы, они каким-то образом скрывают полосу прокрутки в chrome, но она все еще работает.

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

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

Я просто нашел полезным удалить стрелки из полос прокрутки. по состоянию на 2015 год он использовался в maps.google.com при поиске мест в списке результатов в it's material design ПОЛЬЗОВАТЕЛЬСКИЙ ИНТЕРФЕЙС.


webkit scrollbar не поддерживает большинство браузеров.

поддержка CHROME

вот демо для webkit scrollbar webkit Scrollbar DEMO

Если вы ищете больше примеров, проверьте это Примеры


другой метод -Плагин Полосы Прокрутки Jquery

Он поддерживает все браузеры и прост в применении

загрузите плагин из Скачать Тут

Как использовать и дополнительные варианты ПРОВЕРЬТЕ ЭТО

демо


Я пробовал много JS и CSS scroll, и я обнаружил, что это было очень просто в использовании и протестировано на IE и Safari и FF и отлично работало

как предлагает @thebluefox

вот как это работает

добавьте приведенный ниже скрипт в

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

и это здесь, в абзаце, где вам нужно прокрутить

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

для более подробной информации посетите страницу плагина

FaceScroll Заказ скроллбара

надеюсь, что это поможет


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

дал мне хороший мобильный/OSX, как один.


существует способ применения пользовательских полос прокрутки к пользовательским элементам div в HTML-документах. Вот пример, который помогает. https://codepen.io/adeelibr/pen/dKqZNb но как суть этого. Ты можешь сделать что-то подобное.

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

CSS файл выглядит так.

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

или использовать что-то вроде этого:

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

и инициализации:

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

и настройка:

.scroll-place { // ... // }
.scroll { // ... // }