hoverした時に中心からアンダーラインを出すcssアニメーション

Last modified date

hoverした時に要素の中心からラインを出す方法

今回はナビゲーションメニューで使える、cssテクニックを紹介するぞ。

ちなみに下が完成形だ。今回はHTMLとCSSだけで実装するぞ!


See the Pen
hoverした時に中央からラインが表示される
by 魔王 (@maou_frontend)
on CodePen.


HTML構造とCSS構造について

まずはHTML構造とCSS構造について書いていく。とはいえ、HTMLに関してはかなり簡単だ。

HTMLの構造

HTMLは今回普通のリストを用意した。現在表示されている場合はクラスに「navi-now」をつけている。

<ul class="navi-box">
  <li class="navi-box__list navi-now">
    <a class ="navi-box__link" href="#">トップ</a>
  </li>
  <li class="navi-box__list">
    <a class ="navi-box__link" href="#">魔王軍について</a>
  </li>
  <li class="navi-box__list">
    <a class ="navi-box__link" href="#">魔王軍の強み</a>
  </li>
  <li class="navi-box__list">
    <a class ="navi-box__link" href="#">お問い合わせ</a>
  </li>
  <li class="navi-box__list">
    <a class ="navi-box__link" href="#">採用情報</a>
  </li>
</ul>

CSSの構造

今回の中心はCSSなのだが、特にポイントとなる部分はafterで疑似要素を用意することと、その疑似要素に対しての動きを指定する部分であろうな。

下のコードだと、13~29行目と30~36行目の部分になるぞ。

ちなみにここのサイトではcssはscssで実装しているから、cssで使用したい場合はcodepenのcssタブの右にある下矢印ボタンから「view compiled css」を選択するがよい。

.navi-box {
  display:flex;
   &__list{
    font-size: 14px;
    text-align: center;
    list-style:none;
  }
  &__link{
    text-decoration: none;
    padding: 10px 15px;
    color: #000;
    position: relative;
    &:after{
      content: "";
      position: absolute;
      background: #000;
      left: 0;
      bottom: 0;
      right: 0;
      margin: 0 auto;
      width: 50%;
      height: 2px;
      -webkit-transform: scaleX(0);
      -ms-transform: scaleX(0);
      transform: scaleX(0);
      -webkit-transition: all .5s ease;
      -moz-transition: all .5s ease;
      transition: all .5s ease;
    }
    &:hover{
      &:after{
        -webkit-transform: scaleX(1);
        -ms-transform: scaleX(1);
        transform: scaleX(1);
      }
    }
  }
}

.navi-now a:after {
      -webkit-transform: scaleX(1);
      -ms-transform: scaleX(1);
      transform: scaleX(1);
    }
  

CSSアニメーションの設定内容

疑似要素にtransform: scaleX();を指定する

疑似要素で今回のアンダーラインの部分を実装していく。

今回表示させるのに使う要素はtransform: scaleX();である。

このtransform: scaleX();関数は、指定した要素をX軸(水平方向)に拡縮するものだ。

今回はhoverした時に表示されるようにするので、最初の状態ではtransform: scaleX(0);でゼロ地点を指定しているのである。

そうすることで、display:noneやvisibility:hiddenを使わずに非表示の状態にすることが可能だ。

&:after{
//contentには何も入れない
      content: "";
//親要素のpositionをrelativeに指定することを忘れるでないぞ
      position: absolute;
      background: #000;
      left: 0;
      bottom: 0;
      right: 0;
      margin: 0 auto;
//表示されたときのラインの長さを指定する。
      width: 50%;
//表示されたときのラインの太さを指定する。
      height: 2px;
//初期状態はゼロ地点を指定する
      -webkit-transform: scaleX(0);
      -ms-transform: scaleX(0);
      transform: scaleX(0);
//変化に要する時間を指定する
      -webkit-transition: all .5s ease;
      -moz-transition: all .5s ease;
      transition: all .5s ease;
    }

要素にhoverした際の動きを指定する

疑似要素で設定したライン要素をhoverした際に動かすには 、transform: scaleX(0);を(1)に変更してやればいい。

そうすることで、hoverした際に水平方向へゼロ地点から1地点へ拡大するのだ。

&:hover{
      &:after{
        -webkit-transform: scaleX(1);
        -ms-transform: scaleX(1);
        transform: scaleX(1);
      }
    }

まとめ

以上がhoverした際に、要素の中心からアンダーラインを表示させるテクニックである。

ポイントになる点は
・疑似要素でラインを作成する。
・transform: scaleX()でラインを変形させる。

この2つであろう。

色やサイズ、変形する大きさやスピードも変更できるので、自分のサイトに合うように変更すればよいだろう!

魔王様

コメントを残す

メールアドレスが公開されることはありません。

Post comment