关于滚动条


2019-11-7 拓展

一:webkit下面的CSS设置滚动条

    主要有下面7个属性
    ::-webkit-scrollbar 滚动条整体部分,可以设置宽度啥的
    ::-webkit-scrollbar-button 滚动条两端的按钮
    ::-webkit-scrollbar-track 外层轨道
    ::-webkit-scrollbar-track-piece 内层滚动槽
    ::-webkit-scrollbar-thumb 滚动的滑块
    ::-webkit-scrollbar-corner 边角
    ::-webkit-resizer 定义右下角拖动块的样式
1
2
3
4
5
6
7
8

实例

  ::-webkit-scrollbar {
    width: 3px;
  }

  /* 滚动槽 */
  ::-webkit-scrollbar-track {
    border-radius: 10px;
    box-shadow: inset006pxrgba(0, 0, 0, 0.3);
  }

  /* 滚动条滑块 */
  ::-webkit-scrollbar-thumb {
    background: rgba($color: $theme, $alpha: 0.7);
    border-radius: 10px;
    box-shadow: inset006pxrgba(0, 0, 0, 0.5);
  }

  overflow-y: scroll;
  scrollbar-color: rgba($color: $theme, $alpha: 0.7)
    rgba($color: $theme, $alpha: 0.7);
  -moz-appearance: none !important;

  ::-moz-scrollbar[orient="vertical"] {
    width: 3px !important;
  }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

二:IE下面的CSS设置滚动条

IE下面就比较简单那了,自定义的项目比较少,全是颜色。

scrollbar-arrow-color: color; /三角箭头的颜色/
scrollbar-face-color: color; /立体滚动条的颜色(包括箭头部分的背景色)/
scrollbar-3dlight-color: color; /立体滚动条亮边的颜色/
scrollbar-highlight-color: color; /滚动条的高亮颜色(左阴影?)/
scrollbar-shadow-color: color; /立体滚动条阴影的颜色/
scrollbar-darkshadow-color: color; /立体滚动条外阴影的颜色/
scrollbar-track-color: color; /立体滚动条背景颜色/
scrollbar-base-color:color; /滚动条的基色/
1
2
3
4
5
6
7
8
9
10

三:css优化滚动效果

scroll-behavior:smooth;//写在滚动容器元素上,可以让容器(非鼠标手势触发)的滚动变得平滑
-webkit-overflow-scrolling: touch; //让滚动具有惯性
overscroll-behavior: contain;//我们会发现当子元素滚动到顶部或底部继续滚动滚轮时,会导致父元素的滚动,但这种行为有时会影响页面体验。使用该属性可以禁掉此行为。在子元素上应用这个属性即可,在移动端还可以禁用下拉刷新的功能,只要在body元素上应用overscroll-behavior-y: contain;即可
1
2
3

如果觉得滚动条不需要,可以设置隐藏

/* webkit */
.container::-webkit-scrollbar {
    display: none; //Safari and Chrome
}
/* IE或者Firefox */
.container {
    -ms-overflow-style: none; //IE 10+
    overflow: -moz-scrollbars-none; //Firefox
}
1
2
3
4
5
6
7
8
9

在移动端时,优化用户触碰手势,可以使用这个属性:touch-action

四:scrollIntoView

上面说到:scroll-behavior 是指定滚动函数的默认行为,这其中就包括 scrollIntoView。顾名思义:这个函数就是把某个元素滚动到窗口的可见区域。

它接受两种形式的值:布尔值或对象。接受布尔值主要还是为了兼容不支持平滑滚动(老版)的浏览器。我们这里只说对象值、

{
  behavior: "auto" | "instant" | "smooth", // 默认 auto
  block: "start" | "center" | "end" | "nearest", // 默认 center
  inline: "start" | "center" | "end" | "nearest", // 默认 nearest
}
1
2
3
4
5

对象可以有三个参数。

  • behavior 表示滚动方式。auto 表示使用当前元素的 scroll-behavior 样式。instant 和 smooth 表示 直接滚到底 和 使用平滑滚动。
  • block 表示块级元素排列方向要滚动到的位置。对于默认的 writing-mode: horizontal-tb 来说,就是竖直方向。start 表示将视口的顶部和元素顶部对齐;center 表示将视口的中间和元素的中间对齐;end 表示将视口的底部和元素底部对齐;nearest 表示就近对齐。
  • inline 表示行内元素排列方向要滚动到的位置。对于默认的 writing-mode: horizontal-tb 来说,就是水平方向。其值与 block 类似。 目前浏览器支持度欠佳;案例

五:scrollIntoViewIfNeeded()

scrollIntoViewIfNeeded(true)方法只在当前元素在视口中不可见的情况下,才滚动浏览器窗口或容器元素,最终让它可见。如果当前元素在视口中可见,这个方法什么也不做,如果将可选的alignCenter参数设置为true,则表示尽量将元素显示在视口中部(垂直方向),[注意]该方法只有chrome和safari支持

<body style="height:1000px">
<div id="test" style="height:100px;width:100px;position:absolute;left:0;top:500px;background-color:green"></div>
<button id='btn' style="position:fixed">滚动到页面中间</button>
<script>
var btn=document.getElementById('btn')
var test=document.getElementById('test')
btn.onclick = function(){
    test.scrollIntoViewIfNeeded(true)
};
</script>
1
2
3
4
5
6
7
8
9
10

六:滚动方法

scrollTo(x,y)

scrollTo(x,y)方法滚动当前window中显示的文档,让文档中由坐标x和y指定的点位于显示区域的左上角

<body style="height:1000px">
<button id='btn' style="position:fixed">滚动</button>
<script>
var btn=document.getElementById('btn')
btn.onclick = function(){scrollTo(0,0);}
</script>
1
2
3
4
5
6

scrollBy(x,y)

scrollBy(x,y)方法滚动当前window中显示的文档,x和y指定滚动的相对量

<body style="height:1000px">
<button id='btn1' style="position:fixed">向下滚动</button>
<button id='btn2' style="position:fixed;top:40px">向上滚动</button>
<script>
var btn1=document.getElementById('btn1')
var btn2=document.getElementById('btn2')
btn1.onclick = function(){scrollBy(0,100);}
btn2.onclick = function(){scrollBy(0,-100);}
</script>
1
2
3
4
5
6
7
8
9

利用scrollBy()加setInterval计时器实现简单的快速滚动功能

<body style="height:1000px">
<button id='btn1' style="position:fixed">开始滚动</button>
<button id='btn2' style="position:fixed;top:40px">停止滚动</button>
<script>
var timer = 0;
var btn1=document.getElementById('btn1')
var btn2=document.getElementById('btn2')
btn1.onclick = function(){
    timer = setInterval(function(){
        scrollBy(0,10);
    },100)}
btn2.onclick = function(){
    clearInterval(timer);
    timer = 0;
}
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

兼容写法

理论上,通过document.documentElement.scrollTop和scrollLeft可以反映和控制页面的滚动;但是chrome和safari浏览器是通过document.body.scrollTop和scrollLeft来控制的

var docScrollTop = document.documentElement.scrollTop || document.body.scrollTop
1
Thomas: 11/7/2019, 7:14:25 PM