ホバーエフェクト

公開日:2020-10-24 更新日:2020-10-29

1. 概要

マウスカーソルを要素に重ねた時(ホバー時)のエフェクトです。



2. 円をアニメーションで広げる

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>HTML・CSS・JavaScript</title>
    <style>
      .effect1 {
        position: relative;
        border-radius: 100%;
        background: #a0ffa0;
      }
      .effect1:after {
        position: absolute;
        content:"";
        left  : 0;
        top   : 0;
        right : 0;
        bottom: 0;
        background: #50c050;
        z-index: -1;
        border-radius: 100%;
        transition: transform 0.5s, opacity 0.5s;
        transform: scale(1.2);
        opacity: 1;
      }
      .effect1:hover:after {
        transform: scale(2);
        opacity: 0;
      }
    </style>
  </head>
  <body style="margin:0px; background-color:#fff; color:#000;">
    <div class="effect1" style="margin:40px; display: table; width:100px; height:100px;">
      <div style="display:table-cell; vertical-align: middle; text-align:center;">エフェクト</div>
    </div>
  </body>
</html>


実行結果:マウスを重ねると円が広がります。


角を100%丸めることにより、円にします。
border-radius: 100%;
background: #a0ffa0;

1.2倍に拡大した円を before か after で追加します。z-index で追加する層を指定。
.effect1:after {
  transform: scale(1.2);
  z-index: -1;
}

親要素がホバーされた時の after の属性を設定します。
.effect1:hover:after { }

ホバー後に円を透過します。
opacity: 0;

transform の拡大と、透過を0.5秒で変化(アニメーション)するようにします。
transition: transform 0.5s, opacity 0.5s;

円内の文字列を、縦と横で中央揃えにします。
親要素
  display: table;

子要素
  display:table-cell; vertical-align: middle; text-align:center;

3. 複数の文字例を上に移動しながら表示

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>HTML・CSS・JavaScript</title>
    <style>
      .effect2 {
        position: relative;
        overflow: hidden;
        width : 200px;
        height: 200px;
      }
      
      /* 画像 */
      .effect2_child1 {
        position: absolute;
        background-image: url("pic.jpg");
        width : 200px;
        height: 200px;
        top:  0px;
        left: 0px;
      }
      
      /* 文字1。最初は非表示(透過) */
      .effect2_child2 {
        position: absolute; 
        width : 200px;
        height: 200px;
        top : 150px;
        left:   0px;
        text-align: center;
        font-size: 48px;
        color: #fff;
        opacity: 0;
        transition: top 0.5s, opacity 0.5s;
        z-index: 1;
      }
      
      /* 文字2。最初は非表示(透過) */
      .effect2_child3 {
        position: absolute; 
        width : 200px;
        height: 200px;
        top : 150px;
        left:   0px;
        text-align: center;
        font-size: 24px;
        color: #fff;
        opacity: 0;
        transition: top 0.5s, opacity 0.5s;
        z-index: 1;
      }
      
      /* 黒の背景。最初は非表示(透過) */
      .effect2_child4 {
        position: absolute;
        width : 200px;
        height: 200px;
        top : 0px;
        left: 0px;
        opacity: 0;
        background-color: #000;
        transition: opacity 0.5s;
      }
      
      /* 文字1を上に移動 */
      .effect2:hover .effect2_child2 {
        top: 50px;
        opacity: 1;
      }
      
      /* 文字2を上に移動 */
      .effect2:hover .effect2_child3 {
        top: 120px;
        opacity: 1;
      }
      
      /* 黒の背景の透過を少し解除 */
      .effect2:hover .effect2_child4 {
        opacity: 0.3;
      }
    </style>
  </head>
  <body style="margin:0px; background-color:#fff; color:#000;">
    
    <div class="effect2" style="margin:10px;">
      <div class="effect2_child1"></div>
      <div class="effect2_child2">
        Hello!!
      </div>
      <div class="effect2_child3">
        <a href="" style="color:#fff;">Click!!</a>
      </div>
      <div class="effect2_child4"><!-- 黒い背景 --></div>
    </div>
    
  </body>
</html>


実行結果:マウスを重ねると、文字が下から上へ浮かび上がります。


hover の後ろにクラス名を付けて、hover 時の子要素の属性を変更しています。
.effect2:hover .effect2_child2 { }
.effect2:hover .effect2_child3 { }
.effect2:hover .effect2_child4 { }

要素を複数にして、透過の比率や top を変更しているだけで、
基本的には1つ目のサンプルと同じです。