2017-06-01 17 views
12

は、共有要素の遷移だけを以下に示すGIFでアルバムアートのように、ページを移行するときに一緒にリンクするために、両方のページに存在する2つのまったく同じ要素を可能にしますクラス間でReactJSを使って同じ種類の移行を達成することが可能かどうか疑問です。もしそうなら、どんな例?そうでない場合、jQueryはどうですか?共有要素転移使用ReactJSアンドロイドで

+3

html5/css3では1つの要素のトランジション(画像+音楽プレーヤー)を使用して反応を達成できるはずですが、reactjは音楽プレーヤーのサブ要素のコンテンツの変更を管理できます。あなたの質問に直接答えるには、あなたがhttps://facebook.github.io/react/docs/animation.html#high-level-api-をチェックしたかどうか確認してください。 –

+1

reactcsstransitiongroup? –

+1

@ChrisChen既にチェックして、私は自分自身の共有要素移行システムを作るつもりだと思う。その間に誰かがこれを行うライブラリを見つけた場合は、ここにリンクしてください。 – Lucio

答えて

4

ほとんどの場合、この変更はCSS transformプロパティで行うことができます。 React JSはすべてDOMの操作に関するものですが、ここでそれを行う必要はありません。

アニメーション:

  1. は小さなパネルのテキストコンテンツを非表示にします。
  2. 画像とテキストの背景を拡大縮小してフルスクリーンにします。
  3. 新しいテキストコンテンツを挿入します。

これらのうち、1と3はReactで簡単ですので、本当にトランジションアニメーションが必要です。 - これらのプロパティはで扱うことができ

body { 
 
    background-color: #ccc; 
 
} 
 

 
.card { 
 
    width: 150px; 
 
    padding: 0; 
 
    margin: 0; 
 
    background-color: #fff; 
 
    position: absolute; 
 
    top: 0: left: 0; 
 
    z-index: 1; 
 
    
 
    /* Transition properties mean changes to them are animated */ 
 
    transition-property: transform; 
 
    transition-timing-function: ease-in-out; 
 
    transition-duration: 500ms; 
 
    transform-origin: top left; 
 
} 
 

 
.card>img { 
 
    width: 150px; 
 
    height: 150px; 
 
    margin: 0; 
 
    padding: 0; 
 
} 
 

 
.card>.content { 
 
    width: 150px; 
 
    height: 50px; 
 
    background-color: #fff; 
 
    margin: 0; 
 
} 
 

 

 
/* This is only for the purposes of this demo. 
 
* In production you'd have an underlying grid layout and JS to figure out the position */ 
 
.card:nth-of-type(2) { 
 
    left: 175px; 
 
} 
 

 
.card:nth-of-type(3) { 
 
    top: 230px; 
 
} 
 

 
.card:nth-of-type(4) { 
 
    top: 230px; 
 
    left: 175px; 
 
} 
 

 

 
/* On hover transform the card to full size and translate it to the top left 
 
* Note that translate comes before scale. */ 
 
.card:nth-of-type(1):hover { 
 
    transform: scale(2.1667); 
 
    z-index: 2; 
 
} 
 

 
.card:nth-of-type(2):hover { 
 
    transform: translate(-175px, 0) scale(2.1667); 
 
    z-index: 2; 
 
} 
 

 
.card:nth-of-type(3):hover { 
 
    transform: translate(0, -230px) scale(2.1667); 
 
    z-index: 2; 
 
} 
 

 
.card:nth-of-type(4):hover { 
 
    transform: translate(-175px, -230px) scale(2.1667); 
 
    z-index: 2; 
 
}
<div class="card"> 
 
    <img src="http://via.placeholder.com/325/F50057/ffffff"> 
 
    <div class="content"></div> 
 
</div> 
 

 
<div class="card"> 
 
    <img src="http://via.placeholder.com/325/F44336/ffffff"> 
 
    <div class="content"></div> 
 
</div> 
 

 
<div class="card"> 
 
    <img src="http://via.placeholder.com/325/1DE9B6/000000"> 
 
    <div class="content"></div> 
 
</div> 
 

 
<div class="card"> 
 
    <img src="http://via.placeholder.com/325/FFEB3B/000000"> 
 
    <div class="content"></div> 
 
</div>

基本的なトリックがtranslatescaleとCSS transformを使用することです。ここでは

はまったくJSを使用していない非常に非常に基本的な例です。グラフィックスカードとモバイルでも滑らかなアニメーションを維持します。

CSSはちょっと大変ですが、純粋なCSSで行うことができることを示しています。実際には、いくつかのJSがオフセットプロパティを設定し、クリックイベントをフックアップするようにしたいと考えています。

もう1つのトリック(私はここでは行っていません)は、サイズコントロールとtranslate/scaleそれが開始するように見える位置にダウンします。ユーザーがクリックすると、transformが削除されます。これにより、アニメーションを開始する前にブラウザがフルサイズのオブジェクトのDOMを再計算する必要がなくなります。

+0

これはかなりクールです!しかし、私のニーズに合っていません。反応すると、アイテムとリストは重複した2つのコンポーネントなので、あなたの例に示すように簡単にはできません。 – Lucio

+0

@Lucioアニメーションが再生された後、アイテムコンポーネント内でスワップするだけで、余分なステップが必要になります。または、アイテムコンポーネントが展開されたディテールとリストビューの両方を処理して、トランジションを行います。どちらの場合でも、これはWebでそのような移行を行う方法です。 – Keith

3

私はAndroidフレームワークを認識していないため、質問を正しく理解するかどうか分かりません。ここでReactJSの知識に基づいて私の解決策は次のとおりです。

ステップ:CurrentMode & NextMode

  1. 2の状態変数を維持します。可能な値は1 & 2です。
  2. アルバムをクリックするとNextMode2に変更されます。コードでは、CurrentMode & NextModeの値を比較します。 CurrentMode < NextModeよりサイズを適切に設定してください。
  3. 同様に、CurrentMode>NextModeよりサイズを設定してください。
関連する問題