canvas で表示しているアニメーションの上に重なったカウンター、URL、画像のある場所では、 canvas にマウスイベントが届かないため、透明な別の canvas を更に上に配置し、そちらでマウスイベントを取得するようにして対処した。

しかし、今度は、アニメーション表示 canvas の上に重ねた URL 部分が反応しなくなった。透明な別 canvas の下にあるのだから当然と言えば当然だ。

で、調べた結果、やはり上に別の要素がある場合、下になった要素にはイベントが届かないことが分かった。また、設定で届くようにするような方法も用意されていないことも分かった。

とても困った仕様だが、そういう仕様なんだからしょうがない。

そこで、「複数枚重なったcanvasで透明領域にマウスイベントを見えている直下の要素に渡したい」を参考に、一番上の透明の canvas に届いたマウスイベント( click, mousemove, mouseover, mouseout )を、下にある要素に送るようにした。

これで URL をクリックした場合にリンク先に飛ぶ動作をするようにはなったが、マウスカーソルを URL 文字列の上にもっていっても色が変わるリンク文字列の動作をしてくれない。ということは、 mouseover, mouseout を送っても、色を変える動作はしないということだ。おそらく、イベントの種別として、 MouseEvent ではなく UIEvent を送る必要があるのだと思う。そして、 URL 文字列の要素に対し、 mouseover のイベントが届くタイミングで UIEvent の DOMFocusIn を送り、 mouseout のイベントが届くタイミングで UIEvent の DOMFocusOut を送ってやることでリンク文字列の色を変える動作をすると思われる。

しかし、問題が2つある。

まず1つ目の問題は、 UIEvent を送るタイミングをどのように決めるかである。上にある canvas 上で mousemove, mouseover, mouseout のイベントが届いたときに elementFromPoint で、マウスカーソル位置にある下の要素を取得しているが、いつその下の要素の上にマウスカーソルが入り、いつ出たのかを決定することができないからだ。この問題は、elementFromPoint で発見した要素を currentItem に追加し同時にその要素に UIEvent の DOMFocusIn を送り、その後の elementFromPoint で、 currentItem が示す要素と異なる要素または null となった場合に、 UIEvent の DOMFocusOut を送ることで、なんとかなるかも知れない。

しかし2つ目の問題として、 UIEvent を発行し DOMFocusIn を下の要素に送った場合、その要素にフォーカスが変わるため、上にあるイベントを受け取っていた要素がイベントを受け取れなくなってしまうであろうことがあげられる。こちらの問題の方が致命的で、本来イベントを受け取るべき要素がイベントを受け取れなくなるということなので、 URL のリンク文字列の色を変えるためにイベントを送るという考え方自体がダメということである。

そこで考え方を変え、 mousemove の elementFromPoint で発見した要素がリンク文字列であれば要素を currentItem にセットしその要素の色をマウスホバー色に変え、その後の elementFromPoint で、 currentItem が示す要素と異なる要素または null となった場合に、その要素の色を戻すことで対応した。

下が完成版。

var currentItem = null;

var currentItemCol = 0;

function passmouseevent(e, type)

{

var mev;

var tmp;

var under;

tmp = event1.style.display;

event1.style.display = "none";

under = document.elementFromPoint(e.clientX, e.clientY);

if (type == "mousemove") {

if (under != null) {

if (currentItem != under) {

if ((currentItem != null) && (currentItem.tagName == "A")) {

currentItem.style.color = currentItemCol;

}

currentItem = under;

currentItemCol = under.style.color;

if (under.tagName == "A") {

under.style.color = "#ff00ff";

}

}

} else {

if ((currentItem != null) && (currentItem.tagName == "A")) {

currentItem.style.color = currentItemCol;

currentItem = null;

}

}

}

if (under != null) {

mev = document.createEvent('MouseEvents');

mev.initMouseEvent(e.type,

e.bubbles,

e.cancelable,

e.view,

e.detail,

e.screenX,

e.screenY,

e.clientX,

e.clientY,

e.ctrlKey,

e.altKey,

e.shiftKey,

e.metaKey,

e.button,

e.relatedTarget);

under.dispatchEvent(mev);

}

event1.style.display = tmp;

}

function testclick(e)

{

passmouseevent(e, 'click');

}

function testmove(e)

{

passmouseevent(e, 'mousemove');

}

今回やりたいことを始めてから完成までの経緯。

(1)トップページにアニメーションを表示したいな。

(2)バナー部分の、カウンターやURLリンクや画像の下に背景的に表示したいな。

(3)アニメーションはマウスカーソルにも反応してほしいな。

(4)あれ?カウンターやURLリンクや画像のところにマウスカーソルが来ると反応しないな。

(5)透明な canvas を一番上に用意して、そこでイベントを取ろう。

(6)あれ?URLリンクに反応しないな。

(7)要素の下の要素にもイベントを送る必要があるな。

(8)あれ?URLリンクの色がマウスカーソルホバー時に変わらないな。

(9)どうやらイベントを送っても変わってくれないらしい。

(10)イベントを送るタイミングを考えて、そのタイミングで代わりに直接色を変えよう。

やりたかったことは、ちょっとアニメーションを表示したかっただけなのだが、実現するために結局 javascript で相当難しい処理を実装する羽目になった。アニメーションの処理自体も javascript でゴリゴリ書かないと出来なかった。

この程度のことでこんな作業が必要なようでは、到底「HTML5 の登場でアニメーションが簡単にできるようになった」という状況ではないのではないか。アニメーションは Adobe Animate を使うとしても、今回のようなちょっとしたレイアウト上の希望で、いちいち javascript で複雑なコードをゴリゴリ書かないといけないというのは、ちょっといただけない。(ちなみに、以前は普通にパッケージとして購入できていた Adobe の製品だが、今では全て月額使用料を支払い続けなければ使用できない・・・。とてもじゃないが、もう Adobe の製品は購入できない。というか、月額で使用料が発生し続けるものって「購入」と呼べるのだろうか?)

この記事のリンク元 | 12 | 11 | 8 | 5 | 2 |

この記事のリンク用URL&トラックバックURL : https://red-souls.jp/ichounoki/rnote/dev/20190828_020141439237.htm

キーワード: HTML5 canvas javascript


つい先日、

そして HTML5 対応が出来たら、トップページにアニメーションを追加したり HTML5 らしいデザインにしたりしてみようと思う。

・・・と書いたが、興味があったので、先にトップページにアニメーションを追加した。

Canvasで桜を降らせてみました」を参考に、銀杏の葉が舞い落ちるようにしてみた。

なかなか興味深い内容で、 javascript を用いて描画処理を行い、 canvas の内容を消去して再描画することを繰り返すことでアニメーション効果を実現する、などの canvas を使ったアニメーションの基本が分かったし、 setTransform() を用いて画像を変形する方法も分かった。

マウスカーソルにも反応させたかったので検索して調べ、 addEventListener() を使い、 mousemove イベントを取得し、マウスカーソルが canvas 上を移動しているときは銀杏の葉がカーソルに近寄ってくるようにもしてみた。

ただ、 canvas の上にカウンターや銀杏の葉の画像が重ね表示されるようにしたのだが、それらの上にカーソルがあるときは、 canvas に mousemove イベントが届かないようだ。ある要素より上に別の子要素がある場合は、そちらにイベントが取得され、親要素には届かない仕組みのようだ。透明な子要素として、一番上にcanvas と位置とサイズが等しい別の canvas を配置し、そちらのイベントを取得するようにして問題を解決したが、親要素にもイベントが届くように設定する方法があるかも知れない。

この記事のリンク元 | 9 | 8 |

この記事のリンク用URL&トラックバックURL : https://red-souls.jp/ichounoki/rnote/dev/20190827_214259748004.htm


rNote-re の今後の予定 2019-08-25 (日) 20:53:55+09:00

開発

当サイト版 rNote である rNote-re だが、今後の予定として、とりあえず HTML5 対応をしてみようと思う。

ヘッダ情報の修正と、 css も含めたレイアウトの HTML5 タグ対応が中心になるだろう。

そして HTML5 対応が出来たら、トップページにアニメーションを追加したり HTML5 らしいデザインにしたりしてみようと思う。

・・・というわけで、まずはヘッダ部分を修正し HTML5 のヘッダを出力するようにしたみた。まだ中身が伴っていないのでなんちゃって HTML5 だが・・・(笑)。

ちなみに、「開発」カテゴリがあるのをすっかり忘れ、「ソフトウェア」や「冬星のソフトウェア」に開発関連の投稿を続けていたのに気づいた。今更ながら、開発関連の話題は「開発」カテゴリに投稿することにした。

この記事のリンク元 | 9 | 8 | 1 | 1 |

この記事のリンク用URL&トラックバックURL : https://red-souls.jp/ichounoki/rnote/dev/20190825_205355848512.htm

キーワード: rNote-re HTML5


なぜ XHTML5 にしたかというと、 rnotepad.php (記事投稿エディタ)で、「投稿」ボタンが押されたときに、日付などの入力欄の入力チェックがしたかったからだ。

とりあえずやってみた感想だが、 input タグの要素に pattern で正規表現を使って入力してよい値を指定するのだが、それだけだと、未入力の場合素通りしてしまう。 required 要素も一緒に指定しておく必要がある。検索して見つけたサイトは、その注意点が漏れていた。

あと、 pattern で指定した形式ではなかった場合、「投稿」ボタンを押すと、「Please match the requested format.」( firefox )や「指定されている形式で入力してください。」( chrome )といったメッセージがツールチップ形式で表示されるのだが、どのような形式にする必要があるかは教えてくれないのだ。

こういう場合、例えば時刻であれば「00〜23を入力してください。」とツールチップに表示したいのだが、それができないので、 HTML5 の入力チェックは、いまいち役に立たないことが分かった。

今の HTML5 の入力チェック方式であれば、例えばフォームの入力欄付近にどのような形式で入力するかを正確に表示しておく必要があるが、これでは非常にうっとうしい状態になってしまう。やはり、ちゃんとやりたければ javascript などでごりごり書かないといけないようだ。もう一度言うが HTML5 の入力チェックは、「いまいち」なのである。

ちなみに、今回の作業で XHTML5 などというものが存在することを初めて知った。

rNote で使用されている xhtml1.1 との相違点が正確に知りたいところなのだが、ぱっと検索してみた限りでは、情報を発見できなかった。見つかったのは、ヘッダ部分の記述の例が少しと、 HTML5 の DOM のシリアライズに2種類あって、1つが HTML5 でもう一つが XHTML5 だという説明だけだった。各ブラウザの対応状況なども見つからなかったが、とりあえず firefox ではなんとなく動作しているようだ。

この記事のリンク元 | 9 | 8 |

この記事のリンク用URL&トラックバックURL : https://red-souls.jp/ichounoki/rnote/works/software/20190825_185438162788.htm


rnotepad.php を修正 2019-08-24 (土) 22:54:45+09:00

冬星のソフトウェア

先日、 XML-RPC API を用いて、サーバから自分のサーバに向けて通信を行い、カテゴリの情報を取得するようにしたが、それをやめた。

rnoteadmin.php では、各プラグインからの出力を表示する直前にブラウザに向けて header() を用いて HTML ヘッダを送信しているのだが、 XML-RPC API を用いた通信を行うと、 header() が実行される前にプラグインが呼び出されたときに通信が実行されるが、そのとき送信されるヘッダとブラウザに向けて header() で送信されるヘッダが同一視されるようで、 rnoteadmin.php で header() を実行したときに「既にヘッダは送信済みです」という warning がどうしても消せないため、うっとうしいので XML-RPC を使ってカテゴリを取得するのをやめた。

XML-RPC API を使用したのは、 rnotepad.php 内でカテゴリの配列を直書きしてしまうと、 rnote.php と二重管理になってしまい汚らしいしカテゴリを修正するたび、両方を修正しないといけなくなるから、という理由からだった。そこで、実際にカテゴリの配列が定義されている rnote_config.php の配列から情報を読み取って rnotepad.php でも使用するようにしたので、この方法でも問題は解決されている。

この修正のついでに、最近の記事の日時がおかしかったのを修正した。

原因は、レンタルサーバのコントロールパネルから「PHP設定の編集」に値を設定したのだが、ここに値を設定すると、 PHP が取得するタイムゾーンが UTC になってしまうようで、そのためだった。同じ場所に date.timezone = 'Asia.Tokyo' も追加して解決した。

この記事のリンク元 | 10 | 9 | 8 |

この記事のリンク用URL&トラックバックURL : https://red-souls.jp/ichounoki/rnote/works/software/20190824_225445880351.htm

キーワード: rNote rnotepad.php