首先需要弄清楚是最外层滚动条是哪种,目前常用 2 种:
- el-scrollerbar
- el-table
# el-scrollbar 滚动到指定的位置
el-scrollbar 需要被包裹的可变层,高度设置为固定,且 transaction 需要放置在 el-scrollbar 里面
<el-scrollbar>,这个组件的滚动条比原生的还是好看些的。
# 开始使用
<el-scrollbar> | |
// 包裹你的内容 | |
</el-scrollbar> |
这个组件还有一个属性值可以传递,可以用来修改样式加一些 class 的类名,但是一般情况下不会用的太多。
props: { | |
native: Boolean, | |
wrapStyle: {}, // 外层盒子的样式 | |
wrapClass: {}, // 外层盒子的 class | |
viewClass: {}, // 内层盒子的 class | |
viewStyle: {}, // 内层盒子的样式 | |
noresize: Boolean, // 如果 container 尺寸不会发生变化,最好设置它可以优化性能 | |
tag: { | |
type: String, | |
default: 'div' | |
} | |
} |
el-scrollbar 将会作为你容器的最外层,也是滚动条的容器;
可以给 el-scrollbar 加上 ref 以及 class 来达到自己想要的结果。
特别需要注意的是:在 el-scrollbar 上定义 maxHeight 和 maxWidth 是不生效的,没有办法达到预期的一个效果
# 滚动到指定的位置
可以使用如下代码
this.$refs['scroll'].wrap.scrollTop = 0 // 想滚到哪个高度,就写多少 | |
或者 | |
this.$refs.scroll.wrap.scrollTop = 0 // 想滚到哪个高度,就写多少 | |
注意 .warp必须要加,否则不生效。 |
例子:滚动到顶部(有动画效果)
<el-scrollbarl ref="scroll"> | |
// ... | |
</el-scrollbar> | |
<el-button @click="toTop">滚动到顶部</el-button> | |
<script> | |
const cubic = value => Math.pow(value, 3); | |
const easeInOutCubic = value => value < 0.5 | |
? cubic(value * 2) / 2 | |
: 1 - cubic((1 - value) * 2) / 2; | |
//... | |
methods: { | |
toTop() { | |
//el-scrollbar 容器 | |
const el = this.$refs['scroll'].wrap; | |
const beginTime = Date.now(); | |
const beginValue = el.scrollTop; | |
const rAF = window.requestAnimationFrame || (func => setTimeout(func, 16)); | |
const frameFunc = () => { | |
const progress = (Date.now() - beginTime) / 500; | |
if (progress < 1) { | |
el.scrollTop = beginValue * (1 - easeInOutCubic(progress)); | |
rAF(frameFunc); | |
} else { | |
el.scrollTop = 0; | |
} | |
}; | |
rAF(frameFunc); | |
} | |
} | |
//... | |
</script> |
常见包裹在界面布局 layout 的 main 最外层,如下
<section class="app-main"> | |
<el-scrollbar ref="scroll" wrap-class="scrollbar-wrapper" style="background: #f3f4f8"> | |
<keep-alive :include="cachedViews"> | |
<router-view :key="key" :class="{ 'self-router': !isMicroApp }" /> | |
</keep-alive> | |
<div id="el-paas-portal-micro-app-container" /> | |
</el-scrollbar> | |
</section> |
# el-table 滚动到指定行
# 滚动到指定行
scrollToRow(index) { | |
this.$nextTick(() => { | |
const tableBodyWrapper = this.$refs.tableRef.$el.querySelector('.el-table__body-wrapper'); | |
if (tableBodyWrapper) { | |
const rows = tableBodyWrapper.querySelectorAll('.el-table__row'); | |
if (rows.length > 0) { | |
const targetRow = rows[index]; | |
this.$refs.table.bodyWrapper.scrollTop = targetRow.offsetTop; | |
/* or | |
const tableBody = tableBodyWrapper.querySelector('.el-table__body'); | |
tableBody.scrollTop = targetRow.offsetTop; | |
targetRow.classList.add('current-row'); | |
*/ | |
} | |
} | |
}) | |
}, |
# 滚动到第一行
this.$refs.table.bodyWrapper.scrollTop = 0; |
# 滚动到最后一行
this.$refs.table.bodyWrapper.scrollTop = this.$refs.table.bodyWrapper.scrollHeight; |