Ember とLiquid Fireを使用して、マテリアル デザインにインスパイアされた、ルート間の興味深いアニメーション トランジションを作成しています。
2 つのトランジションを作成しました。index1 つ目は、ルートからルートへの遷移中に発生し、 、、および遷移を正常にabout使用します。ここでは、両方のルートの属性を一致させて、スムーズでシームレスなトランジションを作成し、一致した要素が画面を横切って次のページに移動するように見せます。いいぞ!explodeflyTotoLeftdata-nav
about2 つ目は、ルートからルートに戻る移行中に発生しindexます。ここでは、両方のルートの属性によって上記とは異なる要素を照合しdata-textますが、上記の例とは異なり、要素は同一ではありません。具体的には、フォントサイズが異なります。残念ながら、これには大きなフォント サイズのテキストがすぐに表示されてから、ページ全体に飛び散ってしまうという望ましくない効果があります。
私がやりたいのは、フォントサイズをアニメーション化するトランジションを追加することです。シンプルに聞こえます。
transitions.js以下は、上記の 2 つのトランジションを含む最初のファイルです。
export default function() {
var duration = 1000;
this.transition(
// --------------------- INDEX to ABOUT ----------------------------------- //
this.fromRoute('index'),
this.toRoute('about'),
this.use('explode', {
matchBy: 'data-nav',
use: [ 'flyTo', { duration } ]
}, {
use: [ 'toLeft', { duration } ]
}),
// --------------------- ABOUT to INDEX ----------------------------------- //
this.reverse('explode', {
matchBy: 'data-text',
use: [ 'flyTo', { duration } ]
}, {
use: [ 'toRight', { duration } ]
})
);
}
答えは、独自のカスタム トランジションを作成することだと思いますが、かなり難しいことがわかりました。という名前のカスタム トランジションを作成し、このトランジション用のファイルにscale-font.js追加しました。transitions.js
import { animate, Promise } from "liquid-fire";
export default function scaleFont(opts={}) {
// returns a Promise that resolves when the transition is done
if (!this.newElement) {
return Promise.resolve();
} else if (!this.oldElement) {
this.newElement.css({visibility: ''});
return Promise.resolve();
}
var oldFontSize = this.oldElement.css('font-size');
var newFontSize = (opts.selector ? this.newElement.find(opts.selector) : this.newElement).css('font-size');
this.newElement.css({ visibility: 'hidden' });
return animate(
this.oldElement,
{ fontSize: oldFontSize },
{ duration: 1000 }
).then(() => {
return animate(
this.newElement,
{ fontSize: newFontSize },
{ duration: 1000, visibility: 'visible' }
);
});
}
残念ながら、これはうまくいきません。最初の問題は、oldFontSizeが正しくないことです。新しいフォントサイズを取得することになります。2 番目の問題は、フォントのスケーリングが発生しないことです。
私はアニメーションフォントを研究したので、それができると確信しています。提案?