UNPKG

@cqmcui/cqmcui

Version:

轻量级移动端 Vue2、Vue3 组件库(支持小程序开发)

157 lines (156 loc) 4.33 kB
import { reactive, computed, onMounted, onUnmounted, onActivated, onDeactivated, resolveComponent, openBlock, createElementBlock, normalizeClass, normalizeStyle, withModifiers, renderSlot, createVNode } from "vue"; import { c as createComponent } from "./component-81a4c1d0.js"; import { r as requestAniFrame, c as cancelRaf } from "./raf-729dad54.js"; import { Top } from "@cqmcui/icons-vue"; import { _ as _export_sfc } from "./_plugin-vue_export-helper-cc2b3d55.js"; import "../locale/lang"; const { componentName, create } = createComponent("backtop"); const _sfc_main = create({ components: { Top }, props: { bottom: { type: Number, default: 20 }, right: { type: Number, default: 10 }, elId: { type: [String], default: "body" }, distance: { type: Number, default: 200 }, zIndex: { type: Number, default: 10 }, isAnimation: { type: Boolean, default: true }, duration: { type: Number, default: 1e3 } }, emits: ["click"], setup(props, { emit }) { const state = reactive({ backTop: false, scrollTop: 0, scrollEl: window, startTime: 0, keepAlive: false }); const classes = computed(() => { const prefixCls = componentName; return { [prefixCls]: true, show: state.backTop }; }); const style = computed(() => { return { right: `${props.right}px`, bottom: `${props.bottom}px`, zIndex: props.zIndex }; }); function scrollListener() { if (state.scrollEl instanceof Window) { state.scrollTop = state.scrollEl.pageYOffset; } else { state.scrollTop = state.scrollEl.scrollTop; } state.backTop = state.scrollTop >= props.distance; } function scroll(y = 0) { if (state.scrollEl instanceof Window) { window.scrollTo(0, y); } else { state.scrollEl.scrollTop = y; } } function scrollAnimation() { let cid = requestAniFrame(function fn() { var t = props.duration - Math.max(0, state.startTime - +/* @__PURE__ */ new Date() + props.duration); var y = t * -state.scrollTop / props.duration + state.scrollTop; scroll(y); cid = requestAniFrame(fn); if (t == props.duration || y == 0) { cancelRaf(cid); } }); } function addEventListener() { state.scrollEl.addEventListener("scroll", scrollListener, false); state.scrollEl.addEventListener("resize", scrollListener, false); } function removeEventListener() { state.scrollEl.removeEventListener("scroll", scrollListener, false); state.scrollEl.removeEventListener("resize", scrollListener, false); } function click(e) { state.startTime = +/* @__PURE__ */ new Date(); props.isAnimation && props.duration > 0 ? scrollAnimation() : scroll(); emit("click", e); } function init() { if (props.elId && document.getElementById(props.elId)) { state.scrollEl = document.getElementById(props.elId); } addEventListener(); } onMounted(() => { if (props.distance == 0) { state.backTop = true; } init(); }); onUnmounted(() => { removeEventListener(); }); onActivated(() => { if (state.keepAlive) { state.keepAlive = false; init(); } }); onDeactivated(() => { state.keepAlive = true; removeEventListener(); }); return { state, classes, style, click }; } }); function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) { const _component_Top = resolveComponent("Top"); return openBlock(), createElementBlock("div", { class: normalizeClass(_ctx.classes), style: normalizeStyle(_ctx.style), onClick: _cache[0] || (_cache[0] = withModifiers((...args) => _ctx.click && _ctx.click(...args), ["stop"])) }, [ renderSlot(_ctx.$slots, "default", {}, () => [ createVNode(_component_Top, { width: "19px", height: "19px", class: "cqmc-backtop-main" }) ]) ], 6); } const index = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render]]); export { index as default };