Use smooth scroll function to navigate to anchor

Using a eased RAF function to scroll to a specific target
Avoid using `scrollIntoView` or smooth behavior as it doesn't work on Safari and others.
This commit is contained in:
2022-07-11 16:42:28 +02:00
parent f81a468a04
commit ae4ea7f4fa
6 changed files with 73 additions and 7 deletions

View File

@@ -5,6 +5,7 @@
<script lang="ts">
import { cartId } from '$utils/stores/shop'
import { addToCart } from '$utils/functions/shop'
import { smoothScroll } from '$utils/functions'
// Components
import Button from '$components/atoms/Button.svelte'
import Image from '$components/atoms/Image.svelte'
@@ -16,7 +17,7 @@
<div class="poster">
{#if image}
<a href="/shop/poster-{location.slug}#poster" sveltekit:noscroll sveltekit:prefetch>
<a href="/shop/poster-{location.slug}" on:click={() => smoothScroll('poster', false)} sveltekit:noscroll sveltekit:prefetch>
<Image
id={image.id}
sizeKey="product"
@@ -33,15 +34,16 @@
<div class="buttons">
<Button
size="xsmall"
url="/shop/poster-{location.slug}#poster"
url="/shop/poster-{location.slug}"
text="View"
on:click={() => setTimeout(() => smoothScroll('poster', false), 1000)}
/>
<Button
tag="button"
size="xsmall"
on:click={() => addToCart($cartId, product)}
text="Add to cart"
color="pink"
on:click={() => addToCart($cartId, product)}
/>
</div>
</div>

View File

@@ -6,6 +6,7 @@
import { goto } from '$app/navigation'
import { getContext } from 'svelte'
import { shopCurrentProductSlug } from '$utils/stores/shop'
import { smoothScroll } from '$utils/functions'
export let isOver: boolean = false
@@ -22,6 +23,8 @@
const quickLocationChange = ({ target: { value }}: any) => {
const newPath = `/shop/poster-${value}`
goto(newPath, { replaceState: true, noscroll: true, keepfocus: true })
// Scroll to anchor
setTimeout(() => smoothScroll('poster'), 1000)
}
</script>