From 5bc59a0959884e49c40d0e4e976c966cf2496536 Mon Sep 17 00:00:00 2001 From: satnaing Date: Fri, 6 Jun 2025 00:37:14 +0700 Subject: [PATCH] feat: improve back-to-top button behavior Make the back-to-top button appear based on scroll position_ improving accessibility and UX. --- src/components/BackToTopButton.astro | 96 ++++++++++++++++++++++++++++ src/layouts/PostDetails.astro | 29 ++------- 2 files changed, 103 insertions(+), 22 deletions(-) create mode 100644 src/components/BackToTopButton.astro diff --git a/src/components/BackToTopButton.astro b/src/components/BackToTopButton.astro new file mode 100644 index 0000000000..98650959b4 --- /dev/null +++ b/src/components/BackToTopButton.astro @@ -0,0 +1,96 @@ +--- +import IconChevronLeft from "@/assets/icons/IconChevronLeft.svg"; + +/* +In #btt-btn-container, left position is `left-[calc((var(--container-3xl)/2)+50%+1rem)]`. +This is because we use `max-w-3xl` in `PostDetails.astro`. +If `max-width` in `PostDetails.astro` get updated, make sure to update the `var(--container-3xl)` as well. +max-w-3xl => var(--container-3xl) +max-w-4xl => var(--container-4xl) +max-w-5xl => var(--container-5xl) +etc... +*/ +--- + +
+ +
+ + diff --git a/src/layouts/PostDetails.astro b/src/layouts/PostDetails.astro index bc3f521a7c..285ecc5aba 100644 --- a/src/layouts/PostDetails.astro +++ b/src/layouts/PostDetails.astro @@ -8,6 +8,7 @@ import Datetime from "@/components/Datetime.astro"; import EditPost from "@/components/EditPost.astro"; import ShareLinks from "@/components/ShareLinks.astro"; import BackButton from "@/components/BackButton.astro"; +import BackToTopButton from "@/components/BackToTopButton.astro"; import { getPath } from "@/utils/getPath"; import { slugifyStr } from "@/utils/slugify"; import IconChevronLeft from "@/assets/icons/IconChevronLeft.svg"; @@ -109,22 +110,16 @@ const nextPost = - +
- +
    + {tags.map(tag => )} +
- +

@@ -270,16 +265,6 @@ const nextPost = } attachCopyButtons(); - /** Scrolls the document to the top when - * the "Back to Top" button is clicked. */ - function backToTop() { - document.querySelector("#back-to-top")?.addEventListener("click", () => { - document.body.scrollTop = 0; // For Safari - document.documentElement.scrollTop = 0; // For Chrome, Firefox, IE and Opera - }); - } - backToTop(); - /* Go to page start after page swap */ document.addEventListener("astro:after-swap", () => window.scrollTo({ left: 0, top: 0, behavior: "instant" })