CSS3のアニメーションを使ったボタン
CSS3では、jQuery等を使うことなく、アニメーションを実装することができます。
これまで、CSS3のアニメーションの存在は知っていたのですが、どのように実装するのかはあまりよくわかっていませんでした。
http://photoshopvip.net/archives/23678
↑こちらのサイトでクリックしたくなるボタンについて学習していたところ、
中にCSS3アニメーションを利用したものがあり(http://tutorialzine.com/2010/10/css3-animated-bubble-buttons/)面白かったので、
CSS3アニメーションの学習もかねて、実際に作ってみることにしました。
今回は、水面をイメージしたボタンを作ってみることにしました。
こちらが作ったもの↓
方法
手順1
まず、アニメーションに利用する画像を準備します。
マウスをボタンに重ねたときに、ボタンが凹んで、水面のように波紋が広がるアニメーションにします。
ボタンの画像と、波紋の画像を重ねて表示するため、2つの画像を準備しました。
ボタンの画像
波紋の画像
(波紋の画像の作り方はこちらを参考にさせていただきました→http://vanet.kakoku.net/photo_19.html)
手順2
HTMLでボタンを設置します。
html
1 2 | <p><a href="#" id="button1">PUSH</a></p> <p><a href="#" id="button2">PUSH</a></p> |
CSS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | *{ margin: 0; padding: 0; } body{ background: #fff; } p{ width: 50px; height: 50px; margin: 100px; } p{ display: block; width: 90px; height: 90px; padding: 5px; background: url(../images/button.png) no-repeat; background-position: 0 0; } p:hover{ background-position: 0px -100px; } |
波紋をaタグでアニメーションするため、ボタンは外側の背景画像で描画しました。
手順3
いよいよアニメーションの実装です。
CSS3のアニメーションにはいくつかのやり方があるようですので、今回は2つのやり方を使ってみることにしました。
1つめ(#button1)は、「animation」を使った方法です。
こちらは、タイムラインでアニメーションの動きを設定する方法です。
まず、pタグの中で、波紋を表示する範囲になるようにaタグを配置します。
1 2 3 4 5 6 7 8 9 10 11 12 13 | a#button1{ display: block; width: 90px; height: 90px; -webkit-border-radius: 45px; -moz-border-radius: 45px; border-radius: 45px; background: url(../images/ripple.png) no-repeat; background-size: 0px; background-position: 0 0; text-indent: -9999px; overflow: hidden; } |
次に、hover時のアニメーションを設定します。
「animation-name」で名前を設定し、「animation-duration」でアニメーションの時間を設定し、
「@keyframes [設定した名前]」でタイムライン(今回は%で指定)ごとの動きを設定します。
波紋の画像を徐々に表示しながら、大きさを拡大することで、波紋を表現しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | a#button1:hover{ -webkit-animation-name: ripple; -moz-animation-name: ripple; -webkit-animation-duration: 1s; -moz-animation-duration: 1s; } @-webkit-keyframes ripple{ 0%{ background-size: 0px; background-position: 45px 45px; opacity: 0; } 15%{ opacity: 1; background-size: 180px; background-position: -45px -45px; } 100%{ background-size: 360px; background-position: -135px -135px; opacity: 0; } } @-moz-keyframes ripple{ 0%{ background-size: 0px; background-position: 45px 45px; opacity: 0; } 15%{ opacity: 1; background-size: 180px; background-position: -45px -45px; } 100%{ background-size: 360px; background-position: -135px -135px; opacity: 0; } } |
これで1つ目のアニメーションが実装できました。
2つ目(#button2)は、「transition」を使った方法です。
こちらは、hoverでない状態と、hoverの状態を、ぱっと切り替えず、
指定した時間で状態をスムーズに変化させることでアニメーションする方法です。
まず、1つめと同様に設置しますが、プラスして、「transition: [属性] [変化にかける時間]」で変化させる属性と変化にかける時間を設定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | a#button2{ display: block; width: 90px; height: 90px; -webkit-border-radius: 45px; -moz-border-radius: 45px; border-radius: 45px; background: url(../images/ripple.png) no-repeat; background-size: 0px; background-position: 45px 45px; text-indent: -9999px; opacity: 0; overflow: hidden; -webkit-transition:background-position 0.5s, background-size 0.5s, opacity 0.5s; -moz-transition:background-position 0.5s, background-size 0.5s, opacity 0.5s; } |
次にhover時の状態を指定します。
1 2 3 4 5 | a#button2:hover{ background-size: 360px; background-position: -135px -135px; opacity: 1; } |
これで2つ目のアニメーションが実装できました。
「animation」による実装の場合、タイムラインごとの細かなアニメーションが設定できる代わりに、
アニメーションの途中でhoverをやめると、アニメーションが中断してしまうという特徴があります。
逆に「transition」を使った方法では、タイムラインごとの細かなアニメーションの設定はできませんが、
アニメーション中にhoverをやめても、アニメーションでスムーズに戻るという特徴があります。
必要に応じてどちらの方法を使うか、選ぶことが良いようです。
Author Profile
NINOMIYA
Webデザイナー兼コーダー出身のフロントエンド開発者です。 UXデザインやチーム開発の効率化など、勉強中です。
SHARE