html - 如何保持动画链接下划线效果但使整个区域可点击(没有 onclick 也没有额外的 div)
问题描述
我正在使用一种技术来创建一个动画链接效果,其中下划线慢慢形成(我不记得我最初看到的技术是什么,但我是从我之前工作过的另一个应用程序中复制的)。
它在大多数情况下效果很好,特别是如果链接作为文本的一部分嵌入,但在这种情况下,我希望它成为标题导航的一部分。
因此,对于一个人来说,我希望链接可点击区域成为一个块,包括填充,而不仅仅是<a>
通常的一段文本。
我试图在不改变 HTML 本身的情况下做到这一点,并且只通过 CSS 来做到这一点。
https://codepen.io/trajano/pen/mdyYpdv
.page-header {
width: 1080px;
height: 94px;
display: flex;
border-bottom: 1px solid red;
align-items: center;
$link-color: rgba(0, 0, 0, 0.6);
$link-hover-color: cyan;
$selected-link-background: rgb(39, 153, 137);
$selected-link-color: white;
&__logo {
img {
width: 94px;
height: 94px;
}
margin-right: auto;
}
&__selector {
margin-left: 1rem;
padding: 1rem;
position: relative;
display: inline-block;
}
&__selector--dropdown {
display: none;
position: absolute;
background-color: #f9f9f9;
z-index: 1;
min-width: 160px;
box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);
a {
color: black;
padding: 12px 16px;
text-decoration: none;
display: block;
&:hover {
background-color: #f1f1f1;
}
}
}
&__selector:hover {
background: red;
}
&__selector--dropdown:hover {
display: block;
}
&__selector:hover &__selector--dropdown {
display: block;
}
.page-header-link {
margin-left: 0.5rem;
padding: 1rem;
a {
font-size: 14px;
text-decoration: none;
display: inline-block;
position: relative;
color: $link-color;
&:after {
content: "";
display: block;
height: 2px;
left: 50%;
bottom: -4px;
position: absolute;
background-color: $link-color;
transition: width 0.3s ease 0s, left 0.3s ease 0s;
width: 0;
}
&:hover:after {
width: 100%;
left: 0;
}
}
&:hover {
background-color: $link-hover-color;
}
}
.page-header-link__selected {
background-color: $selected-link-background;
a {
font-size: 14px;
text-decoration: none;
display: inline-block;
position: relative;
color: $selected-link-color;
&:after {
content: "";
display: block;
height: 2px;
left: 50%;
bottom: -4px;
position: absolute;
background-color: $selected-link-color;
transition: width 0.3s ease 0s, left 0.3s ease 0s;
width: 0;
}
&:hover:after {
width: 100%;
left: 0;
}
}
}
.page-header-selector {
margin-left: 1rem;
padding: 1rem;
border: 1px solid black;
display: inline-block;
&__button {
display: inline-block;
min-width: 100%;
min-height: 100%;
}
&__dropdown {
display: none;
position: absolute;
z-index: 1;
min-width: 160px;
box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);
a {
color: black;
padding: 12px 16px;
text-decoration: none;
display: block;
&:hover {
background-color: #f1f1f1;
}
}
}
&:hover {
background: red;
.page-header-selector__dropdown {
display: block;
}
}
}
}
<div class="page-header">
<div class="page-header__logo">
<a href="#">
LOGO
</a>
</div>
<div class="page-header-link">
<a href="#">2+2=5</a>
</div>
<div class="page-header-link">
<a href="#">YOLO</a>
</div>
<div class="page-header-link">
<a href="#">Foo Bar</a>
</div>
<div class="page-header-link page-header-link__selected">
<a href="#">Linkx</a>
</div>
<div class="page-header__selector">
<div class="page-header__selector--button">en</div>
<div class="page-header__selector--dropdown">
<a href="#">Francais</a>
<a href="#">Pirate</a>
<a href="#">Chef</a>
</div>
</div>
</div>
解决方案
移动padding
到并稍微a
改变样式::after
.page-header-link {
margin-left: 0.5rem;
a {
font-size: 14px;
text-decoration: none;
display: block;
position: relative;
color: $link-color;
padding: 1rem; /* <- */
&:after {
content: "";
display: block;
height: 2px;
left: 50%;
bottom: calc(1rem -4px); /* <- */
position: absolute;
background-color: $link-color;
transition: width 0.3s ease 0s, left 0.3s ease 0s;
width: 0;
}
&:hover:after {
width: calc(100% - 2rem); /* <- */
left: 1rem; /* <- */
}
}
&:hover {
background-color: $link-hover-color;
}
}
推荐阅读
- r - 在列表中的每个位置中包含已存在的元素
- sql-server - SQL Server 错误:“'xyz' 附近的语法不正确”
- java - Kotlin:为 guice 注入的依赖项添加一个接口,以便我们可以模拟它们仅用于单元测试目的?
- java - 控制批量 api ElasticSearch 的超时
- python - 通过运行函数设置变量
- java - 未经许可的 iTextPdf setEncryption
- python - Python没有结果和KeyError:1
- c++ - 连接到远程存储库并获取数据
- postgresql - Postgres 中是否有 varchar 字段的 diff/patch 函数/库
- javascript - 复制要在 JavaScript 中迭代的 div 的最佳方法是什么?