月別アーカイブ: 2024年7月

HTMLにより風鈴進化制御

風鈴(ふうりん)進化過程

6段階の進化を設定し「風鈴を吊り下げる」までを実装しましたが、今回、一気に❷~❻の進化を織り込んでこの稿の終了といたします。

操作ボタンの設置

レコードプレイヤーなどにおいて、再生、停止、早送り、巻き戻し(今後、今流に早戻しを使う)ボタンがあります。風鈴を進化させるにあたり操作ボタンを設けました。操作は次の6段階に分けられます。

❶風鈴を吊り下げる
❷左右にゆらゆら揺れる
❸風鈴を鳴らす
❹短冊をひらひらと回転させる
❺鳴動と2つの揺れを停止
❻風鈴を取り外す

サンプル

夏の風物を象徴する海やひまわりの画像の下にボタンを利用して進化を促すメッセージから風鈴に関わるメッセージに変わります。

処理の概略

風鈴のように回転や揺れを伴う物を表現するにはCSS、ボタンを押す操作に連動する処理にはJavaScriptを利用すると効果的といわれています。

CSSは装飾やスタイルを定義します。動きのあるanimationを定義することもできますが、複雑な動きを制御するにはJavaScriptを使います。

風鈴を進化させるには初期状態を作り上げ、その後は下部に設置された操作ボタンの押下により進みます。風鈴の進化を制御する変数はnであり(0~5)の値を有します。JavaScriptのswitch/case文は制御変数の値によって様々な処理をすることができます。

各コード行には多くのコメント(//から行末まであるいは /*と*/に囲まれた内容)は処理の概要を記述するものです。適切なコメントは設計者の意志が込められています。

処理の肝

animationを起動させるには一般に、animation-play-stateを’paused’から’running’に変更して制御します。animationは左右への揺れとひらひら感を出すためにY軸の周りを回転するための2種類を使っています。

双方とも繰り返し回数(animation-iteration-cout)をinifinite(無限大)に設定して無限に繰り返しています。そして、揺れの開始で起動(animation-play-stateをrunningに)し、停止で(animation-play-stateをpaused)にしてアニメーションを止めていました。

この方法では問題が生じました。揺れを停止するには「鳴動と2つの揺れを停止」ボタンを押します。この方法は停止を逸早く停止させることができますが、風鈴や短冊が傾いたままで停止することがあり、見た目が良くありません。

今回はanimation-play-stateを’running’にかつ、animation-fill-modeを’forwards’に固定しanimation-iteration-countをinifiniteから0に設定してアニメーションの起動・停止を制御しています。

animation-fill-modeをforwardsに設定するとアニメーションが完了したときには、最後の状態に保つことができます。animation-fill-modeは「アニメーションが完了した時」でないと動作しないようです。

停止のタイミングは思ったほど遅くなく揺れや回転は正常完了状態に納まって問題ありません。

Result

下部に設置されたボタンを1回ずつ押下します。青色のボタンに黄色の刻印文字は次に処理される内容です。「短冊をひらひらと回転させる」を押下すると、風鈴が時計の振り子のように左右に揺れながら短冊が中央のY軸をを回転軸にしてひらひらと回転することを確認してください。

©TacM,2024 Ver0.01

自由研究2024

まねて修得

前回は忙しい親の挙動をまねて基礎を築き上げました。親は付きっきりで子供の教育をするわけではありません。すべての動物は学習機能を持っています。親がはしょった部分は補って自分のものにすることでしょう。

今回は風鈴を吊り下げる処理を追加します。用意されたボタンをクリックするなどの外部からの働きかけがあったとき、処理起動が促されます。そのときにすべての処理が開始するわけではありません。事前に処理可能な部分は作成し非表示に設定しておきます。クリックなどのトリガーが指定されたときに、非表示から表示に切り替え希望する動作が実行されます。

サンプル

進化する風鈴の全体像を明らかにして進化の過程をメッセージ表示し未実装機能を(未)で案内しています。

追加した処理

❶進化する風鈴の全貌を示す手順
❷手順を指示するボタンの新設
❸風鈴を吊り下げる処理

Result

実装機能は風鈴を吊り下げるまでです。短冊に願い事をテキストイメージで挿入しました。よっていつでも修正が可能です。

風鈴を進化する
風鈴を進化する

HTMLの修得

学ぶよりまねよ

赤ちゃんは言葉を覚えるのに親の挙動をひたすら真似ます。そして喜怒哀楽を表現します。HTMLの習得にこれを応用します。先人の功績を模倣しましょう。

<p>世界のみなさん、こんにちは</p> をキーボードから入力してsample.htmlに保存しましょう。そして、chrome, edge, FireFoxなどのブラウザでsample.htmlをダブルクリックします。

世界のみなさん、こんにちは

とモニタ画面に表示されます。<p>や</p>は表示されません。pは段落のparagraphを意味し、文字サイズや色などを指定するものです。メッセージが表示されない場合は何らかの正当な理由があり、拡張子がhtmlになっているかを確認します。

期待したように表示されたら一安心です。文字サイズをもっと大きく、後半のこんにちはを青色で表示できないかなどの疑問が湧いてきたらあなたの未来は輝いていると言えるでしょう。

サンプル

HTMLを使ったサンプルは風鈴(ふうりん)を取り上げ、涼やかな音色と左右にゆらゆらと揺れるさまを表現します。

動く表現を順に追加

❶風鈴を吊り下げる
❷風鈴を鳴らす
❸左右にゆらゆら揺れる
❹ひらひらと回転する
❺鳴動と揺れを停止
❻風鈴を取り外す

Result

初回の今回は静止画像で音声もついていません。また、短冊に書く願い事は変更が効くようにテキストで後で入れるので空白のままです。

風鈴で楽しむ

風鈴の名称

風鈴の名称について説明します。上の例では、金魚の絵柄模様の部分は上に吊り紐が付いて外身(そとみ)と呼ばれたいます。鉄製のものが多くガラス製のものもあります。

外身とこすれ合って音を出す中の部分は舌(ぜつ)と呼ばれ、金属製で棒状あるいは古銭のように円、楕円上になっています。さらに舌にぶら下げる紙や布製の短冊から構成されています。

ソースコードについて

HTMLのコードは閲覧者がいつでも確認できます。芝居ならば舞台裏を覗くことができるようなものです。ソースコードは今まで表示や動作とは別に特別枠として掲示していましたが資源の無駄遣いを改め、適切な操作で表示することにしました。

ソースコード確認方法

❶動作している画面で右クリックする
❷検証
❸Sources
と操作すれば、行番号のついたソースコードを見ることができます。

 

創造性を育む

チャレンジ精神をもう一度

世界中の多くの国々では人口減少で悩んでいます。開発途上国を除けば、大抵の国で国力が落ちています。40~50年ほど前に作ったインフラも寿命が尽きて新規更新が迫られていますが財政難で思うように進んでいないのが現状です。

日本が元気だった頃、企業も個人も余裕ができたときには、将来への投資に回すという機運が充満していました。そして、誰もが新しいことにチャレンジする気概にあふれていたものです。いっときの豊かな生活に慣れもう我々はいっぱしの老舗(しにせ)であると思うようになり、なにもリスクを負って沈みゆくことはあるまいと殻に閉じ籠るようになりました。やむを得ないことでした。

元気を取り戻したい

創造性を育んで欲しいとの願いから、万華鏡を改造して《チャレンジ精神》を喚起する四つの標語を回転させながら表示してみました。バックグラウンドミュージック:「バダジェフスカ」作曲の『乙女の祈り』を聴きながら士気を高めましょう。

夏休みの自由研究に

もうすぐ夏休みです。夏休みの自由研究にHTMLをマスターしてみませんか。HTMLはホームページやブログなどネット上で表現するために用いる言語です。動画、音楽などを駆使して世界中の人々に情報を伝えるツールです。多くを望まなければ、とても簡単にマスターできます。

子供時代には純粋だった若者は労せず実を得ることを欲するようになります。このような大人には実に難解な言語ということになります。まずはモニタ画面に『Hello World!』を表示してみましょう。テキストエディタを使って12文字を打ち込んでファイルにセーブするだけです。これだけです!これがHTMLマスターの第一歩です。

創造性を育む言葉

動作の核たるソースコード

末尾に万華鏡を背景に彩ってメッセージを動的に回転させて表示するHTML(CSS, JavaScript)のコードを掲示しました。万華鏡描画関数は『p5.js』が提供するサイトを参照させていただきました。54と55行の部分です。ご自分の環境で画面が欠けたりした折にはソースコードを入手して改修してください。Windows11でブラウザChromeにて動作を確認していますがすべての環境で動作を保証するものではありません。ソースコードは夏休みの宿題のたたき台にしてもらって結構です。奮起を期待します。

※※※※※

<html>
<head>
  <meta charset="UTF-8">
  <title>創造性を育む</title>
<style>
canvas {												//sketch2.jsで参照するので削除できない。
  z-index:3000;
  opacity:0.6;
  position:absolute; top:1.8px; right:0px; bottom:0px; left:0px; margin:0 auto;	//topなどが0より大きいのは中央寄せの誤差調整
  overflow: hidden;										// はみだし部分を非表示に
}
.swing0 {
    animation: swingEfect0 linear infinite 20s;			/* infinite 20s */
    transform-origin: 300px 300px;						/* 304px 304px / 302 320 338 356 */
    border:0px solid green; border-radius:50%; z-index:4500;
}
@keyframes swingEfect0 {
    0%{transform: rotate(0deg);}	25%{transform: rotate(90deg);}	50%{transform: rotate(180deg);}	75%{transform: rotate(270deg);}	100%{transform: rotate(360deg);}
}
.s9 {
    animation: swingEfect0 linear infinite 20s reverse;	/* infinite 20s */
    transform-origin: 60px 60px;						/* width/2 height/2 */
	background: transparent;							/* greenyellow */
    -webkit-text-stroke:3px blue;						/* navy */
    -webkit-text-fill-color: aliceblue;					/* transparent */
	font-size:96px; line-height:1.25em; border:0px solid pink; border-radius:50%; text-align:center;
}
</style>
</head>
<body onLoad="polygon();" style="transform:scale(1.0, 1.0) translate(0px, 0px); overflow:hidden;">
<Div                      style="width:600px; height:640px; margin:0 auto; border:0px solid cyan; font-size:14px; font-weigt:500; z-index:5000;">
 <Div class="swing0"      style="position:absolute; top:0px; width:600px; height:600px; background:transparent; overflow:hidden;">
  <div id="xaxis"         style="position:absolute; left:1.5px;   top:300px;   width:600px;  height:0.025px; opacity:0.2; border:0.025px solid lightgray;"></div>
  <div id="yaxis"         style="position:absolute; left:300px;   top:1.5px;   width:0.025px; height:600px;  opacity:0.2; border:0.025px solid lightgray;"></div>
  <div id="y0" class="s9" style="position:absolute; left:244.0px; top: 24.0px; width:120px;  height:120px; border:0px solid cyan;">楽</div>
  <div id="y1" class="s9" style="position:absolute; left:373.3px; top: 66.0px; width:120px;  height:120px; border:0px solid cyan;">し</div>
  <div id="y2" class="s9" style="position:absolute; left:453.2px; top:176.0px; width:120px;  height:120px; border:0px solid cyan;">み</div>
  <div id="y3" class="s9" style="position:absolute; left:453.2px; top:312.0px; width:120px;  height:120px; border:0px solid cyan;">な</div>
  <div id="y4" class="s9" style="position:absolute; left:373.3px; top:422.0px; width:120px;  height:120px; border:0px solid cyan;">が</div>
  <div id="y5" class="s9" style="position:absolute; left:244.0px; top:464.0px; width:120px;  height:120px; border:0px solid cyan;">ら</div>
  <div id="y6" class="s9" style="position:absolute; left:114.7px; top:422.0px; width:120px;  height:120px; border:0px solid cyan;">自</div>
  <div id="y7" class="s9" style="position:absolute; left: 34.8px; top:312.0px; width:120px;  height:120px; border:0px solid cyan;">由</div>
  <div id="y8" class="s9" style="position:absolute; left: 34.8px; top:176.0px; width:120px;  height:120px; border:0px solid cyan;">研</div>
  <div id="y9" class="s9" style="position:absolute; left:114.7px; top: 66.0px; width:120px;  height:120px; border:0px solid cyan;">究</div>
 </Div>						<!-- 304-300/2+8   304-100/2+8, 304-100/2+8   304-300/2+8 -->
 <img width="600" height="600" style="position:absolute; left;0px; top:1.8px; z-index:3000; opacity:1;" src="https://aidesign.lolipop.jp/wp-content/uploads/2018/07/poly-99.png" />
 <span  id="v0" style="position:absolute; top:544px; z-index:3000; color:darkcyan; font-weigt:bold;">マウス・キー操作</span>
 <span  id="v1" style="position:absolute; top:563px; z-index:3000;">H:回転制御 △:ぼやけ</span>
 <span  id="v2" style="position:absolute; top:582px; z-index:3000;">マウスクリック:背景色反転</span>
 <span  id="v3" style="position:absolute; padding-left:430px; top:589px; z-index:3000; font-size:12px;">&copy;2024 TacM, Ver0.02</span>
 <audio id="v4" style="position:absolute; top:605px; width:300px; height:28px; z-index:5000;" src="https://aidesign.lolipop.jp/wp-content/uploads/2018/07/BADARZEWSKA-TheMaidens-Prayer.mp3" loop controls controlslist="nodownload"></audio>
 <span  id="v5" style='position:absolute; padding-left:300px; top:610px; width:310px; height:50px; color:darkgreen; font-size:18px; z-index:3000;'>&emsp;バダジェフスカ作曲&ensp;乙女の祈り</span>
</Div>
<script src="https://infosmith.biz/scripts/035-kaleidoscope/libraries/p5.min.js"></script>
<script src="https://infosmith.biz/scripts/035-kaleidoscope/sketch.js"></script>
<script type="text/javascript">
const t12="作って描いて楽しむ★鑑賞模倣から独創へ☆楽しみながら修める◇自らプログラミング✤";	//メッセージ 10語
const SIZE=220;							//メッセージ中心の回転半径
const BIAS=244;							//大回転の中心地
const N=10;								//N:頂点数 0 ~ 9
const TextStroke = ["darkmagenta", "darkgreen", "darkred", "dodgerblue"];						//const TextFillColor=["lime", "darkpink", "palevioletred", "cyan"];
var k=0;								//カウンター、グローバル変数であること
function polygon(){						//lineタグで12本の直線を引き、多角形を作る
  var c=Math.floor(k / N) % 4;			//0 0 0 0 0 0 0 0 0    1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0    1 1 1 1 1 1 1 1 1
  var j=k++ % N;						//0 ~ 9
  var t=(j-2.5)*Math.PI/5;				//-3 -2 -1 0 1 2 3 4 5 6
  var p=Math.cos(t)*SIZE+BIAS;			//始点-x -60
  var q=Math.sin(t)*SIZE+BIAS;			//始点-y -60
  var b="y"+j;							//y0 ~ y9
  var o=document.getElementById(b);		//obj  //console.log(c, j, p, q, b, o);
  o.style.left=p+"px";					//x
  o.style.top=q+"px";					//y
  o.innerHTML=t12[j+N*c];				//set messages
  console.log(k, j, b, o.innerHTML);
  o.style.WebkitTextStroke = "3px " + TextStroke[c];	//0 1 2 3
  setTimeout("polygon()", 1000);		//2000 1000 500 250
}
</script>
</body>
</html>