1
This commit is contained in:
1
package/component/es/scroll/index.css
Normal file
1
package/component/es/scroll/index.css
Normal file
@@ -0,0 +1 @@
|
||||
.layui-scroll{height:100%;overflow:hidden!important}.layui-scroll-y{position:relative;height:100%}.layui-scroll-y .layui-scroll-wrap{height:100%;overflow-y:scroll;scrollbar-width:none;-ms-overflow-style:none}.layui-scroll-y .layui-scroll-track{position:absolute;top:0;right:0;bottom:0;border-radius:8px;z-index:20}.layui-scroll-y .layui-scroll-track .layui-scroll-thumb{margin:0 auto;border-radius:6px;cursor:default}.layui-scroll-y ::-webkit-scrollbar{display:none}
|
||||
3
package/component/es/scroll/index.js
Normal file
3
package/component/es/scroll/index.js
Normal file
@@ -0,0 +1,3 @@
|
||||
import "../badge/index2.js";
|
||||
export { c as default } from "./index2.js";
|
||||
import "vue";
|
||||
162
package/component/es/scroll/index2.js
Normal file
162
package/component/es/scroll/index2.js
Normal file
@@ -0,0 +1,162 @@
|
||||
import { w as withInstall } from "../badge/index2.js";
|
||||
import { defineComponent, ref, reactive, onMounted, nextTick, onUnmounted, openBlock, createElementBlock, normalizeClass, normalizeStyle, createElementVNode, renderSlot, withModifiers } from "vue";
|
||||
var index = /* @__PURE__ */ (() => ".layui-scroll{height:100%;overflow:hidden!important}.layui-scroll-y{position:relative;height:100%}.layui-scroll-y .layui-scroll-wrap{height:100%;overflow-y:scroll;scrollbar-width:none;-ms-overflow-style:none}.layui-scroll-y .layui-scroll-track{position:absolute;top:0;right:0;bottom:0;border-radius:8px;z-index:20}.layui-scroll-y .layui-scroll-track .layui-scroll-thumb{margin:0 auto;border-radius:6px;cursor:default}.layui-scroll-y ::-webkit-scrollbar{display:none}\n")();
|
||||
const _hoisted_1 = { class: "layui-scroll-y" };
|
||||
const _hoisted_2 = ["onMousedown"];
|
||||
const __default__ = {
|
||||
name: "LayScroll"
|
||||
};
|
||||
const _sfc_main = defineComponent({
|
||||
...__default__,
|
||||
props: {
|
||||
height: { default: "100%" },
|
||||
trackColor: { default: "rgba(0,0,0,0)" },
|
||||
thumbColor: { default: "#eeeeee" },
|
||||
thumbWidth: { default: 6 }
|
||||
},
|
||||
emits: ["arrive"],
|
||||
setup(__props, { emit }) {
|
||||
const scrollRef = ref();
|
||||
const barRef = ref();
|
||||
const data = reactive({
|
||||
translateY: 0,
|
||||
heightPre: 0,
|
||||
barHeight: 0,
|
||||
winWidth: document.body.clientWidth
|
||||
});
|
||||
let time;
|
||||
let isMove = false;
|
||||
let moveClientY = 0;
|
||||
let trackHeight = 0;
|
||||
let wrapHeight = 0;
|
||||
let wrapContentHeight = 0;
|
||||
onMounted(() => {
|
||||
monitorWindow();
|
||||
monitorScrollBar();
|
||||
nextTick(() => {
|
||||
calculationLength();
|
||||
});
|
||||
});
|
||||
onUnmounted(() => {
|
||||
window.clearInterval(time);
|
||||
});
|
||||
const monitorWindow = function() {
|
||||
let time2;
|
||||
window.addEventListener("resize", () => {
|
||||
data.winWidth = document.body.clientWidth;
|
||||
clearTimeout(time2);
|
||||
time2 = setTimeout(() => {
|
||||
initScrollListner();
|
||||
}, 500);
|
||||
});
|
||||
};
|
||||
const monitorScrollBar = function() {
|
||||
let MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver;
|
||||
const observer = new MutationObserver((mutations) => {
|
||||
initScrollListner();
|
||||
});
|
||||
observer.observe(scrollRef.value, {
|
||||
attributes: true,
|
||||
childList: true,
|
||||
subtree: true
|
||||
});
|
||||
};
|
||||
const calculationLength = function() {
|
||||
time = setInterval(() => {
|
||||
initScrollListner();
|
||||
}, 50);
|
||||
setTimeout(() => {
|
||||
window.clearInterval(time);
|
||||
}, 2e3);
|
||||
};
|
||||
const initScrollListner = function() {
|
||||
let scroll = scrollRef.value;
|
||||
let bar = barRef.value;
|
||||
if (scroll && bar) {
|
||||
wrapContentHeight = scroll.scrollHeight;
|
||||
wrapHeight = scroll.clientHeight;
|
||||
trackHeight = bar.clientHeight;
|
||||
data.heightPre = wrapHeight / wrapContentHeight;
|
||||
data.barHeight = data.heightPre * trackHeight;
|
||||
}
|
||||
};
|
||||
const onMosewheel = (e) => {
|
||||
data.translateY = e.target.scrollTop * data.heightPre;
|
||||
if (data.translateY == 0) {
|
||||
arrive("top");
|
||||
} else if (e.target.scrollTop + e.target.offsetHeight == e.target.scrollHeight) {
|
||||
arrive("bottom");
|
||||
}
|
||||
};
|
||||
const arrive = (tb) => {
|
||||
emit("arrive", tb);
|
||||
};
|
||||
const moveStart = (e) => {
|
||||
isMove = true;
|
||||
moveClientY = e.clientY - data.translateY;
|
||||
moveTo();
|
||||
moveEnd();
|
||||
};
|
||||
const moveTo = () => {
|
||||
document.onmousemove = (e) => {
|
||||
if (isMove) {
|
||||
if (e.clientY - moveClientY > trackHeight - data.barHeight) {
|
||||
data.translateY = trackHeight - data.barHeight;
|
||||
} else if (e.clientY - moveClientY < 0) {
|
||||
data.translateY = 0;
|
||||
} else {
|
||||
data.translateY = e.clientY - moveClientY;
|
||||
}
|
||||
if (scrollRef.value) {
|
||||
scrollRef.value.scrollTop = data.translateY / data.heightPre;
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
||||
const moveEnd = function() {
|
||||
document.onmouseup = (e) => {
|
||||
if (isMove) {
|
||||
isMove = false;
|
||||
}
|
||||
};
|
||||
};
|
||||
return (_ctx, _cache) => {
|
||||
return openBlock(), createElementBlock("div", {
|
||||
class: normalizeClass(["layui-scroll", { hide: data.winWidth < 500 }]),
|
||||
style: normalizeStyle({ height: __props.height })
|
||||
}, [
|
||||
createElementVNode("div", _hoisted_1, [
|
||||
createElementVNode("div", {
|
||||
ref_key: "scrollRef",
|
||||
ref: scrollRef,
|
||||
class: "layui-scroll-wrap",
|
||||
onScroll: onMosewheel
|
||||
}, [
|
||||
renderSlot(_ctx.$slots, "default")
|
||||
], 544),
|
||||
createElementVNode("div", {
|
||||
ref_key: "barRef",
|
||||
ref: barRef,
|
||||
class: "layui-scroll-track",
|
||||
style: normalizeStyle({
|
||||
backgroundColor: data.heightPre == 1 ? "transparent" : __props.trackColor
|
||||
})
|
||||
}, [
|
||||
createElementVNode("div", {
|
||||
style: normalizeStyle({
|
||||
height: data.barHeight + "px",
|
||||
width: __props.thumbWidth + "px",
|
||||
transform: "translateY(" + data.translateY + "px)",
|
||||
backgroundColor: data.heightPre == 1 ? "transparent" : __props.thumbColor
|
||||
}),
|
||||
class: "layui-scroll-thumb",
|
||||
onMousedown: withModifiers(moveStart, ["stop", "prevent"])
|
||||
}, null, 44, _hoisted_2)
|
||||
], 4)
|
||||
])
|
||||
], 6);
|
||||
};
|
||||
}
|
||||
});
|
||||
const component = withInstall(_sfc_main);
|
||||
export { _sfc_main as _, component as c };
|
||||
Reference in New Issue
Block a user