如何使用vue js制作固定导航栏?

时间:2018-11-16 08:54:35

标签: javascript vue.js vue-component web-frontend

enter image description here

我尝试使用vue.js构建登录页面,其标题设计如上图所示。

因此,我创建了一个名为“标头”的组件,其中包含根据设计的内容。

当滚动页面时,导航栏仍位于顶部时,如何制作固定的导航栏?

3 个答案:

答案 0 :(得分:3)

您可以通过应用以下类来设置固定的导航栏。

.header {
  position:fixed; /* fixing the position takes it out of html flow - knows
                   nothing about where to locate itself except by browser
                   coordinates */
  left:0;           /* top left corner should start at leftmost spot */
  top:0;            /* top left corner should start at topmost spot */
  width:100vw;      /* take up the full browser width */
  z-index:200;  /* high z index so other content scrolls underneath */
  height:100px;     /* define height for content */
}

滚动窗口时,具有position:fixed;属性的元素不会更改,因此固定位置的元素将保持正确。

答案 1 :(得分:2)

new Vue({
  el: "#app",
  data:{
      active: false
  },
  methods: {
    toggleNavClass(){
        if(this.active == false){
          return 'nav'
        } else {
          return 'sticky-nav'
        }

    }
  },
  mounted(){
  window.document.onscroll = () => {
      let navBar = document.getElementById('nav');
      if(window.scrollY > navBar.offsetTop){
        this.active = true;
        } else {
        this.active = false;
      }
    }
  }
})

/*scrollY returns the scroll amount in pixels.
offsetTop is the px difference between the navBar and closest parent element*/
body {
  margin: 0;
  box-sizing: border-box;
}

#app {
  color: #2c3e50;
  background-color: #ccd6dd;
  height: 120vh;
}

a {
  font-weight: bold;
  color: white;
  text-decoration: none;
  margin: 0 1vw;
}

a:hover {
  transition: linear 100ms;
  color: red;
}

/* two classes, decided on scroll */
.nav {
  transition: 100ms;
  padding: 25px;
}

.sticky-nav{
  transition: 100ms;
  padding: 20px;
}

#nav {
  display: flex;
  justify-content: space-between;
  width: 100%;
  background-color: #55acee;
  position: fixed;
  top: 0;
}

/* have to add the ID nav (#nav) otherwise the backgrnd color won't change as the previous background color is set in an ID and ID trumps class notation */
#nav.sticky{
  transition: 150ms;
  box-shadow: 0px 15px 10px -15px #111;
  background-color:  #ccd6dd;
  }
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>

<div id="app">
    <div id="nav" :class="{sticky:active}"> 
      <div id="nav-container" :class="toggleNavClass()"><a href="#">Menu</a>
    </div>
      <router-view />
</div>

我刚刚使用Vue建立了一个网站。 这是我的代码

答案 2 :(得分:1)

另一种选择是使用bootstrap-vue软件包。

它具有b-navbar组件,可以将其固定为 top

<b-navbar class="header" fixed="top"></b-navbar>

示例:

const vm = new Vue({el: '#app'})
<link href="http://unpkg.com/bootstrap-vue@latest/dist/bootstrap-vue.css" rel="stylesheet"/><link href="http://unpkg.com/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet"/><script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script><script src="http://unpkg.com/bootstrap-vue@latest/dist/bootstrap-vue.js"></script><script src="http://unpkg.com/babel-polyfill@latest/dist/polyfill.min.js"></script><div id="app">

  <!-- ************************************ -->
  <!-- Place the fixed prop within b-navbar -->
  <!-- ************************************ -->
  
  <b-navbar class="header" type="dark" variant="info" fixed="top">
    <b-navbar-brand href="#"> My fixed header </b-navbar-brand>
  </b-navbar>
  
  <!-- *********************************** -->
  <div style="margin-top: 60px;"><ol><li>link</li><li>link</li><li>link</li><li>link</li><li>link</li><li>link</li><li>link</li><li>link</li><li>link</li><li>link</li><li>link</li><li>link</li><li>link</li><li>link</li><li>link</li><li>link</li><li>link</li><li>link</li><li>link</li><li>link</li><li>link</li><li>link</li><li>link</li><li>link</li><li>link</li></ol></div></div>