barba.jsとgsapを使ってページ遷移のアニメーションを作成する方法
barba.jsとgsapを使ってページ遷移のアニメーションを作成する方法を紹介します。
barba.jsとgsapを使ってページ遷移のアニメーションを作成する方法
barba.js公式サイト: https://barba.js.org/docs/getstarted/install/
インストール
gsapとbarba.jsをインストールします。
barba.jsはnpmなど経由の場合、以下の通りです。
# npm
npm install @barba/core
# yarn
yarn add @barba/core
cdn経由の場合、以下のどちらかを読み込みます。
<!-- unpkg -->
<script src="https://unpkg.com/@barba/core"></script>
<!-- jsdelivr -->
<script src="https://cdn.jsdelivr.net/npm/@barba/core"></script>
HTML
HTMLを準備じます。
aboutのページ
<div data-barba="wrapper" id="wrap">
<div data-barba="container" data-barba-namespace="about" id="section">
<h1>About</h1>
<div id="btc"><a href="">Home</a></div>
</div>
</div>
Homeのページ
<div data-barba="wrapper" id="wrap">
<div data-barba="container" data-barba-namespace="about" id="section">
<h1>Home</h1>
<div id="btc"><a href="">About</a></div>
</div>
</div>
href属性は適宜設定します。
barba.jsを使うためには、htmlのwrapperの設定をする必要があります。
そして、コンテンツを表示したい部分をcontainerと設定する必要があります。
そのcontainerには、namespaceも設定しておきます。
これで、最低限のhtmlの設定が完了です。
JavaScript
// barba ベース
barba.init({
transitions: [{
name: 'opacityTransition',
sync:true,
leave(data) {
return gsap.to(data.current.container, {autoAlpha: 0, duration: 0.5})
},
enter(data) {
return gsap.from(data.next.container, {autoAlpha: 0, duration: 1, delay: 1})
}
}]
})
barba.init()コマンドで初期化します。
transitionsで、いろいろなトランジションを設定することができます。
leaveやenterの他にもlyfecycleフックがいろいろあるので、詳しくはドキュメントを参照します。
あとは適宜cssを整えればアニメーションがページの遷移時にアニメーションができます。
ブロックをアニメーションさせる
HTML
<div data-barba="wrapper" id="wrap">
<div id="block" class="block0"></div>
<div id="block" class="block1"></div>
<div id="block" class="block2"></div>
<div id="block" class="block3"></div>
<div data-barba="container" data-barba-namespace="about" id="section">
<h1>About</h1>
<div id="btn">
<a href="/index.html"
>Home</a
>
</div>
<div id="imgPlaceHolder">
<img src="https://source.unsplash.com/random" alt="" id="img" />
</div>
<div id="imgPlaceHolder">
<img src="https://source.unsplash.com/random" alt="" id="img" />
</div>
<div id="imgPlaceHolder">
<img src="https://source.unsplash.com/random" alt="" id="img" />
</div>
<div id="imgPlaceHolder">
<img src="https://source.unsplash.com/random" alt="" id="img" />
</div>
</div>
</div>
まずはhtmlを設定します。基本の形に、イメージを挿入しています。
CSS
CSSのフェードイン・アウトのアニメーションで大事なポイントは以下の3つです。
- 子要素にtransform: translateの設定
- 子要素にdisplay: inline-blockの設定
- 親要素にoverflow: hiddenの設定
translateはXでもYでも好きな方向に100%以上を設定することで、inline要素なので隠れます。
#block {
z-index: 99;
position: absolute;
top: 0%;
width: 25%;
height: 100%;
background-color: rgba(0,0,0,0.5);
transform: translateY(100%);
&.block0 {
left: 0%;
}
&.block1 {
left: 25%;
}
&.block2 {
left: 50%;
}
&.block3 {
left: 75%;
}
}
#imgPlaceHolder {
width: 40%;
height: 50%;
position: relative;
overflow: hidden;
z-index: 99;
display: inline-flex;
margin: 2.5%;
& #img {
width: 100%;
height: 100%;
position: relative;
display: inline-block;
}
}
JavaScript
// blockアニメーション
let TL = gsap.timeline({ease: 'sine.in'})
barba.init({
transitions: [{
name: 'blockTransition',
async leave(data) {
await TL
.to('#img', {y: '110%'})
.to('#block',{y: '0%', duration: .5, stagger: .25})
},
async enter(data) {
gsap.set('#img', {y: '110%'})
await TL
.to('#block', {y: '100%', duration: 0.2, stagger: 0.25, delay: 1})
.to('#img', {y: '0%'})
}
}]
})
leaveとenterはasyncを使うことができます。
leaveのときは、画像から消えて、enterのときは後で画像を表示させています。
enterのとき画像はset()メソッドでtranslateを使ってずらし、to()メソッドで元に戻します。