代码之家  ›  专栏  ›  技术社区  ›  Michael Cole

Nuxt/Vue/Bootstrap Vue滚动时收缩导航栏

  •  1
  • Michael Cole  · 技术社区  · 7 年前

    用Nuxt学习Vue。希望根据页面滚动位置更改导航栏类。

    往里看 several places ,但尚未找到有效的解决方案。

    以下是我必须处理的问题:

    ``` default.vue
    <template lang="pug">
    div(v-on:scroll="shrinkNav", v-on:click="shrinkNav")
      b-navbar.text-center(toggleable="sm" type="light" sticky v-b-scrollspy)
        #myNav.mx-auto.bg-white
          b-navbar-toggle(target="nav_collapse")
          b-navbar-brand.mx-auto(href="#") 
            | Example.org
          b-collapse#nav_collapse.mx-auto(is-nav='')
            b-navbar-nav(justified, style="min-width: 600px").vertical-center
              b-nav-item.my-auto(href='#home') Home
              b-nav-item.my-auto(href='/how') How
              i.fab.fa-earlybirds.fa-2x.mt-2.mb-3
              b-nav-item.my-auto(href='/values') Values
              b-nav-item.my-auto(href='/join-us') Join Us
      #content.container(v-on:scroll="shrinkNav", v-on:click="shrinkNav")
    nuxt
        nuxt
    </template>
    
    <script>
      // resize navbar on scroll
      export default {
        methods: {
          shrinkNav() {
            var nav = document.getElementById('nav')
            var content = document.getElementById('content')
            if (nav && content) {
              if(content.scrollTop >= 150) {
                nav.classList.add('shrink')
              } else {
                nav.classList.remove('shrink')
              }
            }
            console.log(document.documentElement.scrollTop || document.body.scrollTop)
          }      
        }
      }
    </script>
    ```
    

    shrinkNav 单击时运行两次,但滚动时不运行。Vue/Nuxt的方法是什么?

    2 回复  |  直到 7 年前
        1
  •  2
  •   Relequestual    6 年前

    在你的 .vue公司 :

    <template> 章节:

    <nav id="nav" class="navbar is-transparent is-fixed-top">
    

    <script> 章节:

    export default {
    mounted() {
          this.$nextTick(function(){
            window.addEventListener("scroll", function(){
              var navbar = document.getElementById("nav");
              var nav_classes = navbar.classList;
              if(document.documentElement.scrollTop >= 150) {
                if (nav_classes.contains("shrink") === false) {
                  nav_classes.toggle("shrink");
                }
              }
              else {
                if (nav_classes.contains("shrink") === true) {
                  nav_classes.toggle("shrink");
                }
              }
            })
          })
        },
    }
    

    Live Demo on codesandbox

        2
  •  0
  •   Michael Cole    7 年前

    好的,这里有一个使用插件的解决方案。也许有更好的方法:

    1)在 plugins/scroll.js

    ``` javascript
    // https://vuejs.org/v2/cookbook/creating-custom-scroll-directives.html#Base-Example
    import Vue from 'vue'
    
    Vue.directive('scroll', {
      inserted: function (el, binding) {
        let f = function (evt) {
          if (binding.value(evt, el)) {
            window.removeEventListener('scroll', f)
          }
        }
        window.addEventListener('scroll', f)
      }
    })
    ```
    

    2)在项目中添加插件 nuxt.config.js

    ``` javascript
    module.exports = {
      head: { },
      plugins: [
        { src: '~/plugins/scroll.js', },
      ]
    }
    ```
    

    3)使用 v-scroll 在菜单中定义自定义行为的指令 /layouts/default.vue

    ``` javascript
    <template lang="pug">
    div(v-scroll="shrinkNav")
      b-navbar.text-center(toggleable="sm" type="light" sticky)
        #myNav.mx-auto.bg-white
          b-navbar-toggle(target="nav_collapse")
          b-navbar-brand.mx-auto(href="/#home") Example.org
          b-collapse#nav_collapse.mx-auto(is-nav='')
            b-navbar-nav(justified, style="min-width: 600px").vertical-center
              b-nav-item.my-auto(to='/#home') Home
      #content.container
        nuxt
    </template>
    
    <script>
      export default {
        methods: {
          shrinkNav() {
            var scrollPosition = document.documentElement.scrollTop || document.body.scrollTop
            var nav = document.getElementById('myNav')
            console.log(scrollPosition, nav)
            if(scrollPosition >= 150) {
              nav.classList.add('shrink')
            } else {
              nav.classList.remove('shrink')
            }
          },
        },
      }
    </script>
    
    <style>
      nav.navbar {
        margin: 0;
        padding: 0;
      }
      #myNav {
        border-radius: 0 0 10px 10px;
        border: 2px solid purple;
        border-top: none;
      }
      #myNav.shrink {
        border: none;
      }
    </style>
    ```
    
    推荐文章