element-ui的官网页面使用的这个滚动条,但是在官网文档中没有介绍这个组件。
在vue+elementui搭建的前端项目中使用这个el-scrollbar组件。
在项目中使用这个组件时由于各层的样式没有设置好,可能会显示出原生的滚动条,特此记录。
-
搭建脚手架项目,安装element-ui插件
-
按需引入需要的组件
import Vue from 'vue' import { Scrollbar } from 'element-ui' Vue.use(Scrollbar)
-
使用
<div class="main"> <el-scrollbar> 。。。要滚动的内容 </el-scrollbar> </div>
// less样式 .main { width: 100%; height: 100%; // 建议设置父级元素的高度,这样div.el-scrollbar就可以通过%来设置高度 padding: 0; overflow: hidden; .el-scrollbar { width: 100%; // 宽度可以设置也可以不设置 因为宽度默认就是填充满父级元素的内容区 height: 100%; // 必须设置el-scrollbar的高度 /deep/ .el-scrollbar__wrap { // 实际上我们的内容是放在这个div下面的 // height: 100%; // 渲染出来的div.el-scrollbar__wrap默认会添加height:100%的属性。我们可以设置为105%来隐藏元素水平滚动条 height: 100%; overflow: scroll; overflow-x:auto; } } }
-
渲染出来的dom结构
<div class="main"> <!-- el-scrollbar组件内部大致样子 --> <div class="el-scrollbar"> <div class="el-scroll__wrap" style="margin-bottom: -17px; margin-right: -17px;"> 。。。要滚动的内容 </div> <div class="el-scrollbar__bar is-horizontal"></div> <!--水平滚动条 通过position定位--> <div class="el-scrollbar__bar is-vertical"></div> <!--垂直滚动条 通过position定位--> </div> </div>
-
渲染出来的dom结构的理解
- el-scrollbar组件的内部封装了这样一个div
<div class="el-scrollbar__wrap" style="margin-bottom: -17px; margin-right: -17px;">
div.el-scrollbar__wrap
上添加一个margin-bottom和margin-right的样式,且值为负数(-17px),- 如果
div.el-scrollbar__wrap
没有设置宽度,那么设置margin-right为负值,会增加这个元素宽度(这里涉及到一个知识点:margin为负值时的作用),可以看到这个这个元素宽度变宽了,而div.el-scrollbar
这个元素默认设置了overflow: hidden。所以会隐藏掉div.el-scrollbar__wrap
的右边变宽的部分(也就是能隐藏掉原生的滚动条) - 我们看到的漂亮的滚动条实际上是两个细长div,这两个div的位置是通过绝对定位来确定的。
- el-scrollbar组件的内部封装了这样一个div
-
注意:
- 为
el-scrollbar
的父级块div.main
设置高度。 - 为
el-scrollbar
设置宽高,这样显示区域的大小就确定了。渲染出来的div.el-scrollbar默认会overflow:hidden属性,因此内部多余的部分会被隐藏掉(主要是用来隐藏div.el-scrollbar__wrap的原生滚动条的)。 - 在设置
div.el-scrollbar__wrap
的样式时前面必须加上/deep/
。/deep/是>>>深度选择器的别名。之所以要用上/deep/才能覆盖UI组件内部样式,是因为vue中用了scoped属性,导致当前vue文件里的style仅仅作用于当前组件的元素,而对部分element UI的组件无效。 - 我们写在el-scrollbar中的内容实际上被渲染到
div.el-scrollbar__wrap
中,所以当我们给div.el-scrollbar__wrap
设置了overflow属性为scroll时,el-srollbar身上会产生原生的滚动条。- 原生竖直滚动条:由于
div.el-scrollbar__wrap
身上默认会添加margin-right:15px的属性,所以在div.el-scrollbar__wrap
没有设置宽度的时候,它的宽度会向右增加15px,所以竖直方向的滚动条就被挤出去,隐藏掉了。 - 原生水平滚动条:原生水平的滚动条无法通过margin-bottom为负值来把它挤出可视区,因为无论
div.el-scrollbar__wrap
是否设置了高度,margin-bottom都不会影响自身的高度和定位。只有通过将div.el-scrollbar__wrap
的高度设置来略大于div.el-scrollbar,才能隐藏掉水平滚动条。
- 原生竖直滚动条:由于
- 为