Link underline hover
ホバー時に左から右へ下線が引かれ、ホバーを外すと左へ消えるテキストリンク。複数行にも対応。
2023年12月以降、すべてのブラウザーで利用可能です。
- Baseline
- BaselineWidely available
- 対応ブラウザ
- Chrome120+Edge120+Firefox117+Safari17.2+
プレビューを読み込み中
<a href="#" class="link-underline-hover"
><span class="link-underline-hover__text">テキストリンク</span></a
>
<a href="#" class="link-underline-hover"
><span class="link-underline-hover__text"
>テキストリンクテキストリンク<br />テキストリンク</span
></a
>
<a href="#" class="link-underline-hover"
><span class="link-underline-hover__text">テキストリンク</span></a
>
<a href="#" class="link-underline-hover"
><span class="link-underline-hover__text"
>テキストリンクテキストリンク<br />テキストリンク</span
></a
>
/* reset */
:where(a).link-underline-hover {
font: inherit;
text-decoration: none;
}
/* snippet */
.link-underline-hover {
--link-color: #2b36f5;
--link-color-hover: #1f28a8;
--link-underline-height: 1px;
--link-underline-offset: 0.15em;
--link-focus-color: #2b36f5;
--link-focus-radius: 4px;
--link-duration: 0.3s;
--link-easing: ease;
display: inline-block;
line-height: 1.6;
color: var(--link-color);
border-radius: var(--link-focus-radius);
}
.link-underline-hover .link-underline-hover__text {
display: inline;
padding-bottom: var(--link-underline-offset);
background-image: linear-gradient(currentcolor, currentcolor);
background-repeat: no-repeat;
background-position: bottom left;
background-size: 0 var(--link-underline-height);
transition: background-size var(--link-duration) var(--link-easing);
box-decoration-break: slice;
}
@media (hover: none) {
.link-underline-hover .link-underline-hover__text {
background-size: 100% var(--link-underline-height);
}
}
@media (hover: hover) and (pointer: fine) {
.link-underline-hover {
transition: color var(--link-duration) var(--link-easing);
}
.link-underline-hover:hover {
color: var(--link-color-hover);
}
.link-underline-hover:hover .link-underline-hover__text {
background-size: 100% var(--link-underline-height);
}
}
.link-underline-hover:focus:not(:focus-visible) {
outline: none;
}
.link-underline-hover:focus-visible {
outline: 2px solid var(--link-focus-color);
outline-offset: 2px;
}
.link-underline-hover:focus-visible .link-underline-hover__text {
background-size: 100% var(--link-underline-height);
}
@media (prefers-reduced-motion: reduce) {
@media (hover: hover) and (pointer: fine) {
.link-underline-hover {
transition: none;
}
.link-underline-hover .link-underline-hover__text {
transition: none;
}
}
}
/* reset */
:where(a).link-underline-hover {
font: inherit;
text-decoration: none;
}
/* snippet */
.link-underline-hover {
--link-color: #2b36f5;
--link-color-hover: #1f28a8;
--link-underline-height: 1px;
--link-underline-offset: 0.15em;
--link-focus-color: #2b36f5;
--link-focus-radius: 4px;
--link-duration: 0.3s;
--link-easing: ease;
display: inline-block;
line-height: 1.6;
color: var(--link-color);
border-radius: var(--link-focus-radius);
}
.link-underline-hover .link-underline-hover__text {
display: inline;
padding-bottom: var(--link-underline-offset);
background-image: linear-gradient(currentcolor, currentcolor);
background-repeat: no-repeat;
background-position: bottom left;
background-size: 0 var(--link-underline-height);
transition: background-size var(--link-duration) var(--link-easing);
box-decoration-break: slice;
}
@media (hover: none) {
.link-underline-hover .link-underline-hover__text {
background-size: 100% var(--link-underline-height);
}
}
@media (hover: hover) and (pointer: fine) {
.link-underline-hover {
transition: color var(--link-duration) var(--link-easing);
}
.link-underline-hover:hover {
color: var(--link-color-hover);
}
.link-underline-hover:hover .link-underline-hover__text {
background-size: 100% var(--link-underline-height);
}
}
.link-underline-hover:focus:not(:focus-visible) {
outline: none;
}
.link-underline-hover:focus-visible {
outline: 2px solid var(--link-focus-color);
outline-offset: 2px;
}
.link-underline-hover:focus-visible .link-underline-hover__text {
background-size: 100% var(--link-underline-height);
}
@media (prefers-reduced-motion: reduce) {
@media (hover: hover) and (pointer: fine) {
.link-underline-hover {
transition: none;
}
.link-underline-hover .link-underline-hover__text {
transition: none;
}
}
}