css - Bootstrap 4 导航链接悬停效果
问题描述
我正在尝试仅在导航栏中放置针对 a 链接的悬停效果(而不是正斜杠)。但我似乎不能只访问 a 链接,效果最终会沿着整个导航栏运行。似乎与此处的 Bootstrap 4 有冲突。
HTML
<nav class="navbar sticky-top navbar-expand-md navbar-light bg-light">
<!-- <div class="mx-auto d-sm-flex d-block flex-sm-nowrap"> -->
<a class="navbar-brand" href="https://www.facebook.com/GetMove.Official/">GET MOVE</a>
<button
class="navbar-toggler mr-left custom-toggler"
type="button"
data-toggle="collapse"
data-target="#navbarNav"
aria-controls="navbarNav"
aria-expanded="false"
aria-label="Toggle navigation"
>
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav ml-auto">
<li class="nav-item active">
<a class="nav-link" href="#">Home<span> / </span><span class="sr-only">(current)</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="#past-bookings">Archive<span> / </span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">About<span> / </span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="#subscribe">Newsletter<span> / </span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="mailto: hola@getmove.net">Contact</a>
</li>
</ul>
<ul class="nav navbar-nav flex-row justify-content-center flex-nowrap">
<li class="nav-item">
<a
class="nav-link nav-social-icon"
target="_blank"
href="https://www.facebook.com/GetMove.Official/"
><i class="fab fa-facebook-square"></i
></a>
</li>
<li class="nav-item">
<a class="nav-link nav-social-icon" target="_blank" href="https://www.instagram.com/getmovemx/"
><i class="fab fa-instagram"></i
></a>
</li>
<li class="nav-item">
<a class="nav-link nav-social-icon" target="_blank" href="https://soundcloud.com/getmove"
><i class="fab fa-soundcloud"></i
></a>
</li>
</ul>
</div>
</nav>
CSS
.nav-item:after {
content: "";
position: absolute;
bottom: 0;
left: 0;
width: 0%;
border-bottom: 1px solid black;
transition: 0.4s;
}
.nav-item:hover:after {
width: 100%;
}
解决方案
要解决此问题,您不应将分隔符放在锚元素内。下面是一种使用该content
属性消除额外 HTML 的方法。这类似于 Bootstrap 的面包屑。
但正如你已经熟悉的那样,首先进行一些清理^^
- 从
nav-links
- 使用文本节点的跨度(可以方便地将动画放在那里)
- 将动画从
:after
to移动:before
(分隔符在逻辑上位于元素之后,可能除了最后一个子元素,这也为您提供了元素宽度,您现在可以控制正确的位置。) - 使用
:after
分隔符 - 为主导航提供全宽,并使用 flexbox 对齐它使用的空间(flex-end、center、space-between,...)
HTML 更改
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="nav navbar-nav navbar-primary w-100 ml-auto">
<li class="nav-item active">
<a class="nav-link" href="#">
<span>Home</span>
<span class="sr-only">(current)</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#past-bookings"><span>Archive</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="#"><span>About</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="#subscribe"><span>Newsletter</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="mailto: hola@getmove.net"><span>Contact</span></a>
</li>
</ul>
<ul class="nav navbar-nav navbar-secondary flex-row justify-content-center flex-nowrap">
<li class="nav-item">
<a class="nav-link nav-social-icon" target="_blank" href="https://www.facebook.com/GetMove.Official/"><i class="fa fa-facebook-square"></i></a>
</li>
<li class="nav-item">
<a class="nav-link nav-social-icon" target="_blank" href="https://www.instagram.com/getmovemx/"><i class="fa fa-instagram"></i></a>
</li>
<li class="nav-item">
<a class="nav-link nav-social-icon" target="_blank" href="https://soundcloud.com/getmove"><i class="fa fa-soundcloud"></i></a>
</li>
</ul>
</div>
解决方案
现在要解决这个问题,将动画放在 before 上,将分隔符放在 after 伪元素上。
.navbar-primary .nav-item:after {
content: "/";
position: absolute;
top: 0.25rem;
left: auto;
right: -0.5rem; /* control the amount of space for the separator */
}
.navbar-primary .nav-item:before {
content: "";
position: absolute;
bottom: 0;
left: 0;
width: 0%;
border-bottom: 1px solid black;
transition: 0.4s;
}
.navbar-primary .nav-item:hover:before {
width: 100%;
}
如果您想更改角色,您只有一个编辑位置。
如果您想在没有填充的情况下更改动画,我建议您nav-link
使用calc()
.
.navbar-primary .nav-link:before {
content: "";
position: absolute;
bottom: 0;
left: 0.5rem; /* nav-link padding-left */
width: 0%;
border-bottom: 1px solid black;
transition: 0.4s;
}
.navbar-primary .nav-link:hover:before {
width: calc(100% - 1rem); /* minus nav-link padding left and right */
}
推荐阅读
- javascript - forEach 循环适用于 android 但不适用于 iPhone
- ddev - 如何在实际的邮件阅读器中查看来自 DDEV 项目的电子邮件,而不仅仅是 mailhog?
- angular - 得到“预期未定义是真实的”。测试时查看是否创建了 Componet
- r - 尝试获取标准错误时的 NA
- php - 如何使用php将数据插入到oracle表中
- javascript - Html 画布元素的 getImageData 与 Fabricjs 画布的内容不匹配
- javascript - CKEditor、MongoDB 和 NodeJs:文本以 HTML 格式显示
- sas - 将(内部存在的)列标题作为第一行插入到表中
- javascript - 使样式反应 JS
- python - Nohup 在终止之前不会打印到标准输出