元素圆角与内部滚动条的矛盾

Posted 前端向朔

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了元素圆角与内部滚动条的矛盾相关的知识,希望对你有一定的参考价值。

文章目录

概述

我们在写 web 页面的时候,除了页面原生的滚动条,比如 html 的滚动条,BODY 的滚动条之外,还有一种比较常见的滚动条,那就是元素内部滚动条,我们在利用元素内部滚动条的时候会遇到什么问题呢,我们如何自定义滚动条。

元素圆角与滚动条

比如迅雷客户端,除了最右边的滚动条是页面滚动条,其他两个都是元素内部滚动条。

在面板区域,我们的内部滚动条,因为外部元素的圆角给裁剪掉了,这在视觉上是不行的,那我们想办法解决。

方案一

给这个元素添加一个 margin 让元素与底部有一定距离,这个距离我们认为是圆角的大小,即能解决问题,但是这也会造成元素底部一直有空隙,而不是一个完整的可滚动区域,视觉体验上还是欠佳。

方案二

想到原生滚动条上下有两个箭头,那我们是不是可以把这个箭头改造一下,让它的高度等于圆角的大小,同时透明不可见呢,这样我们就实现了滚动条距离底部有一定距离,不会被外部圆角所裁剪,也能保证完整的滚动区域,保证用户体验。

这是 Chrome 默认的滚动条样式,当然我们还应该知道,滚动条应该四个箭头,上面两个,下面两个,都是用来自增或自减的。

方案实现

自定义滚动条,我们平时用的多的可能是自定义滚动条的轨道,颜色,大小等,但上下箭头一般是隐藏的,所以我们需要去查一下浏览器对于滚动条有哪些CSS选择器

::-webkit-scrollbar — 整个滚动条.
::-webkit-scrollbar-button — 滚动条上的按钮 (上下箭头).
::-webkit-scrollbar-thumb — 滚动条上的滚动滑块.
::-webkit-scrollbar-track — 滚动条轨道.
::-webkit-scrollbar-track-piece — 滚动条没有滑块的轨道部分.
::-webkit-scrollbar-corner — 当同时有垂直滚动条和水平滚动条时交汇的部分.
::-webkit-resizer — 某些元素的corner部分的部分样式(例:textarea的可拖动按钮).

除了常用的 ::-webkit-scrollbar::-webkit-scrollbar-thumb::-webkit-scrollbar-track 之外,我们还找到了我们想要的选择器 ::-webkit-scrollbar-button

我们只需要将滚动条四个箭头隐藏三个就行,先认识一下这些选择器

// 滚动条所有箭头按钮
::-webkit-scrollbar-button

// 垂直方向的滚动条箭头
::-webkit-scrollbar-button:vertical 

// 垂直滚动条上方箭头
::-webkit-scrollbar-button:vertical:start

// 垂直滚动条上方渐箭头
::-webkit-scrollbar-button:vertical:start:increment

// 垂直滚动条上方渐减箭头
::-webkit-scrollbar-button:vertical:start:decrement

// 垂直滚动条下方箭头
::-webkit-scrollbar-button:vertical:end

// 垂直滚动条下方渐增箭头
::-webkit-scrollbar-button:vertical:end:increment

// 垂直滚动条下方渐减箭头
::-webkit-scrollbar-button:vertical:end:decrement

代码实现:

// 隐藏所有箭头按钮
::-webkit-scrollbar-button
	display: none;

// 垂直滚动条下方渐增或渐减箭头显示其一
::-webkit-scrollbar-button:vertical:end:increment
	display: block;
	height: 5px;
    background-color: transparent;

最终效果:

自定义滚动条扩展

参考:https://www.cnblogs.com/rubylouvre/archive/2011/03/01/1968057.html

<!doctype html>
<html>
  <head>
    <title>自定义滚动条</title>
 
  </head>
  <body>
  <style>
    /* Turn on a 13x13 scrollbar */
    ::-webkit-scrollbar 
      width: 13px;/*对垂直流动条有效*/
      height: 13px;/*对水平流动条有效*/
    
    /*垂直滚动条的按钮*/
    ::-webkit-scrollbar-button:vertical 
      background-color: red;
      border: 1px dashed blue;
    
    /*CSS的坐标系,左上角为(0,0),往右往下为增加,往上往左为减少*/
    /*显示滚动条上方的渐增按钮*/
    ::-webkit-scrollbar-button:start:decrement,
    /*显示滚动条上方的渐减按钮*/
    ::-webkit-scrollbar-button:end:increment 
      display: block
    
 
    /*隐藏滚动条上方的渐增按钮*/
    ::-webkit-scrollbar-button:vertical:start:increment,
    ::-webkit-scrollbar-button:vertical:end:decrement 
      display: none;
    
    
    /* 定义垂直滚动条渐增按扭的样式 */
    ::-webkit-scrollbar-button:vertical:increment 
      background-color: white;
      border: 1px dashed blue;
    
 
    /* 定义垂直滚动条渐减按扭的样式 */
    ::-webkit-scrollbar-button:vertical:decrement 
      background-color: purple;
      border: 1px dashed blue;
    
    /*  scrollbar-track    上面是 scrollbar-track-piece  */
    /*  scrollbar-track-piece 上面是 四个按扭与scrollbar-track-piece:start与scrollbar-track-piece:end与scrollbar-thumb */
    /* 垂直滚动条的第一层轨道*/
    ::-webkit-scrollbar-track:vertical 
      background-color: blue;
      border: 1px dashed pink;
    
 
 
    /* 垂直滚动条的第二层轨道 */
    ::-webkit-scrollbar-track-piece 
      background-color: green;
    
    /* 垂直滚动条的第三层轨道的上段 */
    ::-webkit-scrollbar-track-piece:vertical:start 
      border: 1px solid #000;
    
 
    /* 垂直滚动条的第三层轨道的下段 */
    ::-webkit-scrollbar-track-piece:vertical:end 
      border: 1px dashed pink;
    
 
    /* 垂直滚动条的滑动块 */
    ::-webkit-scrollbar-thumb:vertical 
      height: 50px;
      background-color: yellow;
    
 
    /* Corner */
    ::-webkit-scrollbar-corner:vertical 
      background-color: black;
    
    /*  http://www.cssportal.com/css-properties/resize.htm  */
    /* Resizer */
    ::-webkit-scrollbar-resizer:vertical 
      background-color:orange;
    
  </style>
 
 
  <div style="width:200px;height: 200px;overflow: scroll;resize:both;">
    <div style="background: red;width:400px;height: 400px;"></div>
  </div>
</body>
</html>

遗留问题

目前我还有一个疑问就是,内部滚动条,默认都是贴边的,这在一定程度上是不满足视觉要求的,操作起来也不是很好,因为我们自定义滚动条一般定义的不会很宽。

当然通过多一层容器包裹,外层容器首先就有一个margin,里面的滚动条自然会与边界有边距,这是目前我所采用的方案,期待有更好的解决办法。

以上是关于元素圆角与内部滚动条的矛盾的主要内容,如果未能解决你的问题,请参考以下文章

css 设置overflow:scroll 滚动条的样式

滚动条样式

更改滚动条样式

让多个元素贴边平分布局

自定义滚动条样式

Chrome自定义滚动条