Js将滚动条(scrollbar)保持在最底部的方法
首先,想要默认滚动到最底部,思路是判断页面/元素是否出现了滚动条,页面/元素高度有没有超过滚动高度,若有滚动条即把滚动条滚动到最底部。 现在我们来了解几个dom属性:
scrollTop
:获取或设置一个元素的内容垂直滚动的像素数,当一个元素的内容没有产生垂直方向的滚动条,那么它的 scrollTop 值为0scrollHeight
:这是一个只读属性,是元素内容高度的度量,包括由于溢出导致的视图中不可见的内容。注意:scrollHeight在没有滚动条的情况下,它的值跟下面要介绍的clientHeight相同。scrollHeight包括元素的padding,但不包括元素的border和marginclientHeight
:也是一个只读属性,返回元素内部的高度,包括padding,但不包括border跟margin
# Js版本
清楚这几个属性之后我们就可以知道要怎么完成以上思路了
var ele = document.getElementById("test");
//判断元素是否出现了滚动条
if(ele.scrollHeight > ele.clientHeight) {
//设置滚动条到最底部
ele.scrollTop = ele.scrollHeight;
}
1
2
3
4
5
6
2
3
4
5
6
在我应用这段代码是由于我是要在动态数据渲染完成后再默认显示最低部,中间渲染时间差会导致错误的滚动距离。于是我使用了延迟进行设置,如下:
if(ele.scrollHeight > ele.clientHeight) {
setTimeout(function(){
//设置滚动条到最底部
ele.scrollTop = ele.scrollHeight;
},500);
}
1
2
3
4
5
6
2
3
4
5
6
设置好后由于是过了500毫秒才执行的滚动到底部,这样就不是默认滚动的效果了,于是我在一开始的时候把元素透明度设置成透明,当滚动完毕再把它设置成可见,这样可以让用户看到是一开始默认是底部的效果
#test { opacity:0 }
1
if(ele.scrollHeight > ele.clientHeight) {
setTimeout(function(){
//设置滚动条到最底部
ele.scrollTop = ele.scrollHeight;
ele.style.opacity = 1;
},500);
}
1
2
3
4
5
6
7
2
3
4
5
6
7
# Css版本
使用 css3 的 felx 做的:
display: flex;
flex-flow: column-reverse;
align-items: baseline;
1
2
3
2
3
因为在我的项目中并不适用,我做的是类似于微信聊天界面效果,当没有滚动条时不需要设置,而如果使用这个是始终显示在最底部。
# 使用案例
<template>
<div class="log-warp" ref="logWarp">
<ul>
<li v-for="(item, i) in socketData" :key="i">
<span>【{{ item.time }} 】:</span>
<pre v-html="item.message"></pre>
</li>
</ul>
</div>
</template>
<script>
export default {
components: { },
data() {
return { };
},
props: ["socketData"],
watch: {
socketData() {
// this.$nextTick(() => {
this.isLogModal = true;
let ele = this.$refs.logWarp;
if (ele.scrollHeight > ele.clientHeight) {
// setTimeout(function () {
//设置滚动条到最底部
ele.scrollTop = ele.scrollHeight + 40;
// ele.style.opacity = 1;
// }, 500);
}
// });
},
},
};
</script>
<style lang="scss" scoped>
.log-warp {
height: 700px;
overflow-y: auto;
background: #000;
border-radius: 3px;
}
</style>
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
上次更新: 2024/01/30, 00:35:17
- 01
- linux 在没有 sudo 权限下安装 Ollama 框架12-23
- 02
- Express 与 vue3 使用 sse 实现消息推送(长连接)12-20