Webサイトで使われるアニメーションの中には、JavaScriptを使わずにCSSのみで実装できる簡単なものが含まれていることがあります。
CSSのみで実行できると、動作が軽くなるのでおすすめです。
この記事ではHTML・CSSを用いた「ホバーで線が動くアニメーション」の作り方を解説します。
- CSSのホバーアニメーションの作り方
プログラミング学習でこのような経験はありませんか?
- 目標に向けて何を学べば良いかわからない
- 調べても解決策が見つからない
- 現場レベルのスキルが身につくのか不安
これらの悩みは、学習環境を整えることで全て解決することができます。
ZeroPlus Gateでは、30日間無料で最適な学習環境を提供しています。
- なんでも相談できる専属メンター
- いつでも技術相談ができるプロ講師
- 元IT企業CTO監修のカリキュラム
条件なしでこのレベルの環境を無料で提供しているのはZeroPlus Gateだけです。
ただし、無料サービスの提供には参加者の数に制限があります。
少しでも興味がある方は、以下のリンクからサービスの詳細をご覧ください。
目次
ホバーアニメーションのサンプルコードダウンロード
下記のリンクからサンプルをダウンロードしてください。
ファイルを開くと、下記2つのファイルが入っています。
- 「code」→HTML・CSSが入っているファイル
下記からサンプルコードを確認することもできます。
See the Pen line-animation by ZeroPlus (@zeroplus-programming) on CodePen.
要素をホバーすると、要素の外枠の線が動きます。
ホバーアニメーション作成のポイント
この記事で紹介するホバーアニメーション実装のポイントは4点あります。
アニメーション実装ポイント
- 疑似クラスの
:nth-child()
を使う。 transform: scale();
を使う。- ホバー前とホバー後のスタイルを作成する。
transform-origin
を使う。
それぞれのポイントについては、下記のセクションで解説していきます!
なお、疑似クラスについては、下記の記事で詳しく解説しています。
@keyframesを使う場合のアニメーションについては、下記の記事で詳しく解説しています。
ホバーアニメーションを実装してみよう!
ここからは、ホバーアニメーションの実装をしていきます。
ベースとなる要素のHTMLとCSSは次のようになります。
HTMLとCSSを見る
<div class="box">
<span class="box__line"></span>
<span class="box__line"></span>
<span class="box__line"></span>
<span class="box__line"></span>
</div>
.box {
width: 200px;
height: 200px;
margin: 0 auto;
position: relative;
display: block;
cursor: pointer;
background: orange;
}
.box__line {
position: absolute;
}
.box__line:nth-child(1),
.box__line:nth-child(3) {
width: 100%;
height: 2px;
background: #000;
}
.box__line:nth-child(2),
.box__line:nth-child(4) {
width: 2px;
height: 100%;
background: #000;
}
.box__line:nth-child(1) {
top: 0;
left: 0;
}
.box__line:nth-child(2) {
top: 0;
left: 0;
}
.box__line:nth-child(3) {
bottom: 0;
left: 0;
}
.box__line:nth-child(4) {
top: 0;
right: 0;
}
See the Pen line-animation-sample by ZeroPlus (@zeroplus-programming) on CodePen.
position: absolute;
です。線はspanタグのwidth
とheight
、background-color
で表現します。疑似クラスnth-child
で上下左右の線をそれぞれ指定しています。
- 上の線:
box__line:nth-child(1)
- 下の線:
box__line:nth-child(3)
- 右の線:
box__line:nth-child(2)
- 左の線:
box__line:nth-child(4)
transform: scale();で線の動きを制御する
初期状態では左右の線を消したいので、左右のbox__lineクラスに対してtransform: scaleY(0);
を指定しましょう。左右の線はY軸方向に伸びているので、Y軸方向のscaleY
を指定します。
.box__line:nth-child(2) {
top: 0;
left: 0;
transform: scaleY(0);
}
.box__line:nth-child(4) {
top: 0;
right: 0;
transform: scaleY(0);
}
transform: scale;
で、指定した要素に対して拡大・縮小するスタイルが適用されます。scaleY(0)
で線が完全に縮小されて見えなくなります。
scaleY
のイメージができない場合は、例えばscaleY
の値を0.1、0.5と指定してみましょう。
transform: scaleY(0.1)の場合
See the Pen line-animation-sample-scaleY by ZeroPlus (@zeroplus-programming) on CodePen.
transform: scaleY(0.5)の場合
See the Pen line-animation-sample-scaleY0.5 by ZeroPlus (@zeroplus-programming) on CodePen.
数字が少ないほど線が短く(縮小)、数字が大きいほど線が長く(拡大)されます。ここでは初期状態で左右の線を消したいので、scaleY(0)
を適用します。
次に、ホバーしたときの線の動きを指定します。
.box:hover .box__line:nth-child(1) {
transform: scaleX(0);
}
.box:hover .box__line:nth-child(2) {
transform: scaleY(1);
}
.box:hover .box__line:nth-child(3) {
transform: scaleX(0);
}
.box:hover .box__line:nth-child(4) {
transform: scaleY(1);
}
出力結果
See the Pen line-animation-sample-scale by ZeroPlus (@zeroplus-programming) on CodePen.
左右の線にはtransform: scaleX(1);
を適用して線を表示、上下の線はtransform: scaleY(0);
で消します。この時点で要素をホバーしても上下左右の線が表示・非表示交互に切り替わるだけです。
ホバー前後の動きをtransitionプロパティで制御する
そこでtransition
を適用して表示・非表示の時間を制御します。その際に、ホバー前とホバー後の両方にtransitionを適用しましょう。
.box__line {
position: absolute;
transition: transfrom .5s; /*追記*/
}
.box__line:nth-child(1) {
top: 0;
left: 0;
transition: transform .5s; /*追記*/
}
.box__line:nth-child(2) {
top: 0;
left: 0;
transform: scaleY(0);
transition: transform .5s; /*追記*/
}
.box__line:nth-child(3) {
bottom: 0;
left: 0;
transition: transform .5s; /*追記*/
}
.box__line:nth-child(4) {
top: 0;
right: 0;
transform: scaleY(0);
transition: transform .5s; /*追記*/
}
.box:hover .box__line:nth-child(1) {
transform: scaleX(0);
transition: transform .5s; /*追記*/
}
.box:hover .box__line:nth-child(2) {
transform: scaleY(1);
transition: transform .5s; /*追記*/
}
.box:hover .box__line:nth-child(3) {
transform: scaleX(0);
transition: transform .5s; /*追記*/
}
.box:hover .box__line:nth-child(4) {
transform: scaleY(1);
transition: transform .5s; /*追記*/
}
出力結果
See the Pen line-animation-sample-transition by ZeroPlus (@zeroplus-programming) on CodePen.
現状ではホバーしても「中央から両端に向かって線が伸縮する」だけです。
transform-originプロパティで変形させる要素の中心点を制御する
線の伸縮の方向をtransform-originプロパティを使って下記のようにします。
ホバーしたら伸縮したい線の方向
- 上の線:
box__line:nth-child(1)
は右から左へ - 下の線:
box__line:nth-child(3)
は左から右へ - 右の線:
box__line:nth-child(2)
は下から上へ - 左の線:
box__line:nth-child(4)
は上から下へ
それぞれのbox__lineクラスに対して、transform-originプロパティを設定していきます。transform-origin
は、変形する要素の中心点を指定します。
例えばホバーしたときの上の線(box__line:nth-child(1)
)にtransform-origin: left;
と適用すれば、中心点のx座標が0%(左端)になります。
transform-originプロパティ適用前では上の線の動きは、中心に向かって線が縮んでいます。
transform-originプロパティ適用後では中心点が左端(x軸)になるので、線の動きが左端に向かって線が移動するイメージになります。
.box:hover .box__line:nth-child(1) {
transform: scaleX(0);
transform-origin: left; /*追記*/
transition: transform .5s;
}
.box:hover .box__line:nth-child(2) {
transform: scaleY(1);
transform-origin: top; /*追記*/
transition: transform .5s;
}
.box:hover .box__line:nth-child(3) {
transform: scaleX(0);
transform-origin: right; /*追記*/
transition: transform .5s;
}
.box:hover .box__line:nth-child(4) {
transform: scaleY(1);
transform-origin: bottom; /*追記*/
transition: transform .5s;
}
出力結果
See the Pen Untitled by ZeroPlus (@zeroplus-programming) on CodePen.
これで要素をホバーすると次のような線の動きになります。
ホバーしたら伸縮したい線の方向
- 上の線:
box__line:nth-child(1)
は右から左へ - 下の線:
box__line:nth-child(3)
は左から右へ - 右の線:
box__line:nth-child(2)
は下から上へ - 左の線:
box__line:nth-child(4)
は上から下へ
そして最後に、ホバー前の要素にもtransform-origin
を指定してください。
.box__line:nth-child(1) {
top: 0;
left: 0;
transform-origin: right; /*追記*/
transition: transform .5s;
}
.box__line:nth-child(2) {
top: 0;
left: 0;
transform: scaleY(0);
transform-origin: bottom; /*追記*/
transition: transform .5s;
}
.box__line:nth-child(3) {
bottom: 0;
left: 0;
transform-origin: left; /*追記*/
transition: transform .5s;
}
.box__line:nth-child(4) {
top: 0;
right: 0;
transform: scaleY(0);
transform-origin: top; /*追記*/
transition: transform .5s;
}
出力結果
See the Pen line-animation by ZeroPlus (@zeroplus-programming) on CodePen.
これで完成となります!
まとめ
簡単なアニメーションであれば、JavaScriptやjQueryを使わずにHTMLとCSSのみで実装することができます。transformプロパティやtransform-originプロパティの組み合わせで実装しましょう。
このように複数のプロパティを使い、ホバー前とホバー後で見た目に差をつけることで、アニメーションのような動きにすることができます。
この記事では線を動かしましたが、要素にも動きを加えることができるので、自分でカスタマイズしてみましょう!
アニメーション実装ポイントまとめ
- 疑似クラスの
:nth-child()
を使う。 transform: scale();
を使う。- ホバー前とホバー後のスタイルを作成する。
transform-origin
を使う。
プログラミング学習でこのような経験はありませんか?
- 目標に向けて何を学べば良いかわからない
- 調べても解決策が見つからない
- 現場レベルのスキルが身につくのか不安
これらの悩みは、学習環境を整えることで全て解決することができます。
ZeroPlus Gateでは、30日間無料で最適な学習環境を提供しています。
- なんでも相談できる専属メンター
- いつでも技術相談ができるプロ講師
- 元IT企業CTO監修のカリキュラム
条件なしでこのレベルの環境を無料で提供しているのはZeroPlus Gateだけです。
ただし、無料サービスの提供には参加者の数に制限があります。
少しでも興味がある方は、以下のリンクからサービスの詳細をご覧ください。