2015/10/13
よくわかる 初心者のためのCSS3 transitionとtransformのチュートリアル
初心者のためのCSS3 transition(トランジション)とtransform(トランスフォーム)のチュートリアルです。
海外の有名ブログから、わかりやすいチュートリアルを選んで翻訳してみました(結構、意訳したり、説明を付け足しています)。
CSS3 transitionとtransformを使ったサイトは、かなり頻繁に見かけます。
なめらかで楽しいその動きに、思わず手を止めて見てしまう人も多いのではないでしょうか。
そんなCSS3 transitionとtransformを実装できると、本人としても楽しくなってきますよね。
今回のチュートリアルでは、CSS3 transitionとtransformの基本的なところから、ご説明したいと思います。
実際に制作するサンプルは、以下のようなシンプルなものです。
See the Pen vNZrwQ by yugusato (@yugusato) on CodePen.
CSS3 transitionとtransformのご参考になれば幸いです。
transitionはカーソルを重ねるなどの動作で、始点と終点のアニメーションを変化させるプロパティ
transitionプロパティというのは、たとえば、要素にカーソルを重ねたときに、リンクのデザインをアニメーションさせることのできるプロパティです。
たとえば、始点=a要素、終点はa:hoverで、それぞれにCSSでデザインを設定します。
以下のようなCSSがあったとします。
このままでは、要素をカーソルに合わせたときに、いきなり背景色が変化するだけです。
1 2 3 4 5 6 |
a. { background: coral; } a:hover { background: #ccc; } |
このコードにtransitionを加えると以下のようになります。
transitionにはベンダープリフィックスをつけます。
ベンダープリフィックスを一度に付けたい場合は、「Express Prefixr」が便利ですよ。
1 2 3 4 5 6 7 8 9 10 |
a { background: coral; -webkit-transition: all 0.7s ease; -moz-transition: all 0.7s ease; -o-transition: all 0.7s ease; transition: all 0.7s ease; } a:hover { background: #ccc; } |
これで、カーソルを合わせたときに、ふわりとしたアニメーションで変化するようになります。
See the Pen XmgNOg by yugusato (@yugusato) on CodePen.
ここで使用している「transition: all 0.3s ease;」は複数のプロパティをまとめたもの(ショートハンド)です。
「all」はすべてのプロパティを対象に、「0.3s」は変化に要する時間、「ease」は変化のスピードです。
この変化のスピードには、linear(一定の速度で再生)、ease(最初と最後を滑らかに再生)、ease-in(最初をゆっくり再生)、ease-out(最後をゆっくり再生)、ease-in-out(最初と最後をゆっくり再生)、cubic-bezier(より細かく指定する場合に利用)などがあります。
transformはxy座標を利用する
transformプロパティもアニメーションのように動きますが、animationプロパティとは異なります。
animationプロパティがキーフレームを利用するのに対して、transformプロパティではxy座標を利用します。
具体的には以下のようなイメージです。
transformプロパティでは、要素がこのxy座標の原点(0,0)に配置され、移動(translate)、回転(rotate)、拡大縮小(scale)などの動きをつけることが可能になります。
水平に右へ移動させる
transitionとtransformを組み合わせて実装してみましょう。
最初は、要素が水平に右へ移動するデモです。
水平移動させるには、transform: translate(x,y);を利用します。
HTMLは以下のようになります。
1 2 3 |
<div id="axis" class="one"> <p class="object van move-right" >demo</p> </div> |
以上の要素に対してCSSを設定します。
まずは中央付近に配置します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#axis{ //移動させる要素の背景に当たる部分 border: 5px #f7f7f7 solid; font: 10pt normal Arial, sans-serif; height: 600px; margin: 30px auto 80px auto; position: relative; text-align: center; width: 600px; -webkit-box-shadow: 0px 0px 5px 2px rgba(0, 0, 0, 0.1); -moz-box-shadow: 0px 0px 5px 2px rgba(0, 0, 0, 0.1); box-shadow: 0px 0px 5px 2px rgba(0, 0, 0, 0.1); } .object { position: absolute; padding:50px; background:coral; .van { top: 40%; left: 40%; } |
この要素に対して、350px右に移動させることにします。
さらに、要素の背景にあたる#axisにカーソルが乗ったときに、移動がスタートするようにします。
1 2 3 4 5 6 |
#axis:hover .move-right{ transform: translate(350px,0); -webkit-transform: translate(350px,0); /** Chrome & Safari **/ -o-transform: translate(350px,0); /** Opera **/ -moz-transform: translate(350px,0); /** Firefox **/ } |
これで右350pxに移動するようになりましたが、transitionの設定をしていないために突然、瞬間移動のようなります。
始点と終点の間をアニメーションさせるために、transitionプロパティを加えます。
1 2 3 4 5 6 |
position: absolute; padding:50px; background:coral; -webkit-transition: all 2s ease-in-out; -moz-transition: all 2s ease-in-out; -o-transition: all 2s ease-in-out; |
「all」ですべてのプロパティを対象に、「2s」で変化に要する時間を2秒に、「ease-in-out」で最初と最後をゆっくり再生にしています。
デモは以下のようになります。
See the Pen vNZarB by yugusato (@yugusato) on CodePen.
水平に左へ移動させる
続いては、さきほどとはまったく逆の水平に左へと移動させてみましょう。
350px左へ移動させるので、-350px移動させることになります。
HTMLは以下のようにします。
1 2 3 |
<div id="axis" class="one"> <p class="object van move-left" >demo</p> </div> |
CSSは、水平右方向とは逆に、transform: translateの値を-350pxに変えるだけです。
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 |
#axis{ border: 5px #f7f7f7 solid; font: 10pt normal Arial, sans-serif; height: 600px; margin: 30px auto 80px auto; position: relative; text-align: center; width: 600px; -webkit-box-shadow: 0px 0px 5px 2px rgba(0, 0, 0, 0.1); -moz-box-shadow: 0px 0px 5px 2px rgba(0, 0, 0, 0.1); box-shadow: 0px 0px 5px 2px rgba(0, 0, 0, 0.1); } .object { position: absolute; padding:50px; background:coral; -webkit-transition: all 2s ease-in-out; -moz-transition: all 2s ease-in-out; -o-transition: all 2s ease-in-out; } .van { top: 40%; left: 40%; } #axis:hover .move-left{ transform: translate(-350px,0); -webkit-transform: translate(-350px,0); -o-transform: translate(-350px,0); -moz-transform: translate(-350px,0); } |
デモは以下のようになります。
See the Pen pjwKjX by yugusato (@yugusato) on CodePen.
もうイメージが掴めてしまいました?
垂直に上方向へ移動させる
今度は垂直方向に移動させます。
水平やX軸でしたので、垂直はY軸の値を設定することになります。
ただし、注意が必要なのはY軸の値です。
通常のXY軸では、上方向はプラス、下方向はマイナスだと思いますが、transformで利用するY軸は上方向がマイナス、下方向がプラスになります。
この点だけ注意しましょう。
まずはHTMLです。
1 2 3 |
<div id="axis" class="one"> <p class="object van move-up" >demo</p> </div> |
続いてはCSS。
上方向に350px移動させたいので、transform: translateにマイナスの値を設定します。
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 |
#axis{ border: 5px #f7f7f7 solid; font: 10pt normal Arial, sans-serif; height: 600px; margin: 30px auto 80px auto; position: relative; text-align: center; width: 600px; -webkit-box-shadow: 0px 0px 5px 2px rgba(0, 0, 0, 0.1); -moz-box-shadow: 0px 0px 5px 2px rgba(0, 0, 0, 0.1); box-shadow: 0px 0px 5px 2px rgba(0, 0, 0, 0.1); } .object { position: absolute; padding:50px; background:coral; -webkit-transition: all 2s ease-in-out; -moz-transition: all 2s ease-in-out; -o-transition: all 2s ease-in-out; } .van { top: 40%; left: 40%; } #axis:hover .move-up{ transform: translate(0,-350px); -webkit-transform: translate(0,-350px); -o-transform: translate(0,-350px); -moz-transform: translate(0,-350px); } |
デモは以下のようになります。
See the Pen yYXEJB by yugusato (@yugusato) on CodePen.
垂直に下方向へ移動させる
今度は垂直に下方向へ移動させます。
先ほどとY軸の値が、逆になるだけです。
下方向に移動するので値はプラスになります。
まずはHTMLです。
1 2 3 |
<div id="axis" class="one"> <p class="object van move-down" >demo</p> </div> |
続いてはCSS。
下方向に350px移動させたいので、transform: translateにプラスの値を設定します。
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 |
#axis{ border: 5px #f7f7f7 solid; font: 10pt normal Arial, sans-serif; height: 600px; margin: 30px auto 80px auto; position: relative; text-align: center; width: 600px; -webkit-box-shadow: 0px 0px 5px 2px rgba(0, 0, 0, 0.1); -moz-box-shadow: 0px 0px 5px 2px rgba(0, 0, 0, 0.1); box-shadow: 0px 0px 5px 2px rgba(0, 0, 0, 0.1); } .object { position: absolute; padding:50px; background:coral; -webkit-transition: all 2s ease-in-out; -moz-transition: all 2s ease-in-out; -o-transition: all 2s ease-in-out; } .van { top: 40%; left: 40%; } #axis:hover .move-down{ transform: translate(0,350px); -webkit-transform: translate(0,350px); -o-transform: translate(0,350px); -moz-transform: translate(0,350px); } |
デモでは以下のようになります。
See the Pen EVXRNg by yugusato (@yugusato) on CodePen.
対角線、右上方向へ移動させる
今度は対角線上に右上方向へ移動させてみましょう。
対角線の右上方向ですので、X=350px、Y=-350pxという値になります。
もう簡単ですね。
まずはHTMLです。
1 2 3 |
<div id="axis" class="one"> <p class="object van move-ne" >demo</p> </div> |
続いてはCSS。
対角線の右上方向に移動させたいので、transform: translateにX=350px、Y=-350pxを設定します。
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 |
#axis{ border: 5px #f7f7f7 solid; font: 10pt normal Arial, sans-serif; height: 600px; margin: 30px auto 80px auto; position: relative; text-align: center; width: 600px; -webkit-box-shadow: 0px 0px 5px 2px rgba(0, 0, 0, 0.1); -moz-box-shadow: 0px 0px 5px 2px rgba(0, 0, 0, 0.1); box-shadow: 0px 0px 5px 2px rgba(0, 0, 0, 0.1); } .object { position: absolute; padding:50px; background:coral; -webkit-transition: all 2s ease-in-out; -moz-transition: all 2s ease-in-out; -o-transition: all 2s ease-in-out; } .van { top: 40%; left: 40%; } #axis:hover .move-ne{ transform: translate(350px,-350px); -webkit-transform: translate(350px,-350px); -o-transform: translate(350px,-350px); -moz-transform: translate(350px,-350px); } |
デモでは以下のようになります。
See the Pen epRKrd by yugusato (@yugusato) on CodePen.
対角線、左下方向へ移動させる
今度は対角線上に左下方向へ移動させてみましょう。
もうおわかりと思いますが、念のためです。
対角線の左下方向ですので、X=-350px、Y=350pxという値になります。
まずはHTMLです。
1 2 3 |
<div id="axis" class="one"> <p class="object van move-po" >demo</p> </div> |
続いてはCSS。
対角線の左下方向に移動させたいので、transform: translateにX=-350px、Y=350pxを設定します。
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 |
#axis{ border: 5px #f7f7f7 solid; font: 10pt normal Arial, sans-serif; height: 600px; margin: 30px auto 80px auto; position: relative; text-align: center; width: 600px; -webkit-box-shadow: 0px 0px 5px 2px rgba(0, 0, 0, 0.1); -moz-box-shadow: 0px 0px 5px 2px rgba(0, 0, 0, 0.1); box-shadow: 0px 0px 5px 2px rgba(0, 0, 0, 0.1); } .object { position: absolute; padding:50px; background:coral; -webkit-transition: all 2s ease-in-out; -moz-transition: all 2s ease-in-out; -o-transition: all 2s ease-in-out; } .van { top: 40%; left: 40%; } #axis:hover .move-po{ transform: translate(-350px,350px); -webkit-transform: translate(-350px,350px); -o-transform: translate(-350px,350px); -moz-transform: translate(-350px,350px); } |
デモでは以下のようになります。
See the Pen avwKay by yugusato (@yugusato) on CodePen.
右回りに回転させる
続いては要素を回転させてみましょう。
最初は右回り(時計回り)です。
要素を回転させるには、transform: rotate(deg)を利用します。
degには回転の角度を記入します。
一回転させたいなら360degとなります。
ではHTMLから。
1 2 3 |
<div id="axis" class="one"> <p class="object van rotate360deg" >demo</p> </div> |
続いてCSS。今回は右まわりに一回転させたいので、transform: rotate(360deg);となります。
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 |
#axis{ border: 5px #f7f7f7 solid; font: 10pt normal Arial, sans-serif; height: 600px; margin: 30px auto 80px auto; position: relative; text-align: center; width: 600px; -webkit-box-shadow: 0px 0px 5px 2px rgba(0, 0, 0, 0.1); -moz-box-shadow: 0px 0px 5px 2px rgba(0, 0, 0, 0.1); box-shadow: 0px 0px 5px 2px rgba(0, 0, 0, 0.1); } .object { position: absolute; padding:50px; background:coral; -webkit-transition: all 2s ease-in-out; -moz-transition: all 2s ease-in-out; -o-transition: all 2s ease-in-out; } .van { top: 40%; left: 40%; } #axis:hover .rotate360deg{ transform: rotate(360deg); -webkit-transform: rotate(360deg); -o-transform: rotate(360deg); -moz-transform: rotate(360deg); } |
デモは以下のようになります。
See the Pen QjgxJw by yugusato (@yugusato) on CodePen.
左回りに回転させる
今度は左回りです。
左回りですから、さっきと逆ですね。
ではHTMLから。
1 2 3 |
<div id="axis" class="one"> <p class="object van rotate-360deg" >demo</p> </div> |
続いてCSS。今回は左回りに一回転させたいので、transform: rotate(-360deg);となります。
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 |
#axis{ border: 5px #f7f7f7 solid; font: 10pt normal Arial, sans-serif; height: 600px; margin: 30px auto 80px auto; position: relative; text-align: center; width: 600px; -webkit-box-shadow: 0px 0px 5px 2px rgba(0, 0, 0, 0.1); -moz-box-shadow: 0px 0px 5px 2px rgba(0, 0, 0, 0.1); box-shadow: 0px 0px 5px 2px rgba(0, 0, 0, 0.1); } .object { position: absolute; padding:50px; background:coral; -webkit-transition: all 2s ease-in-out; -moz-transition: all 2s ease-in-out; -o-transition: all 2s ease-in-out; } .van { top: 40%; left: 40%; } #axis:hover .rotate-360deg{ transform: rotate(-360deg); -webkit-transform: rotate(-360deg); -o-transform: rotate(-360deg); -moz-transform: rotate(-360deg); } |
デモは以下のようになります。
See the Pen XmgYoR by yugusato (@yugusato) on CodePen.
拡大させる
今度は要素を拡大させてみましょう。
拡大させるには、transform: scale(n)、もしくは、transform: scale(x,y)を利用します。
nには倍率を記入します。200%に拡大したい場合はtransform: scale(2)となります。
X軸、Y軸で拡大率を変えたい場合は、transform: scale(x,y)を利用します。
たとえば、横方向では200%拡大、縦方向では300%拡大したいといった場合には、transform: scale(2,3)と記述します。
ではHTMLから。
1 2 3 |
<div id="axis" class="one"> <p class="object van larger" >demo</p> </div> |
続いてCSS。200%拡大させたいので、transform: scale(2)とします。
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 |
#axis{ border: 5px #f7f7f7 solid; font: 10pt normal Arial, sans-serif; height: 600px; margin: 30px auto 80px auto; position: relative; text-align: center; width: 600px; -webkit-box-shadow: 0px 0px 5px 2px rgba(0, 0, 0, 0.1); -moz-box-shadow: 0px 0px 5px 2px rgba(0, 0, 0, 0.1); box-shadow: 0px 0px 5px 2px rgba(0, 0, 0, 0.1); } .object { position: absolute; padding:50px; background:coral; -webkit-transition: all 2s ease-in-out; -moz-transition: all 2s ease-in-out; -o-transition: all 2s ease-in-out; } .van { top: 40%; left: 40%; } #axis:hover .larger{ transform: scale(2); -webkit-transform: scale(2); -o-transform: scale(2); -moz-transform: scale(2); } |
デモは以下のようになります。
See the Pen gaRKEE by yugusato (@yugusato) on CodePen.
複合的な動きをつける(移動+回転+拡大)
最後は、これまでの動きを組み合わせた動きを実装してみます。
transformプロパティは複数のプロパティをもつことができるので、いろいろな動きを組み合わせることが可能です。
ここでは、対角線右上方向に移動しながら回転しつつ、200%拡大させてみましょう。
まずはHTMLです。
1 2 3 |
<div id="axis" class="one"> <p class="object van multiple-move" >demo</p> </div> |
続いてCSSです。
対角線右上方向に移動しながら回転しつつ、200%拡大ですから、translate(350px,-350px) rotate(360deg) scale(2)となります。
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 |
#axis{ border: 5px #f7f7f7 solid; font: 10pt normal Arial, sans-serif; height: 600px; margin: 30px auto 80px auto; position: relative; text-align: center; width: 600px; -webkit-box-shadow: 0px 0px 5px 2px rgba(0, 0, 0, 0.1); -moz-box-shadow: 0px 0px 5px 2px rgba(0, 0, 0, 0.1); box-shadow: 0px 0px 5px 2px rgba(0, 0, 0, 0.1); } .object { position: absolute; padding:50px; background:coral; -webkit-transition: all 2s ease-in-out; -moz-transition: all 2s ease-in-out; -o-transition: all 2s ease-in-out; } .van { top: 40%; left: 40%; } #axis:hover .multiple-move{ transform: translate(350px,-350px) rotate(360deg) scale(2) ; -webkit-transform: translate(350px,-350px) rotate(360deg) scale(2); -o-transform: translate(350px,-350px) rotate(360deg) scale(2); -moz-transform: translate(350px,-350px) rotate(360deg) scale(2); } |
デモは以下のようになります。
See the Pen vNZrwQ by yugusato (@yugusato) on CodePen.
複合的な動きでは、記述の順番に注意しましょう。
記述の順番が変わるだけで、動きがまったくことなってきます。
たとえば、先ほどのデモで、 translate(350px,-350px)とrotate(360deg)の順番を逆にしてみるとどうなるのでしょうか。
実際には以下のようになります。
See the Pen EVXpao by yugusato (@yugusato) on CodePen.
これはこれで面白い動きになりますが、意図した動きになっていませんね。
transformプロパティを利用する場合には、記述の順番に注意して実装してください。
こちらの記事はCSS3 transition And transform From Scratchをもとに作成しました。
Sponsored by
お役に立てましたら、以下どれでも結構のですので、ポチリと……。
Amazonアソシエイト・プログラム規約による記載
当サイトはamazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。
この記事を読んだ人はこんな記事も読んでいます
-
無料で利用できるhtml5プレイヤー(jQueryプレイヤー)14(2013)
html5のお陰で、プラグインなしでビデオ、音楽を導入できるようになりました。 iPhoneは今後
-
コード/js不要!ドラッグ&ドロップだけでCSSイメージスライダーがつくれるアプリ「cssSlider」
イメージスライダーは限られたスペースに多くの視覚的情報を盛り込めるので、ショップなどでは非常によく利
-
名だたるデザイナーが作成したフリーのWEBサイト用PSDファイルが無料!Dribble発Photoshop用サイトテンプレート45
今回もDribbbleから。 Dribbbleは世界の名だたるデザイナーが作品をアップしているコミ
-
Gmailを無料で便利に!「開封確認」「スケジュール送信」ができる機能拡張「myHero Toolbox」
Gmailを利用しています。 本当に便利なGmailですが、できるなら「既読通知/開封確認」「スケ
-
使える!2015年時点で最高の無料レスポンシブ用フリーテンプレート50+
2015年時点で最高の無料レスポンシブ用フリーテンプレートをご紹介します。 今回ご紹介する無料のH
-
もはやアート?ブラウザの閲覧履歴をファビコンで一覧表示する「Iconic History」
ブラウザの閲覧履歴をファビコンで一覧表示するChromeの機能拡張「Iconic History」を
-
超簡単!CSSで上下左右センターにする方法
超簡単ですぐ実践できるCSSで上下左右センターにする方法をご紹介。 display:flexを使っ
-
HTML5ビデオにも対応できる無料動画変換ツール/コンバーター10
HTML5ビデオを利用したサイトも見かけるようになってきました。 今後はHTML5ビデオを利用する
-
プログラミング・コーディングの作業効率UP!ミスを激減させる見やすいフリーフォント18
プログラミングやコーディングするとき、どんなフォントを使っていますか? 私の場合、Coda 2とい
-
文字をカラフルに!CSSとjQueryでテキストを2〜3色で表現してしまう「HalfStyle」
CSS3やWEBフォントの登場でテキスト回りの装飾がお手軽になってきましたが、1文字をだけを2〜3色