Quantcast
Channel: CSSタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 8728

JavaScript + CSS: AnimXYZでCSSアニメーションを簡単に定める

$
0
0

AnimXYZは、CSSアニメーションのライブラリ(ツールキット)です。アニメーションさせたい要素にクラスと属性を与えるだけで、簡単にCSSアニメーションが表現できます。

さまざまなアニメーションは組み合わせることが可能です。また、親要素に統一した設定を定めたうえで、アニメーションさせる子要素にはそれぞれ異なる属性を与えることもできます。

本稿がつくる作例は、つぎのサンプル001です。

サンプル001■JavaScript + AnimXYZ: Example of CSS animation

See the Pen JavaScript + AnimXYZ: Example of CSS animation by Fumio Nonaka (@FumioNonaka) on CodePen.

インストール

AnimXYZのインストールには、コマンドラインツールからnpmやyarnのコマンドが使えます。

npm install @animxyz/core
yarn add @animxyz/core

今回はHTMLドキュメントひとつにすべての記述を加えるので、CDNから読み込むのが簡単でしょう。まだ、バージョンが0.1.1ということですので、実案件に使うのは少し慎重にした方がよさそうです。

head要素
<linkrel="stylesheet"href="https://cdn.jsdelivr.net/npm/@animxyz/core@0.1.1/dist/animxyz.min.css">

簡単な伸縮のアニメーション

まずは、公式サイトに紹介されている基本的なアニメーションです。classとAnimXYZ独自のxyz属性でアニメーションを定めます。

body要素
<divclass="container"><divclass="xyz-in"xyz="fade up big">I will animate in!</div><divclass="xyz-out"xyz="fade up big">I will animate out!</div></div>

親要素(class属性container)からCSSで配置を少し調整しないと、アニメーションが確かめにくいでしょう。

style要素
.container{display:flex;flex-direction:column;justify-content:center;align-items:center;height:400px;}

HTMLドキュメントをロードすれば、アニメーションが表示されます。ただ、要素がテキストなのでパッとしません。

Font AwesomeのSVGアイコンを使う

テキストをSVGのアイコンに替えれば、アニメーションがもっと見映えします。フォントだけでなく、豊富なSVGアイコンを提供するのがFont Awesome Iconsです。CDNから読み込むことにしましょう。

head要素
<linkrel="stylesheet"href="https://use.fontawesome.com/releases/v5.15.1/css/all.css"/>

あとは、アニメーションするテキストをアイコンに差し替えるだけです。

body要素
<divclass="xyz-in"xyz="fade up big"><!-- I will animate in! --><iclass="fas fa-bell fa-9x"></i></div><divclass="xyz-out"xyz="fade up big"><!-- I will animate out! --><iclass="far fa-bell fa-9x"></i></div>

xyz属性は見てわかる定めになっています。今回の設定を改めてまとめたのが表001です。class属性のxyz-inxyz-outで、アニメーションの変化が逆になります。

表001■xyz属性

xyz属性アニメーションxyz-inxyz-out
fade不透明度透明から不透明不透明から透明
up上下移動上から下下から上
big伸縮縮小拡大

JavaScriptコードでアニメーションを切り替える

フェードインとアウトの要素は並べておくより、切り替えた方が見た目がよくなるでしょう。簡単なJavaScriptコードで操作するために、<button>要素を加えたうえで、アニメーションする要素も含めて、つぎのようにid属性を振ります。

body要素
<divid="xyz-in"class="xyz-in"xyz="fade up big"></div><divid="xyz-out"class="xyz-out"xyz="fade up big"></div><div><buttonid="button"type="button">animate</button></div>

アニメーションさせる要素は、はじめはひとつを非表示(display: none;)とします。ついでに、SVGアイコンの色づけもしておきましょう。

style要素
#xyz-in{display:none;color:dodgerblue;}#xyz-out{color:turquoise;}#button{margin-top:50px;}

表示/非表示は、ボタンクリックでJavaScriptコードにより切り替えます。CSSスタイルを変更するのは、styleプロパティです。これで、ボタンをクリックすれば、フェードインとアウトのアニメーションが交互に表示されます。ここまでのコードと実際の動きは、以下のサンプル002でお確かめください。

script要素
constxyzIn=document.getElementById("xyz-in");constxyzOut=document.getElementById("xyz-out");constbutton=document.getElementById("button");letisIn=true;button.addEventListener('click',()=>{if(isIn){xyzIn.style.display='block';xyzOut.style.display='none';}else{xyzIn.style.display='none';xyzOut.style.display='block';}isIn=!isIn;});

サンプル002■JavaScript + AnimXYZ: Basic example of CSS animation 01

See the Pen JavaScript + AnimXYZ: Basic example of CSS animation 01 by Fumio Nonaka (@FumioNonaka) on CodePen.

要素の入れ子でアニメーションを組み合わせる

AnimXYZは要素を入れ子にして設定が加えられます。たとえば、今の作例ではxyz属性の定めは、アニメーションさせるふたつの要素で変わりません。そういうとき、親要素(<div>)を加えて、そこに記述してしまってよいのです。

body要素
<divclass="icon-group"xyz="fade up big"><!-- <div id="xyz-in" class="xyz-in" xyz="fade up big"> --><divid="xyz-in"class="xyz-in"></div><!-- <div id="xyz-out" class="xyz-out" xyz="fade up big"> --><divid="xyz-out"class="xyz-out"></div></div>

親要素のアニメーションの定めを変えれば、子要素に共通して適用されます。flip-upはx軸による3次元の上向き回転で、添えた数値の50は180度です。durationに添えた数値で、アニメーションの時間が変えられます。CodePenに公開したコードは、サンプル003でお確かめいただけます。

body要素
<!-- <div class="icon-group"xyz="fade up big"> --><divclass="icon-group"xyz="fade big flip-up-50 duration-10"></div>

サンプル003■JavaScript + AnimXYZ: Basic example of CSS animation 02

See the Pen JavaScript + AnimXYZ: Basic example of CSS animation 02 by Fumio Nonaka (@FumioNonaka) on CodePen.

なお、冒頭に掲げたサンプル001は、少し見映えをよくするためにコードを書き加え、CSSはBootstrapのクラスで定めました。

配列の分割代入

JavaScriptコードはとくに書き替える必要はありません。ただ、ここで配列の分割代入をご紹介しておきましょう。コードがすっきりします。前掲サンプル002のコードは、この書き替えが加えてあります。

button.addEventListener('click',()=>{/* if (isIn) {
        xyzIn.style.display = 'block';
        xyzOut.style.display = 'none';
    } else {
        xyzIn.style.display = 'none';
        xyzOut.style.display = 'block';
    } */constsettings=isIn?['block','none']:['none','block'];[xyzIn.style.display,xyzOut.style.display]=settings;});

Viewing all articles
Browse latest Browse all 8728

Latest Images

Trending Articles

<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>