From bb3bc959121eee98712e95a7d13b43b65b03988b Mon Sep 17 00:00:00 2001 From: paidge <paidge_cs@hotmail.com> Date: Mon, 31 Jan 2022 15:22:53 +0100 Subject: [PATCH] add scrollToTop button --- layouts/default.vue | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/layouts/default.vue b/layouts/default.vue index 146d875..f8fac1f 100644 --- a/layouts/default.vue +++ b/layouts/default.vue @@ -2,6 +2,12 @@ <div class="app"> <NavigationBar :breadcrumb="breadcrumb" :menus="menus" /> <Nuxt /> + <a + class="scrollToTop bg-primary position-fixed text-white d-flex align-items-center justify-content-center rounded" + href="#" + @click="scrollToTop($event)"> + ↑ + </a> </div> </template> @@ -37,6 +43,26 @@ export default { ] } }, + methods: { + scrollToTop(e) { + window.scrollTo({ top: 0, behavior: "smooth" }) + e.preventDefault() + } + }, + beforeMount() { + let animated = false + window.addEventListener("scroll", function (e) { + if (window.scrollY > 250 && !animated) { + $(".scrollToTop").css("right", "1rem") + } else { + animated = true + setTimeout(function () { + animated = false + }, 300) + $(".scrollToTop").css("right", "-4rem") + } + }) + }, created() { this.$nuxt.$on("changeRoute", (breadcrumb) => { this.breadcrumb = breadcrumb @@ -69,6 +95,7 @@ export default { .app { transition: margin 0.5s ease-in-out; + scroll-behavior: smooth; } main { --paddingTop: 96px; @@ -92,4 +119,19 @@ main { .fade-leave-to { opacity: 0; } + +.scrollToTop { + z-index: 100; + bottom: 1rem; + right: -4rem; + font-size: 2rem; + width: 50px; + height: 50px; + opacity: 0.7; + transition: all 0.3s ease-in; + + &:hover { + opacity: 1; + } +} </style> -- GitLab