アンダーラインのアニメーション

どうも、 くまだ です。

Web制作でよく見かけるものとして、例えばナビのメニューだったりテキストの部分をホバーするとアンダーラインが流れてくるような演出があります。

スクロールしたらテキストが横から出てくるアニメーションの記事はこちらです。

よく見かけるアンダーラインのアニメ―ション

通常、例えばナビのメニュー部分にマウスでホバーさせたときにアンダーラインのアニメーションをするのであれば、以下のような記述をします。

参考サイトはこちらです。

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <link rel="stylesheet" href="css/style.css" />

</head>

<body>
  <div class="container">
    <div class="inner">
      <ul class="list">
        <li class="item">
          <a href="#" class="link">
            item
          </a>
        </li>
        <li class="item">
          <a href="#" class="link">
            item
          </a>
        </li>
        <li class="item">
          <a href="#" class="link">
            item
          </a>
        </li>
      </ul>
    </div>
  </div>
</body>

</html>
@charset "UTF-8";

.inner {
  width: 50%;
  margin: 10% auto;
}

.list {
  list-style: none;
}

.item {
  font-size: 36px;
}

.link {
  color: black;
  text-decoration: none;
  display: inline-block;
  position: relative;
  cursor: pointer;
}
.link::before {
  position: absolute;
  content: '';
  left: 0;
  right: 0;
  bottom: -3px;
  width: 100%;
  height: 1px;
  background-color: black;
  transform: scale(0, 1);
  transform-origin: left;
  transition: transform .3s;
}
.link:hover::before {
  transform: scale(1);
}

これをブラウザでみるとこんな感じの動きです。

こちらの記述はGoogleで検索すれば割とよく出てくるような記述です。

Keyframesを使っても実現できます。上記のものよりCSSはだいぶすっきり記述できました。

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <link rel="stylesheet" href="css/style.css" />

</head>

<body>
  <div class="container">
    <div class="inner">
      <ul class="list">
        <li class="item">
          <a href="#" class="link">
            test
          </a>
        </li>
        <li class="item">
          <a href="#" class="link">
            test
          </a>
        </li>
        <li class="item">
          <a href="#" class="link">
            test
          </a>
        </li>
      </ul>
    </div>
  </div>
</body>

</html>
@charset "UTF-8";
.inner {
  width: 50%;
  margin: 10% auto;
}

.list {
  list-style: none;
}

.item {
  font-size: 36px;
}

.link {
  text-decoration: none;
  color: black;

}

.item .link:hover {
  background: linear-gradient(black,black) left bottom/100% 1px no-repeat;
  animation: Underline .4s;

}

@keyframes Underline {
  0% {
    background-size: 0% 1px;
  }
  100% {
    background-size: 100% 1px;
  }
}



これをブラウザで確認するとこんな感じです。

元ネタは前に検索して見かけたのですが、ソース元は失念してしまいました。

keyframesは結構便利なので、これを使いこなせるようになるとJavaScriptを使わなくてもいろいろな表現をすることができます。表現の幅を広げたいなら、CSSのkeyframesを使ったアニメーションのやり方を覚えておくといいです。

こちら、@keyframesの部分のbackground-sizeのpx指定のところを変更すれば、ホバーしたときの最初と最後の線の太さを変えることができます。

@keyframes Underline {
  from {
    background-size: 0% 5px;//最初太く
  }
  to {
    background-size: 100% 1px;//最後は細く
  }
}

これをブラウザで確認すると、

また、backgroundのleft bottomをright bottomに変更すると右からアンダーラインのアニメーションができます。

.item .link:hover {
  background: linear-gradient(black,black) right bottom/100% 1px no-repeat;
  animation: Underline .4s;

}

こんな感じで、仮に参考サイトからコードをコピペしても、コードの一部を弄って自分なりのコードに改変するのも勉強になります。特に、動作確認をするのには。

ここを変えたら、動きはどうなるのか、というのを考えながらコーディングするとけっこうおもしろいです。

ここまで読んでくださりありがとうございました。

この記事を書いた人