✨(component): 优化 scroll 组件内容改变时重新计算滚动条
This commit is contained in:
parent
48966c93ec
commit
3f608a5935
@ -1,30 +1,18 @@
|
|||||||
<template>
|
<template>
|
||||||
<div
|
<div class="layui-scroll" :class="{ hide: data.winWidth < 500 }" :style="{ height: height }">
|
||||||
class="layui-scroll"
|
|
||||||
:class="{ hide: data.winWidth < 500 }"
|
|
||||||
:style="{ height: height }"
|
|
||||||
>
|
|
||||||
<div class="layui-scroll-y">
|
<div class="layui-scroll-y">
|
||||||
<div ref="scrollRef" class="layui-scroll-wrap" @scroll="onMosewheel">
|
<div ref="scrollRef" class="layui-scroll-wrap" @scroll="onMosewheel">
|
||||||
<slot></slot>
|
<slot></slot>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div ref="barRef" class="layui-scroll-track" :style="{
|
||||||
ref="barRef"
|
|
||||||
class="layui-scroll-track"
|
|
||||||
:style="{
|
|
||||||
backgroundColor: data.heightPre == 1 ? 'rgba(0,0,0,0)' : trackColor,
|
backgroundColor: data.heightPre == 1 ? 'rgba(0,0,0,0)' : trackColor,
|
||||||
}"
|
}">
|
||||||
>
|
<div :style="{
|
||||||
<div
|
|
||||||
:style="{
|
|
||||||
height: data.barHeight + 'px',
|
height: data.barHeight + 'px',
|
||||||
width: thumbWidth + 'px',
|
width: thumbWidth + 'px',
|
||||||
transform: 'translateY(' + data.translateY + 'px)',
|
transform: 'translateY(' + data.translateY + 'px)',
|
||||||
backgroundColor: data.heightPre == 1 ? 'rgba(0,0,0,0)' : thumbColor,
|
backgroundColor: data.heightPre == 1 ? 'rgba(0,0,0,0)' : thumbColor,
|
||||||
}"
|
}" class="layui-scroll-thumb" @mousedown.stop.prevent="moveStart"></div>
|
||||||
class="layui-scroll-thumb"
|
|
||||||
@mousedown.stop.prevent="moveStart"
|
|
||||||
></div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -74,7 +62,7 @@ let wrapHeight = 0; // 容器高度(可视高度)
|
|||||||
let wrapContentHeight = 0; // 内容高度(可滚动内容的高度)
|
let wrapContentHeight = 0; // 内容高度(可滚动内容的高度)
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
monitorWindow()
|
monitorWindow();
|
||||||
monitorScrollBar();
|
monitorScrollBar();
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
calculationLength();
|
calculationLength();
|
||||||
@ -88,13 +76,11 @@ onUnmounted(() => {
|
|||||||
|
|
||||||
// 监听页面尺寸改变计算滚动条
|
// 监听页面尺寸改变计算滚动条
|
||||||
const monitorWindow = function () {
|
const monitorWindow = function () {
|
||||||
let time: NodeJS.Timeout; //定时器,防抖,窗口持续变化,延迟更新滚动条
|
let time: NodeJS.Timeout;
|
||||||
window.addEventListener("resize", () => {
|
window.addEventListener("resize", () => {
|
||||||
data.winWidth = document.body.clientWidth; //页面改变监听宽度控制移动端隐藏滚动条
|
data.winWidth = document.body.clientWidth;
|
||||||
clearTimeout(time);
|
clearTimeout(time);
|
||||||
time = setTimeout(() => {
|
time = setTimeout(() => {
|
||||||
//页面宽度变化继续监听,如果小于500就关闭自定义滚动条
|
|
||||||
// console.log("浏览器窗口变化更新滚动条");
|
|
||||||
initScrollListner();
|
initScrollListner();
|
||||||
}, 500);
|
}, 500);
|
||||||
});
|
});
|
||||||
@ -103,16 +89,22 @@ const monitorWindow = function () {
|
|||||||
//监听内容元素尺寸变化
|
//监听内容元素尺寸变化
|
||||||
const monitorScrollBar = function () {
|
const monitorScrollBar = function () {
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
var monitorUl = scrollRef.value.children[0];
|
var monitorUl = scrollRef.value;
|
||||||
|
let MutationObserver =
|
||||||
|
window.MutationObserver ||
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
let MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver;
|
window.WebKitMutationObserver ||
|
||||||
|
// @ts-ignore
|
||||||
|
window.MozMutationObserver;
|
||||||
let observer = new MutationObserver((mutations) => {
|
let observer = new MutationObserver((mutations) => {
|
||||||
initScrollListner();
|
initScrollListner();
|
||||||
});
|
});
|
||||||
|
if (monitorUl) {
|
||||||
observer.observe(monitorUl, {
|
observer.observe(monitorUl, {
|
||||||
attributes: true,
|
attributes: true,
|
||||||
childList: true,
|
childList: true,
|
||||||
});
|
});
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// 初始化延迟监听滚动条
|
// 初始化延迟监听滚动条
|
||||||
|
@ -13,8 +13,10 @@
|
|||||||
::: demo 使用 `lay-scroll` 标签, 创建一个虚拟滚动容器
|
::: demo 使用 `lay-scroll` 标签, 创建一个虚拟滚动容器
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
<lay-button @click="changeTotal">修改数据</lay-button>
|
||||||
|
<lay-button @click="changeMaxTotal">修改数据</lay-button>
|
||||||
<lay-scroll height="200px" style="background-color:whitesmoke;">
|
<lay-scroll height="200px" style="background-color:whitesmoke;">
|
||||||
<lay-panel v-for="(n,index) in 50" :key="n" style="margin:10px;padding:10px;">内容</lay-panel>
|
<lay-panel v-for="(n,index) in total" :key="n" style="margin:10px;padding:10px;">内容</lay-panel>
|
||||||
</lay-scroll>
|
</lay-scroll>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -23,8 +25,20 @@ import { ref } from 'vue'
|
|||||||
|
|
||||||
export default {
|
export default {
|
||||||
setup() {
|
setup() {
|
||||||
|
const total = ref(50);
|
||||||
|
|
||||||
|
const changeTotal = () => {
|
||||||
|
total.value = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
const changeMaxTotal = () => {
|
||||||
|
total.value = 50;
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
total,
|
||||||
|
changeTotal,
|
||||||
|
changeMaxTotal
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user