shikinen
shikinen

Reputation: 191

Problem with nuxt-links navigation to pages with hashes/anchors

I am using nuxt-links in my website navigation, most of them point to hashed elements/anchors in the home page like:

<nuxt-link
  v-else
  class="text-link"
  :to="localePath('index') + #hash"
>

and it does its job if currently on the home page but when I navigate to a different site, eg. /about and I click on a navbar nuxt-link (so I want to navigate from /about to /#hash or /any-other-site#hash) I got a nuxt error displayed to check the console where it reads "Cannot read property 'offsetTop' of null".

My router configuration in nuxt.config (without it I wouldn't be even able to scroll to an anchored element being in the same site as the element!):

  router: {
    scrollBehavior(to) {
      if (to.hash) {
        return window.scrollTo({ top: document.querySelector(to.hash).offsetTop + window.innerHeight, behavior: 'smooth' });
      }
      return window.scrollTo({ top: 0, behavior: 'smooth' });
      }
  },

In the :to attribute I tried 'hash' '#hash', nothing works. Could please anyone help me with this? How do I navigate to a different page + #anchor (so to scroll to that anchor?)

Upvotes: 17

Views: 33029

Answers (4)

Sudhir Kaushik
Sudhir Kaushik

Reputation: 166

I wanted to attach data ID to link so :

<div class="col" v-for="(item, index) in category.children.slice(0, 5)" :key="index">
<nuxt-link :to="{ path: localePath('/category/'+item.slug)}" target="_blank">

           

Upvotes: 0

Thomas Uchiha
Thomas Uchiha

Reputation: 308

A bit late but this is what I was able to achieve. Thanks to Sivuyile-TG-Magutywa

 <nuxt-link :to="{ path: localePath('index'),hash:'#about'}">
          {{ $t("menu.about") }}
 </nuxt-link>

output

https://www.shrek.com/fr/about

Upvotes: 2

Bruno Reis Silvino
Bruno Reis Silvino

Reputation: 39

Using this way, with getBoundingClientRect().top+window.scrollY, works better to me in case of subsections:

if (to.hash) {
        let el = await findEl(to.hash)
        if ('scrollBehavior' in document.documentElement.style) {
          return window.scrollTo({ top: el.getBoundingClientRect().top+window.scrollY, behavior: 'smooth' })
        } else {
          return window.scrollTo(0, el.getBoundingClientRect().top+window.scrollY)
        }
      }

Upvotes: 2

Sivuyile TG Magutywa
Sivuyile TG Magutywa

Reputation: 1271

Anyone who had this problem here is a simple solution if you are using Nuxt-Link

Instead of using <nuxt-link to="#contact" >Contact</nuxt-link> which doesn't work. Use <nuxt-link :to="{ path: '/',hash:'#contact'}">Contact</nuxt-link>

path is the page you will navigate to

hash is the position you will scroll to

Hope this help someone.

Upvotes: 49

Related Questions