div中的CSS自定义滚动条

har*_*dev 314 html css scrollbar

如何通过CSS(层叠样式表)为一个div而不是整个页面自定义滚动条?

JSu*_*uar 675

我认为合并滚动条,CSS和浏览器兼容性的最新信息会很有帮助.

滚动条CSS支持

目前,没有跨浏览器滚动条CSS样式定义.我最后提到的W3C文章有以下声明,最近更新(2014年10月10日):

一些浏览器(IE,Konqueror)支持非标准属性'scrollbar-shadow-color','scrollbar-track-color'等.这些属性是非法的:它们既没有在任何CSS规范中定义,也没有标记为专有(通过在它们前面添加"-vendor-")

微软

正如其他人所提到的,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:
    }
Run Code Online (Sandbox Code Playgroud)

Chrome和Safari(WebKit)

同样,WebKit现在有自己的版本:

Firefox(Gecko)

从版本64开始,Firefox通过属性scrollbar-color(部分,W3C草案)和scrollbar-width(W3C草案)支持滚动条样式.有关实施的一些好信息可以在这个答案中找到.

跨浏览器滚动条样式

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;
}
Run Code Online (Sandbox Code Playgroud)

上面没有重复或类似的问题/来源

注意:此答案包含各种来源的信息.如果使用了源,那么它也会在此答案中链接.

  • 网络已经存在了二十多年,并且仍然没有标准的方式来设置滚动条的样式.二十年的标准委员会没有注意到人们滚动事物.没有任何缓慢,讽刺的鼓掌能够充分表达我的感受.但是,我认为第一次和第二次拍手之间的延迟是20年.从某些角度来看,当WWW出现时我还没出生,而且我现在是一名计算机工程师.要走的路,W3C. (208认同)
  • @ PaulD.Waite好吧,也许,但这可以适用于任何事情.CSS作为一种语言精确存在,以便设计师可以选择覆盖默认值.整个想法是,一个糟糕的UI设计师可以使任何元素不直观,但只要你认为网站设计师不称职,那么允许页面自定义有什么意义呢? (9认同)
  • @ PaulD.Waite显然,这不是其中之一.部分是因为它位于屏幕区域,网站设计师应该完全控制它,因此它不会带来任何安全风险,部分原因是因为在实践中明显 - 这不是问题.许多网站实施自己的黑客来制作看起来像滚动条的东西,并且它们工作正常.它们不仅工作正常,而且看起来更好,但人们实际上了解如何使用它们,这就是重点.不幸的是,因为它们是黑客,有时它们不能很好地打印功能. (6认同)
  • 请注意IE样式在Edge中不起作用:-( (6认同)
  • 这个答案并没有完全解决他的问题,即如何将滚动条样式应用于特定的*div*,而不是整个页面. (5认同)
  • 只是为了增加我的两分钱:Gmail和Youtube在Chrome中设置了风格化滚动条,在Explorer和Firefox中设置了原生滚动条.如果这些标准对他们来说足够好,那对我来说也足够好了 (3认同)
  • @ParthianShot:"二十年的标准委员会没有注意到人们滚动事物".也许他们确实注意到人们滚动的东西,并认为如果滚动条在每个网站上看起来都一样,那就更好了,因为那时人们总能识别它们并理解它们是如何工作的. (2认同)
  • 滚动条的 CSS 控制最终被 W3C 讨论并处于草案阶段:https://drafts.c​​sswg.org/css-scrollbars-1/ (2认同)

Dil*_*ala 13

试一试

资料来源:http://areaaperta.com/nicescroll/

简单实施

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

  function() { 

    $("html").niceScroll();

  }

);
</script>
Run Code Online (Sandbox Code Playgroud)

它是一个jQuery插件滚动条,因此您的滚动条是可控的,并且在各种操作系统中看起来相同.

  • 像几乎所有的jQuery插件一样 - *[shudders]* - 与本机,线程,GPU加速滚动实现相比,这是_awfully_慢._完全_不适合严肃的应用程序,并妨碍良好的用户体验.除非是玩具网站,否则我建议你不要这样做. (4认同)
  • 当人们称之为纯粹的javascript然后BAM时,我讨厌它!一个jquery插件. (2认同)

elc*_*nrs 11

使用CSS无法实现自定义滚动条,您需要一些JavaScript魔法.

有些浏览器支持非规范的CSS规则,例如::-webkit-scrollbar在Webkit中,但不是理想的,因为它只能在Webkit中使用.IE也有这样的东西,但我认为他们不再支持它了.

  • 过时的答案 (3认同)

Oua*_*die 5

我尝试了很多插件,其中大多数都不支持所有浏览器,我更喜欢iScrollnanoScroller适用于所有这些浏览器:

  • IE11 - > IE6
  • IE10 - WP8
  • IE9 - WP7
  • IE Xbox One
  • IE Xbox 360
  • 谷歌浏览器
  • 火狐
  • 歌剧
  • 苹果浏览器

iScroll无法使用触控功能!

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


ne1*_*10s 5

像许多人一样,我一直在寻找这样的东西:

  • 在大多数现代浏览器中风格一致且功能正常
  • 不是一些荒谬的3000行膨胀的jQuery扩展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);
	}
Run Code Online (Sandbox Code Playgroud)
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%;
}
Run Code Online (Sandbox Code Playgroud)
<div class="container">
  <div></div>
</div>
Run Code Online (Sandbox Code Playgroud)


小智 5

请检查此链接。工作演示示例

   #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;
}
Run Code Online (Sandbox Code Playgroud)

CSS滚动条

  • 感谢您的演示。我首先使用Firefox 58.0.2(64位,Windows 7 Pro / 64)运行它,并且***所有滚动条都相同。***然后使用Chrome 65.0.3325.162(官方内部版本)(64-位),他们都是不同的。因此(也许是无意中)您已经证明了-webkit-方法的局限性。 (2认同)

cso*_*akk 5

    .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;
    }
Run Code Online (Sandbox Code Playgroud)

给了我一个很好的手机/OSX 之类的。