core/client/components/collection/KScrollToTop.vue
<template> <div class="k-scroll-to-top"> <KAction v-if="isVisible" id="scroll-to-top" tooltip="KScrollToTop.TOOLTIP" :icon="icon" :color="color" :flat="false" :size="size" :handler="scrollToTop" /></div></template> <script setup>import _ from 'lodash'import logger from 'loglevel'import { ref, watch } from 'vue'import { useQuasar, scroll as qScrollUtils } from 'quasar'import { DefaultZIndex } from '../../layout.js' // Propsconst props = defineProps({ target: { type: String, required: true }, color: { type: String, default: 'grey-7' }, icon: { type: String, default: 'las la-arrow-up' }, size: { type: String, default: 'md' }, duration: { type: Number, default: 300 }, zIndex: { type: Number, default: () => { return DefaultZIndex.fab } }}) // Dataconst $q = useQuasar()const isVisible = ref(false) // Watchwatch(() => [$q.screen.width, $q.screen.height], () => { refresh()}) // Functionsconst refresh = _.debounce(() => { const targetElement = document.getElementById(props.target) if (!targetElement) { logger.error('[KDK] Cannot find target element') return } isVisible.value = qScrollUtils.getVerticalScrollPosition(targetElement) > 0 logger.trace(`[KDK] (KScrollToTop) Refreshed with visibility: ${isVisible.value}`)}, 100)function scrollToTop () { const targetElement = document.getElementById(props.target) if (!targetElement) { logger.error('[KDK] Cannot find target element') return } qScrollUtils.setVerticalScrollPosition(targetElement, 0, props.duration) logger.trace('[KDK] (KScrollToTop) Scrolled to top') refresh()} // ExposedefineExpose({ refresh})</script> <style lang="scss" scoped>.k-scroll-to-top { position: relative; transform: translate(-48px, -24px); z-index: v-bind(zIndex);}</style>