ヘッダーメニューをホバーすると、アンダーラインが下から現れたり、左から伸びて現れたりするアニメーションを実装してみたい。
ホームページのヘッダーメニューをオシャレにしたい。
そのような方に向けた記事でございます。
本記事の内容
- ヘッダーのグローバルメニューとアンダーラインの準備
- ホバーするとアンダーラインが現れるアニメーション
- ホバーするとアンダーラインが左右に伸びるアニメーション
大学生向け就活対策コース有り。DMMのプログラミングスクール、無料体験、無料相談会実施中です。
ヘッダーのグローバルメニューとアンダーラインの準備
アニメーションを実装する前に、ヘッダーのグローバルメニューとアンダーラインを準備します。
ヘッダーのグローバルメニューの作り方は、別記事で紹介していますので、詳しいコードはそちらを参考にしてください。
アンダーラインのcss
擬似要素でアンダーラインを記述します。
a { position: relative; /*アンダーラインの位置を決めるための基準 */ } a::after { position: absolute; /*親要素であるaタグを基準に位置を指定*/ left: 0; /*アンダーラインを各メニュー(aタグ)の左端に指定*/ content: ''; /*本来は、擬似要素に入るテキストなどを’’内に指定。今回はアンダーラインなので何も記載しない*/ width: 100%; /*アンダーラインを各aタグの幅に合わせる*/ height: 2px; /*アンダーラインの高さ(太さ)*/ background: #000000;/*アンダーラインの色*/ }
position: relative;で、各ヘッダーメニューのaタグを基準とし、left: 0;にアンダーラインが位置します。
この状態では、見本のようにアンダーラインがヘッダーの上端にあります。
このコードに追記していく形で、8つのアニメーションを解説していきます。
ホバーするとアンダーラインが現れるアニメーション
- その①:表示のみ
- その②:上からフェードイン
- その③:下からフェードイン
その①:表示のみ
a::after { position: absolute; left: 0; content: ''; width: 100%; height: 2px; background: #000000; bottom: -1px; /*アンダーラインが位置する、各リストの下端からの高さ ヘッダーの下端に合わせています*/ visibility: hidden; /*ホバー前に、アンダーラインを可視化しない*/ } a:hover::after { visibility: visible; /*ホバー後、アンダーラインを可視化する*/ }
ちなみに、下記を追記すると、アンダーラインが徐々に現れます。
a::after { opacity: 0; } a:hover::after { opacity: 1; /*アンダーラインが透明な状態からアニメーションが開始され、ホバーを話して終了する際も、徐々に透明な状態に戻る。*/ transition: 0.3s; /*変形の時間*/ }
余談ですが、visibilityの値をhiddenにした場合の注意点を説明します。
値をhiddenにするとその要素がアクセシビリティーツリー削除されます。
今回は問題ないですが、contentにテキストを入れた場合、読み上げ技術でアナウンスされなくなります。
その②:上からフェードイン
a::after { position: absolute; left: 0; content: ''; width: 100%; height: 2px; background: #000000; bottom: 20px; /*アンダーラインが現れ始める位置(aタグの下辺からの高さ)*/ opacity: 0; visibility: hidden; transition: 0.3s; } a:hover::after { visibility: visible; bottom: 12px; /*アニメーションが止まる位置*/ opacity: 1; }
ヘッダー下端から20pxの位置を開始点とし、12pxの位置までの5pxを、アンダーラインが降りてきます。
その③:下からフェードイン
a::after { position: absolute; left: 0; content: ''; width: 100%; height: 2px; background: #000000; bottom: 4px; /*アンダーラインが現れ始める位置(aタグの下辺からの高さ)*/ opacity: 0; visibility: hidden; transition: 0.3s; } a:hover::after { visibility: visible; bottom: 12px; opacity: 1; }
「その②:上からフェードイン」のアニメーション開始位置を変更することで、下からフェードインするアニメーションを実装できます。
今回の場合、bottom: 4px;にすることで、ヘッダー下端4pxのところからアンダーラインが現れます。
上からフェードインでは、20px-12px=8pxの移動だったので、同じ距離(12px-4px=8px)を置いています。
ホバーするとアンダーラインが左右に伸長するアニメーション
- その①:左からアンダーラインがフェードイン
- その②:右からアンダーラインがフェードイン
- その③:左からフェードインし、右へフェードアウト
- その④:左からフェードインし、右へフェードアウト
- その⑤:真ん中からアンダーラインがフェードイン
短期集中で最短3ヶ月でITエンジニアへ転職を目指す(転職保証付き)DMMのエンジニア転職特化のプログラミングスクールです。無料カウンセリングも受付中です。
その①:左からアンダーラインがフェードイン
a::after { position: absolute; left: 0; content: ''; width: 100%; height: 2px; background: #000000; bottom: -1px; /*アンダーラインがaタグの下端から現れる*/ transform: scale(0, 1); /*アンダーラインの縮尺比率。ホバー前はx方向に0*/ transform-origin: left top; /*変形(アンダーラインの伸長)の原点がaタグ(各メニュー)の左端*/ transition: transform 0.3s; /*変形の時間*/ } a:hover::after { transform: scale(1, 1); /*ホバー後、x軸方向に1(相対値)伸長*/ }
アンダーバーの高さが2pxであるため、Bottom: -1px;とすることで、アンダーラインの真ん中(高さ1px)の位置にヘッダーの下端が重なるようにしています。
transform-origin: left top;とすることで、左に戻るができます。
その②:右からアンダーラインがフェードイン
a::after { position: absolute; left: 0; content: ''; width: 100%; height: 2px; background: #000000; bottom: -1px; transform: scale(0, 1); transform-origin: right top; /*変形(アンダーラインの伸長)の原点がaタグ(各メニュー)の右端*/ transition: transform 0.3s; /*変形の時間*/ } a:hover::after { transform: scale(1, 1); /*ホバー後、x軸方向に1(相対値)伸長*/ }
「その①:左からアンダーラインがフェードイン」transform-origin: left top; を transform-origin: right top;に変更すると、右からフェードインするアンダーライン になります。
その③:左からフェードインし、右へフェードアウト
a::after { position: absolute; left: 0; content: ''; width: 100%; height: 2px; background: #000000; bottom: -1px; transform: scale(0, 1); transform-origin: right top; /*変形(アンダーラインの伸長)の原点がaタグ(各メニュー)の右端*/ transition: transform 0.3s; /*変形の時間*/ } a:hover::after { transform: scale(1, 1); /*ホバー後、x軸方向に1(相対値)伸長*/ transform-origin: left top; /*左から右に向かう*/ }
transform-origin: right topとすることで、ホバーを外すと右にフェードアウトします。
その④:右からフェードインし、左へフェードアウト
a::after { position: absolute; left: 0; content: ''; width: 100%; height: 2px; background: #000000; bottom: -1px; transform: scale(0, 1); transform-origin: left top; /*変形(アンダーラインの伸長)の原点がaタグ(各メニュー)の左端*/ transition: transform 0.3s; /*変形の時間*/ } a:hover::after { transform: scale(1, 1); /*ホバー後、x軸方向に1(相対値)伸長*/ transform-origin: right top; /*右から左に向かう*/ }
transform-origin: left topとすることで、ホバーを外すと左にフェードアウトします。
その⑤:真ん中からアンダーラインがフェードイン
a::after { position: absolute; left: 0; content: ''; width: 100%; height: 2px; background: #000000; bottom: -1px; transform: scale(0, 1); transform-origin: center top; /*変形(アンダーラインの伸長)の原点がaタグ(各メニュー)の右端*/ transition: transform 0.3s; /*変形の時間*/ } a:hover::after { transform: scale(1, 1); /*ホバー後、x軸方向に1(相対値)伸長*/ }
transform-origin: center topとすることで、真ん中を原点として伸長します。
本記事では、分かりやすいようにクラスを設けず、セレクタのみを対象に記述していきました。
Webページによっては、アンダーラインを実装しない箇所にもaタグがあると思うので、適宜クラスを設けていただけるといいです。
とはいえ、どのようなヘッダーの形であり、メニューのaタグをセレクタとしてデザインを記述します。
時間を変えたり、アンダーラインの位置を変えるなど、ご自身が作りたいページに合わせてカスタマイズしてみてください。