Vue.js锚定到同一组件中的div

时间:2017-03-07 10:35:59

标签: html vue.js vue-router

我正在开发一个Vue.js应用程序,而且我很难将一个锚链接到一个组件中的某个div。

我有以下主播:

<a href="#porto" class="porto-button">Porto, Portugal</a>

以及以下div:

<div id="porto" class="fl-porto">

我在哈希模式下使用vue-router。

问题是,每当我点击&#34; porto-button&#34;它会将我重定向到&#34; home&#34;页面(&#39; /&#39;)

我正在使用Vue.js 1.X,我尝试使用历史记录模式(没有hashbang的URL),但刷新页面时出现cannot GET '/page'错误。

我做错了吗?我该怎么办?

5 个答案:

答案 0 :(得分:12)

因为您在哈希模式下使用路由器,所以无法轻松滚动它,因为滚动到/#something实际上会将您重定向到“某事”页面。

您必须自己模仿滚动行为,尝试做类似的事情:

//P.S. the code is written for Vue 2.
//You will have to adjust it to Vue 1.

//Your view:
<a class="porto-button" @click="scrollMeTo('porto')">Porto, Portugal</a>
...
<div ref="porto" class="fl-porto">
//Your code:
methods: {
  scrollMeTo(refName) {
    var element = this.$refs[refName];
    var top = element.offsetTop;

    window.scrollTo(0, top);
  }
}

工作原理:

  1. 通过ref属性将引用设置为您要滚动到的元素;
  2. 编写一个函数,以编程方式将window.scrollY设置为引用元素的top
  3. 工作完成:)
  4. 更新1:

    jsfiddle https://jsfiddle.net/5k4ptmqg/4/

    更新2:

    似乎在Vue 1 ref="name"看起来像el:name (docs),这是一个更新的示例:

    https://jsfiddle.net/5y3pkoyz/2/

答案 1 :(得分:3)

什么对我有用

<router-link to="#leaders">Leaders</router-link>

或动态

<router-link :to="`#${subMenuItem.linkTarget}`" class="page-submenu-list__link">
                    {{subMenuItem.linkTitle}}
                </router-link>

在路由器中

routes:[],
scrollBehavior (to, from, savedPosition) {
    //https://router.vuejs.org/guide/advanced/scroll-behavior.html
    if (to.hash) {
            return { selector: to.hash }
        } else if (savedPosition) {
            return savedPosition;
        } else {
            return { x: 0, y: 0 }
        }
  }

答案 2 :(得分:1)

另一种方法是使用“ scrollIntoView()”

因此,euvl的代码仍然存在,只是您需要稍微更改方法:


    new Vue({
      el: '#app',
      methods: {
        goto(refName) {
            var element = this.$els[refName];
          element.scrollIntoView();
        }
      }
    })

如果您想花哨并平滑滚动,甚至可以添加以下内容:

element.scrollIntoView({ behavior: 'smooth' });

请注意,这对于较旧的浏览器将需要使用polyfill。

答案 3 :(得分:1)

另一种解决方案是使用v-scroll-to伪指令(webpagegithub)。 我发现此解决方案干净,简单,灵活且有效。要使用:

  1. 安装:

    npm install --save vue-scrollto
    
  2. 具有Vue“使用”它:

    var VueScrollTo = require('vue-scrollto');
    Vue.use(VueScrollTo)
    
  3. 将其作为指令应用于Vue组件的模板中:

    <a href="#" v-scroll-to="'#element'">Scroll to #element</a>
    
    <div id="element">
      Hi. I'm #element.
    </div>
    
  4. 或通过编程将其应用到Vue组件的方法中:

    this.$scrollTo('#element', 500, { easing: 'ease-in-out' })
    
  5. 或通过编程将其应用到您的Vuex操作中:

    import { scrollTo } from 'vue-scrollto'
    
    scrollTo('#element', 500, { easing: 'ease-in-out' })
    

另一种解决方案,如果您已经在使用Vuetify,则可能更喜欢使用Vuetify's built-in programmatic scrolling method$vuetify.goTo()

<v-btn @click="$vuetify.goTo('#element', {duration: 500, easing: 'easeInOutCubic'})">
  Scroll to #element
</v-btn>

<div id="element">
  Hi. I'm #element.
</div>

答案 4 :(得分:1)

如果你在一个元素上设置了 ref="something",你也可以将这个 oneliner 与 @click 一起使用:

<a @click="$refs.something.$el.scrollIntoView()">
    Go to something
</a>