Hatena::Groupnadesiko

雪乃☆雫のなでしこ日和

2017/10/13 (金)

フェードインの実験

| 09:37 | フェードインの実験 - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - フェードインの実験 - 雪乃☆雫のなでしこ日和 フェードインの実験 - 雪乃☆雫のなでしこ日和 のブックマークコメント

 は、重ね合わせの実験の続きです。

 https://nadesiko.g.hatena.ne.jp/snowdrops89/20170927/1506491434

 画面を切り替える際のエフェクトも、CSSを使えば色々出来そうで、手始めにフェードを試してみた。

 actionやhoverで変化させるのは完全にCSSだけで出来るので、なでしこのコトってゆうよりもうむしろ単にCSSを学んでる感じだけど;;;

 でも、DOMスタイル設定でこれらの機能をなでしこのプログラムから操れるっていうのは、ちょっとゲームを作るのに良さそうな♪

 どうなってるのかまるで分からないトリッキーな動きをするボタンとかのサンプルも結構見かけるので、追々学んで試してみたい。


 フェードは、単にopacity(透明度)の値を0に設定し(最小値が0で最大値が1)、transitionでの値を、何秒掛けて変化させるかを指定してやるだけ。

 注意点としては、この変化中も、なでしこのプログラムは待機ないので、必要ある場合は、transitionに指定した秒数以上を秒後命令とかで待機するようにプログラムする必要あります


 あと、もう一つひらめいたのは、重ね合わせの実験をした時には、絶対指定したtopの位置が、ジオシティーズにUPしたら広告があるためにずれてしまうとゆうことを書いたんですが、これは、まず親となるdivを作り、の子要素として位置は指定せずにabsoluteを設定したdivを設置すると子は親と同じ位置に表示されます。してさらにの子として作った要素の位置は、親の0,0が基準となるので便利ですし、アップロード先によって、表示がずれちゃうなんて心配もなくなります☆

<script type="なでしこ">
#-----------------------------------------------------------------------
「#cv_1」の「onclick」に「画像二」をDOMイベント設定。
「#cv_2」の「onclick」に「画像一」をDOMイベント設定。

#画像1を描画。
  「#cv_1」へ描画開始。
  [0,0]に「http://www.geocities.jp/snowdrops890/image/Clione_480.jpg」の画像描画。

#画像2を描画。
0.1秒後には   #少しタイミングを遅らせないと、cv_1への描画が行われず、こっちにクリオネも描画されて、鶴に上書きされてしまう。
  「#cv_2」へ描画開始。
  [0,0]に「http://www.geocities.jp/snowdrops890/image/Tancyo_480.jpg」の画像描画ここまで。
#-----------------------------------------------------------------------
●画像一
  「#cv_2」の「transition」に「opacity 2s」をDOMスタイル設定。   #2秒かけて透明度を変化させる設定。
  「#cv_2」の「opacity」に「0」をDOMスタイル設定。         #透明度を0に。
  2.1秒後には                          #トランジョンの秒数が経って変化が完了してから
    「#cv_1」の「z-index」に「1」をDOMスタイル設定。       #CV_1を表に出す。(CV_2が透明になって見えてるだけだと、マウスクリックのイベントが発生しないため)
    「#cv_2」の「z-index」に「0」をDOMスタイル設定。       #CV_2を下げる。
    「#cv_2」の「opacity」に「1」をDOMスタイル設定。       #CV_2をCV_1の下に隠してから透明度を1(100%)に。
  ここまで。
ここまで

●画像二
  「#cv_1」の「transition」に「opacity 2s」をDOMスタイル設定。
  「#cv_1」の「opacity」に「0」をDOMスタイル設定。
  2.1秒後には
    「#cv_2」の「z-index」に「1」をDOMスタイル設定。
    「#cv_1」の「z-index」に「0」をDOMスタイル設定。
    「#cv_1」の「opacity」に「1」をDOMスタイル設定。
  ここまで。
ここまで
#-----------------------------------------------------------------------
</script>

<H1>なでしこ3てすと~フェードインの実験</H1>
<HR>
<style type="text/css">
#base {
  margin:auto;          /* 子要素でポジションを絶対にしても位置指定の値をつけなければ反映される */
  width:480px;          /* 幅と高さを指定して、絶対位置指定の要素の表示場所を作る */
  height:380px;         /* これが無いと、他の位置指定の無い要素が詰まって表示されちゃう */
}
#main {                 /* 位置指定をせずbaseの子要素とすることで、baseと同じ位置に表示される */
  position:absolute;    /* 絶対位置指定の親要素は、配下の要素が指定する絶対位置の基準となる */
}
#cv_1 {                 /* 絶対位置指定のmainの子要素にすることで、これの位置指定はmainが基準となる */
  position:absolute;
  z-index:1;
}
#cv_2 {                 /* 絶対位置指定のmainの子要素にすることで、これの位置指定はmainが基準となる */
  position:absolute;
  z-index:0;
}
</style>
<div id="base">
  画像をクリックすると切り替わります。
  <div id="main">
    <canvas id="cv_1" width="480px" height="360px"></canvas>
    <canvas id="cv_2" width="480px" height="360px"></canvas>
  </div><!-- main ここまで -->
</div><!-- base ここまで -->
<HR>

 とりあえず、出来ました★

 実験のためにテキトーに思いつきで書いたので、ムダっぽいコードとなっていますが、気にしないで!

 画像をクリックしたら、もう一枚の画像に切り替わります。

http://www.geocities.jp/snowdrops890/wnako3_test/08_fade_test.html


 しかしどうやらファイルからの画像描画はラグが生まれるようで、最初の画像読み込み時、単に、

#画像1を描画。
  「cv_1」へ描画開始。
  [0,0]に「Clione_480.jpg」の画像描画。

#画像2を描画。
  「cv_2」へ描画開始。
  [0,0]に「Tancyo_480.jpg」の画像描画

 としたところ、「cv_1」への描画は行われず、両方とも「cv_2」に描画されるコトになってしまいました(つまり1の画像は2の画像に上書きされてしまう~(´д`;)

 これも秒後のウェイトを入れたら一応解決。

 も、「画像描画」の説明の「 [x, y, w, h]へファイル名F(またはImage)の画像を描画し、Imageを返す」とゆうのがよくわからんのです;(バカ;)

 「ファイル名Fの画像を描画」するのはこのとうり簡単にできたんですが、「(またはImage)」とはなんぞや? しかも、「Imageを返す」って???

 imgの画像のことかとも思ったけど、IDを指定してみてもうまくいかないし、他のcanvasとゆうことでもないみたい?。むむむ~(?_?)


 てゆうかふと気付いたけど、二枚の画像を切り替えるだけなら、何もcanvas画像描画する必要なかった。imgで良かったw

 いや・・まあ・・・ゲームで実際に使う場合には、canvas必要あるかも知れないからね~(?)

通りすがり通りすがり2017/10/15 12:55Imageはイメージ部品的なものを考えると近いかも。

画像のURLを渡して画像描画すると、2つのことをやってくれます。
1.指定されたURLからの画像の読み込みを予約して、その画像の読み込みを予約したImage部品を返す。
2.その画像が読み込み終わったらImage部品を指定された位置に表示する。
※1と2の間にはタイムラグがある。

もし、すでに表示したい画像のImage部品があるなら、使いまわせます。2回読む必要はありません。
1.指定されたImage部品を指定された位置に表示する。

例えば、同じ画像を使うのであれば、以下のようにできます。
----
画像Aは[0,0]に「Clione_480.jpg」の画像描画。
[100,100]に画像Aの画像描画。
----
※が、「秒待つ」は必要かも。

描画せずにImage部品を返す命令があると使いやすいのですが、現状ではないようです。
(初回に「Loading..」などを表示した状態でまとめて読み込みを行うことで、実行中のタイムラグを無くせる)

雪乃☆雫雪乃☆雫2017/10/15 21:22いつもありがとうございます!!!
とってもよく分かりました☆
おかげさまでナゾが一つ解明しました♪

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20171013