Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
脱JavaScript! CSSで作るアニメーション
Search
sizucca
June 24, 2015
Design
0
72
脱JavaScript! CSSで作るアニメーション
社内勉強会LTで「CSS3 のプロパティ transition と animation でのアニメーションの作り方」を話した時のスライド。
sizucca
June 24, 2015
Tweet
Share
More Decks by sizucca
See All by sizucca
BtoB SaaSプロダクトで「機能する」デザインシステムを目指して
sizucca
5
6.5k
「プロダクトとユーザーをつなぐ」BtoB SaaSデザインの面白さ
sizucca
2
2.9k
アンドパッドのデザインシステムの今までとこれから
sizucca
4
3.8k
PowerPointのここがスゴイ!!
sizucca
0
190
スライド資料のデザインシステムをつくっている話
sizucca
0
95
UXデザインを組織に導入する
sizucca
0
110
社内のプロダクト開発でデザインスプリントを実践して分かったこと
sizucca
0
79
効果測定の効率化のために行った3つのこと
sizucca
0
68
Other Decks in Design
See All in Design
OJTで学んだ 「心を動かす」ファシリテーション
saki822
1
190
アプリ360onWeb使い方と裏ワザ?紹介!
ikejun360
1
430
Character Experience AI 〜 AIキャラクターのつくりかた 〜
smartbank
1
520
ドルちゃん
design_dolphins
0
520
DESIGNEAST 2025 A-3
_kotobuki_
0
120
佐藤千晶|ポートフォリオ
chimi_chia
0
430
kintone_aroma
kintone
0
1.1k
【MIXI MEETUP!ー TECH & DESIGN DAYー】【工数98%削減】Xでモンストを話題にせよ!生成AIの活用で日本トレンド6位を獲得した企画の設計&デザイン術
mixi_design
PRO
0
180
What makes a great Director?
_limex_
0
390
保育AIプロダクトの UXデザインで考えてきたこと / hoiku-ai-ux-design
hiro93n
0
240
Ana Cortes Visual Development Portfolio 2025
haruanleb
0
150
Portfolio 齋藤明敏 Hiroyuki Saito_守秘義務あり
crearedesign
0
380
Featured
See All Featured
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
120
Become a Pro
speakerdeck
PRO
31
5.7k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
53
47k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
1.8k
Discover your Explorer Soul
emna__ayadi
2
1k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
230
Digital Ethics as a Driver of Design Innovation
axbom
PRO
0
130
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
10
760
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
400
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.7k
Transcript
脱 JavaScript! CSSで作るアニメーション 2015/06/24 @sizucca
UI Designer @sizucca or @sizucca_̲ ⾃自⼰己紹介
どうやって動かすの?
(1) transition (2) animation どうやって動かすの? ➡ 簡単なアニメーション ➡ 複雑なアニメーション
(1) transition
transition 始点と終点 2点間のデザインを アニメーションで変化させる事ができる 始点 終点
transition <body> <img class="giraffe" src="images/giraffe.png" width="400" height="688" alt=“”> </body> .giraffe
{ position: relative; top: 20px; left: 20px; opacity: 0.3; -webkit-transition: 4s all ease 2s; transition: 4s all ease 2s; } .giraffe:hover { left: 1000px; opacity: 1; }
transition .giraffe { position: relative; top: 20px; left: 20px; opacity:
0.3; -webkit-transition: 4s all ease 2s; transition: 4s all ease 2s; } .giraffe:hover { left: 1000px; opacity: 1; } top: 20px left: 20px opacity: 0.3
transition .giraffe { position: relative; top: 20px; left: 20px; opacity:
0.3; -webkit-transition: 4s all ease 2s; transition: 4s all ease 2s; } .giraffe:hover { left: 1000px; opacity: 1; } top: 20px left: 20px opacity: 0.3 再⽣生時間 プロパティ 補間⽅方法 ディレイ
transition .giraffe { position: relative; top: 20px; left: 20px; opacity:
0.3; -webkit-transition: 4s all ease 2s; transition: 4s all ease 2s; } .giraffe:hover { left: 1000px; opacity: 1; } left: 1000px opacity: 1
transition .giraffe { position: relative; top: 20px; left: 20px; opacity:
0.3; -webkit-transition: 4s all ease 2s; transition: 4s all ease 2s; } .giraffe:hover { left: 1000px; opacity: 1; } left: 1000px opacity: 1 left: 20px 始点 終点
(2) animation
キーフレームを利利⽤用したアニメーションが設定できる キーフレームは アニメーションで変化させたいデザインを、 始点と終点 の間に複数設定する事ができる animation 12.5% 25% 37.5% 50%
87.5% 75% 62.5% 始点:0% 終点:100%
animation <body> <img class="bee" src=“images/bee.png" width="120" height="120" alt=“”> </body> .bee
{ position: relative; margin: 2.5em; font-size: 80px; -webkit-animation: guruguru 1s linear infinite; animation: guruguru 1s liner infinite; } @-webkit-keyframes guruguru { 0% { top: -2em; left: 0; -webkit-transform: rotate(90deg); transform: rotate(90deg); } 12.5% { top: -1.42em; left: 1.42em; -webkit-transform: rotate(135deg); transform: rotate(135deg); } 25% { top: 0; left: 2em; -webkit-transform: rotate(180deg); transform: rotate(180deg); } 37.5% { top: 1.42em; left: 1.42em; -webkit-transform: rotate(225deg); transform: rotate(225deg); } 50% { top: 2em; left: 0; -webkit-transform: rotate(270deg); transform: rotate(270deg); } 62.5% { top: 1.42em; left: -1.42em; -webkit-transform: rotate(315deg); transform: rotate(315deg); } 75% { top: 0; left: -2em; -webkit-transform: rotate(360deg); transform: rotate(360deg); } 87.5% { top: -1.42em; left: -1.42em; -webkit-transform: rotate(405deg); transform: rotate(405deg); } 100% { top: -2em; left: 0; -webkit-transform: rotate(450deg); transform: rotate(450deg); } } ×2倍くらい …
animation .bee { position: relative; margin: 2.5em; font-size: 80px; -webkit-animation:
guruguru 1s linear infinite; animation: guruguru 1s liner infinite; } @-webkit-keyframes guruguru { 0% { top: -2em; left: 0; -webkit-transform: rotate(90deg); transform: rotate(90deg); } 12.5% { top: -1.42em; left: 1.42em; -webkit-transform: rotate(135deg); transform: rotate(135deg); } 25% { top: 0; left: 2em; -webkit-transform: rotate(180deg); transform: rotate(180deg); } 37.5% { top: 1.42em; left: 1.42em; -webkit-transform: rotate(225deg); transform: rotate(225deg); } margin: 2.5em 1em = 80px 2.5em = 200px
animation .bee { position: relative; margin: 2.5em; font-size: 80px; -webkit-animation:
guruguru 1s linear infinite; animation: guruguru 1s liner infinite; } @-webkit-keyframes guruguru { 0% { top: -2em; left: 0; -webkit-transform: rotate(90deg); transform: rotate(90deg); } 12.5% { top: -1.42em; left: 1.42em; -webkit-transform: rotate(135deg); transform: rotate(135deg); } 25% { top: 0; left: 2em; -webkit-transform: rotate(180deg); transform: rotate(180deg); } top: -1.42em; … 100% { top: -2em; left: 0; -webkit-transform: rotate(450deg); transform: rotate(450deg);
animation .bee { position: relative; margin: 2.5em; font-size: 80px; -webkit-animation:
guruguru 1s linear infinite; animation: guruguru 1s liner infinite; } @-webkit-keyframes guruguru { 0% { top: -2em; left: 0; -webkit-transform: rotate(90deg); transform: rotate(90deg); } 12.5% { top: -1.42em; left: 1.42em; -webkit-transform: rotate(135deg); transform: rotate(135deg); } 25% { top: 0; left: 2em; -webkit-transform: rotate(180deg); transform: rotate(180deg); } 37.5% { top: 1.42em; left: 1.42em; -webkit-transform: rotate(225deg); transform: rotate(225deg); }
animation .bee { position: relative; margin: 2.5em; font-size: 80px; -webkit-animation:
guruguru 1s linear infinite; animation: guruguru 1s liner infinite; } @-webkit-keyframes guruguru { 0% { top: -2em; left: 0; -webkit-transform: rotate(90deg); transform: rotate(90deg); } 12.5% { top: -1.42em; left: 1.42em; -webkit-transform: rotate(135deg); transform: rotate(135deg); } 25% { top: 0; left: 2em; -webkit-transform: rotate(180deg); transform: rotate(180deg); } 37.5% { top: 1.42em; left: 1.42em; -webkit-transform: rotate(225deg); transform: rotate(225deg); }
animation .bee { position: relative; margin: 2.5em; font-size: 80px; -webkit-animation:
guruguru 1s linear infinite; animation: guruguru 1s liner infinite; } @-webkit-keyframes guruguru { 0% { top: -2em; left: 0; -webkit-transform: rotate(90deg); transform: rotate(90deg); } 12.5% { top: -1.42em; left: 1.42em; -webkit-transform: rotate(135deg); transform: rotate(135deg); } 25% { top: 0; left: 2em; -webkit-transform: rotate(180deg); transform: rotate(180deg); } 37.5% { top: 1.42em; left: 1.42em; -webkit-transform: rotate(225deg); transform: rotate(225deg); }
animation .bee { position: relative; margin: 2.5em; font-size: 80px; -webkit-animation:
guruguru 1s linear infinite; animation: guruguru 1s liner infinite; } @-webkit-keyframes guruguru { 0% { top: -2em; left: 0; -webkit-transform: rotate(90deg); transform: rotate(90deg); } 12.5% { top: -1.42em; left: 1.42em; -webkit-transform: rotate(135deg); transform: rotate(135deg); } 25% { top: 0; left: 2em; -webkit-transform: rotate(180deg); transform: rotate(180deg); } top: -1.42em; … 100% { top: -2em; left: 0; -webkit-transform: rotate(450deg); transform: rotate(450deg);
animation .bee { position: relative; margin: 2.5em; font-size: 80px; -webkit-animation:
guruguru 1s linear infinite; animation: guruguru 1s liner infinite; } @-webkit-keyframes guruguru { 0% { top: -2em; left: 0; -webkit-transform: rotate(90deg); transform: rotate(90deg); } 12.5% { top: -1.42em; left: 1.42em; -webkit-transform: rotate(135deg); transform: rotate(135deg); } 25% { top: 0; left: 2em; -webkit-transform: rotate(180deg); transform: rotate(180deg); } 37.5% { top: 1.42em; left: 1.42em; -webkit-transform: rotate(225deg); transform: rotate(225deg); } キーフレーム名 再⽣生時間 補間⽅方法 繰り返し
CSSアニメーションの メリット・デメリット
メリット • jQueryアニメーションより処理理が軽い(場合もある) • 柔軟にアニメーションが記述できる • JavaScriptが書けない⼈人でもアニメーションが 実装できる • デザインとUIアニメーションを同じCSSに書
く事ができるので、実装や修正がしやすい CSSアニメーション の メリット・デメリット
デメリット • clickイベントなどをトリガーにする事ができ ない(JavaScriptの助けが必要) • トリガーなどが書かれたJavaScriptと、アニ メーションが書かれたCSSが別管理理になる • コードの量量が多くなりがち •
すごく複雑なアニメーションはまだ難しい CSSアニメーション の メリット・デメリット
本当にJavaScriptより パフォーマンスいいの?
いい! (場合もある) ブラウザのJavaScript エンジンが何なのかとか JavaScriptの書き⽅方とか にもよるし CSS側もどんなプロパティ で動かしてるのかとか 動かす対象にどんだけ プロパティ積まれてる
のかとか アニメーション以外で 動いているJavaScriptが どんだけあるのかとか まぁでも シンプルなアニメーションなら CSSの⽅方が速い!
クロスブラウザ対応とか ⼤大丈夫なの?
⼤大丈夫! そもそもシンプルな アニメーションなら動いても 動かなくても動作に⽀支障ない っていうかそういう箇所に 使えばいいよね/ IE8とか7とか頑張る必要 そろそろ無くない? まぁクリティカルな動作は ともかくアニメーションだよ?
デザイナーは プログレッシブ エンハンスメント! を唱えた! ケースバイケースで 使い所を考えれば ⼤大丈夫!
まとめ
• CSS3で登場したプロパティ(特にtransitionとか animationとか)を使うと、今までJavaScriptでし かできなかったアニメーションがCSSでも可能に! • 簡単なアニメーションなら、CSS3で書いた⽅方がパ フォーマンスがいい! • JavaScriptと上⼿手く共存させると、デザイン修正 がしやすくなる!
• あと、タイトルに「脱JavaScript!」ってつけましたが、脱するつもりはありませんごめんなさい まとめ
エンジニアさんへ • CSSは(デザインとか考えずにプロパティだけ ⾒見見れば)怖くないよ! デザイナーさんへ • 簡単なjQuery(classの付け外しだけとか)な らそんなに怖くないよ! 最後に
ありがとうございました