108

我的页面目前有 Navigation.vue 组件。我想让每个导航悬停并激活。“悬停”有效,但“活动”无效。

这就是 Navigation.vue 文件的样子:

<template>
    <div>
        <nav class="navbar navbar-expand-lg fixed-top row">

                    <router-link tag="li" class="col" class-active="active" to="/" exact>TIME</router-link>
                    <router-link tag="li" class="col" class-active="active" to="/CNN" exact>CNN</router-link>
                    <router-link tag="li" class="col" class-active="active" to="/TechCrunch" exact>TechCrunch</router-link>
                    <router-link tag="li" class="col" class-active="active" to="/BBCSport" exact>BBC Sport</router-link>
        </nav>
    </div>
</template>

以下是风格。

<style>

   nav li:hover,
   nav li:active{
      background-color: indianred;
      cursor: pointer;
    }

</style>

这就是悬停现在的样子,并且在活动时预期完全相同。 这就是悬停现在的样子,并且在活动时预期完全相同。

如果您给我一个关于设置路由器链接活动作品样式的建议,我将不胜感激。谢谢。

4

6 回答 6

231

: active 伪类与添加类来设置元素样式不同。

:active CSS 伪类表示用户正在激活的元素(例如按钮)。使用鼠标时,“激活”通常在按下鼠标按钮时开始,在松开鼠标按钮时结束。

我们正在寻找的是一个类,例如.active,我们可以使用它来设置导航项的样式。

:active有关和之间区别的更清晰示例,.active请参见以下代码段:

li:active {
  background-color: #35495E;
}

li.active {
  background-color: #41B883;
}
<ul>
  <li>:active (pseudo-class) - Click me!</li>
  <li class="active">.active (class)</li>
</ul>


Vue路由器

vue-router自动将两个活动类.router-link-active和应用.router-link-exact-active<router-link>组件。


router-link-active

<router-link>当组件的目标路由匹配时,此类会自动应用于组件。

其工作方式是使用包容性匹配行为。例如,<router-link to="/foo">只要当前路径以/foo/or开头,就会应用此类/foo

因此,如果我们有<router-link to="/foo">和,当路径为 时<router-link to="/foo/bar">,两个组件都会获得该类。router-link-active/foo/bar


router-link-exact-active

<router-link>当组件的目标路由完全匹配时,此类会自动应用于组件。考虑到在这种情况下,两个类router-link-activerouter-link-exact-active都将应用于组件。

使用相同的示例,如果我们有<router-link to="/foo">and <router-link to="/foo/bar">,则router-link-exact-active该类将<router-link to="/foo/bar">在路径为 时应用/foo/bar


确切的道具

假设我们有<router-link to="/">,将会发生的是该组件将对每条路线都处于活动状态。这可能不是我们想要的,所以我们可以exact像这样使用道具:<router-link to="/" exact>. 现在,组件将仅在与/.


CSS

我们可以使用这些类来设置元素的样式,如下所示:

 nav li:hover,
 nav li.router-link-active,
 nav li.router-link-exact-active {
   background-color: indianred;
   cursor: pointer;
 }

使用道具<router-link>更改了标签, .tag<router-link tag="li" />


全局更改默认类

如果我们希望更改vue-router全局提供的默认类,我们可以通过将一些选项传递给vue-router实例来实现,如下所示:

const router = new VueRouter({
  routes,
  linkActiveClass: "active",
  linkExactActiveClass: "exact-active",
})

更改每个组件实例的默认类 ( <router-link>)

相反,如果我们想要更改每个而不是全局的默认类,我们可以通过使用和属性<router-link>来做到这一点,如下所示:active-classexact-active-class

<router-link to="/foo" active-class="active">foo</router-link>

<router-link to="/bar" exact-active-class="exact-active">bar</router-link>

v-slot API

Vue Router 3.1.0+ 通过scoped slot提供低级定制。当我们希望设置包装元素的样式时,这很方便,例如列表元素<li>,但仍将导航逻辑保留在锚元素中<a>

<router-link
  to="/foo"
  v-slot="{ href, route, navigate, isActive, isExactActive }"
>
  <li
    :class="[isActive && 'router-link-active', isExactActive && 'router-link-exact-active']"
  >
    <a :href="href" @click="navigate">{{ route.fullPath }}</a>
  </li>
</router-link>
于 2017-09-06T23:03:19.203 回答
34

创建路由器时,可以将 指定linkExactActiveClass为属性以设置将用于活动路由器链接的类。

const routes = [
  { path: '/foo', component: Foo },
  { path: '/bar', component: Bar }
]

const router = new VueRouter({
  routes,
  linkActiveClass: "active", // active class for non-exact links.
  linkExactActiveClass: "active" // active class for *exact* links.
})

在此处记录。

于 2017-09-06T20:06:49.010 回答
34

https://router.vuejs.org/en/api/router-link.html 添加属性 active-class="active" 例如:

<ul class="nav navbar-nav">
    <router-link tag="li" active-class="active" to="/" exact><a>Home</a></router-link>
    <router-link tag="li" active-class="active" to="/about"><a>About</a></router-link>
    <router-link tag="li" active-class="active" to="/permission-list"><a>Permisison</a></router-link>
</ul>
于 2017-11-20T02:46:19.650 回答
6

正如@Ricky 上面提到的,vue-router 自动将两个活动类.router-link-active.router-link-exact-active, 应用于组件。

因此,要更改活动链接 css,请使用:

.router-link-exact-active{
 //your desired design when link is clicked
font-weight: 700;
}
于 2020-03-06T18:52:43.180 回答
3

只需添加到@Bert 的解决方案以使其更清晰:

    const routes = [
  { path: '/foo', component: Foo },
  { path: '/bar', component: Bar }
]

const router = new VueRouter({
  routes,
  linkExactActiveClass: "active" // active class for *exact* links.
})

如您所见,应删除此行:

linkActiveClass: "active", // active class for non-exact links.

这样,只有当前链接是高亮的。这应该适用于大多数情况。

大卫

于 2020-01-30T22:43:09.383 回答
2

让我们把事情简单化,你不需要阅读关于“自定义标签”的文档(作为一个 16 年的 web 开发人员,我有足够的这种标签,例如在 struts、webwork、jsp、rails 中,现在它是 vuejs )

只需按F12,您将看到如下源代码:

<div>
    <a href="#/topologies" class="luelue">page1</a> 
    <a href="#/" aria-current="page" class="router-link-exact-active router-link-active">page2</a> 
    <a href="#/databases" class="">page3</a>
</div>

.router-link-active所以只需为or添加样式.router-link-exact-active

如果您想了解更多详细信息,请查看router-linkapi:

https://router.vuejs.org/en/api/#router-link

于 2021-01-13T01:05:40.460 回答