自定义滚动条

Posted

技术标签:

【中文标题】自定义滚动条【英文标题】:Custom scrollbars 【发布时间】:2011-11-13 12:09:03 【问题描述】:

在我的应用程序中,无论滚动条出现在哪里,它都应该更改为。css 中有什么方法可以设置滚动条的样式。如果没有,请提供有关的任何建议。

我已经看到了的 jquery 插件,但是我需要更改的每个位置。相反,是否有任何方法可以使在一个位置更改会影响滚动条出现在我的所有位置应用。

【问题讨论】:

【参考方案1】:

我开发了一个custom scrollbar library named SimpleScrollbar。

不依赖任何其他库/框架,gzip压缩后小于1KB。

它使用了原生滚动,所以没有hack,性能很棒。


您只需要在您的页面中包含该库,并在您想要使其可滚动的任何 div 中使用 ss-container 属性。活生生的例子:

<link href="http://buzinas.github.io/simple-scrollbar/simple-scrollbar.css" rel="stylesheet"/>
<div style="height: 180px; width: 200px; display: inline-block;" ss-container>
  <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
</div>
<section style="height: 180px; width: 300px; display: inline-block;" ss-container>
  <p>Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?</p>
      <p>But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will give you a complete account of the system, and expound the actual teachings of the great explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or avoids pleasure itself, because it is pleasure, but because those who do not know how to pursue pleasure rationally encounter consequences that are extremely painful. Nor again is there anyone who loves or pursues or desires to obtain pain of itself, because it is pain, but because occasionally circumstances occur in which toil and pain can procure him some great pleasure. To take a trivial example, which of us ever undertakes laborious physical exercise, except to obtain some advantage from it? But who has any right to find fault with a man who chooses to enjoy a pleasure that has no annoying consequences, or one who avoids a pain that produces no resultant pleasure?</p>
</section>
<!--[if IE 9]><script src="https://cdn.jsdelivr.net/classlist/2014.01.31/classList.min.js"></script><![endif]-->
<script src="http://buzinas.github.io/simple-scrollbar/simple-scrollbar.min.js"></script>

它适用于所有现代浏览器(Firefox、Chrome、Opera、Safari、Edge)以及 IE10 和 IE11。您也可以通过包含一个 classList polyfill 在 IE9 中使用它。

支持所有 android、iOS 和 Windows Phone 浏览器。


如果你想自动找出所有已经有滚动条的元素,你可以这样做:

// After all the content in your page has loaded
document.addEventListener('DOMContentLoaded', function() 
  // Get all elements in your page
  var elements = document.querySelectorAll('*'), el;
  for (var i = 0; i < elements.length, el = elements[i]; i++) 
    // If the scrollheight is higher than the clientheight, it's because it has a scrollbar
    if (el.scrollHeight > el.clientHeight) 
      SimpleScrollbar.initEl(el); // turn the element into a SimpleScrollbar one
    
  
);

【讨论】:

SimpleScrollbar 是否也支持完全不显示滚动条(但在使用鼠标滚轮时保留功能),而是显示两个按钮(向上/向下一个元素和/或页面),例如Sly可以吗?我更喜欢使用你的,因为我真的很喜欢它不依赖于 jQuery。 你可以通过覆盖它的 CSS 来做到这一点,例如:.ss-container:hover .ss-scroll opacity: 0; 【参考方案2】:

您可以在WebKit 和older IEs 中设置滚动条的样式。

要影响所有滚动条,您应该能够使用选择器,例如body, textarea, .any-other-element-with-overflow-scroll

使用自定义滚动条时请考虑可能的usability issues。

【讨论】:

浏览器支持如何。如果我使用 webkit 样式 @Bhaskar 使用 WebKit 渲染引擎的设备。这包括 Google Chrome 和 Safari。 有没有办法在 Firefox 中设置样式 @Bhaskar Nope,但自 2001 年以来人们就有 wanted it。您可以使用 javascript 后备。 感谢 alex 提供的信息,我会尝试检查是否有任何插件可以自定义滚动条,如 jscrollpane(jquery 插件)【参考方案3】:

您可以使用webkit设置所有滚动条的样式

::-webkit-scrollbar 
  width: 20px;


/* Track */
::-webkit-scrollbar-track 
  box-shadow: inset 0 0 5px grey; 
  border-radius: 10px;


/* Handle */
::-webkit-scrollbar-thumb 
  background: red; 
  border-radius: 10px;


/* Handle on hover */
::-webkit-scrollbar-thumb:hover 
  background: #b30000; 

以上代码将更改应用程序中的所有滚动条。你只需要在某处添加它

这是 codepen

中相同的演示

https://codepen.io/DineshNadimpalli/pen/WNNabZM

【讨论】:

以上是关于自定义滚动条的主要内容,如果未能解决你的问题,请参考以下文章

滚动条自定义

Angular - 材质:进度条自定义颜色?

CSS3自定义滚动条样式 -webkit-scrollbar

自定义滚动条样式 --- 适用于webkit浏览器 Google Chrome 和 Opera

WPF之拖动项滚动条自滚动(当拖动项到达高度的边界时候滚动条自己可以上下滚动)

ios11 Swift 自定义导航条上移20点解决方法