Electronで不規則な形状の透明部分をクリックする実装

Electronで不規則な形状の透明部分をクリックする実装

不規則なフォームの実装

ここでは円形フォームを実装します。他の形状のフォームの実装もこのメソッドと同様です。

まず、ウィンドウの高さと幅を同じ値に変更して、ウィンドウを正方形にします。

次に、ウィンドウの transparent プロパティを true に設定します。この設定後、ウィンドウは正方形のままですが、コンテンツ領域の Dom 要素の形状を制御する限り、ウィンドウを不規則な形状に見せることができます。

不規則なウィンドウではカスタムの境界線とタイトル バーが必要になることが多いため、frame も false に設定されます。

さらに、透明なウィンドウはサイズ変更できません。したがって、resizable プロパティを false に設定します。

ウィンドウが表示された後、ウィンドウのドラッグ可能な領域をダブルクリックして最大化イベントがトリガーされるのを防ぐために、maximizable プロパティも false に設定します。

ウィンドウを作成するための最終的なコードは次のとおりです。

win = 新しいブラウザウィンドウ({
        幅: 380,
        高さ: 380,
        透明: true、
        フレーム: false、
        サイズ変更可能: false、
        最大化可能: false、
        //...
})

次に、スタイルを変更して、コンテンツ領域の Dom 要素が円として表示されるようにします。

html、本文{ 
  マージン: 0px; 
  パディング: 0px; 
  ポインタイベント: なし;
}
#アプリ {
 ボックスのサイズ: 境界線ボックス;
 幅: 380ピクセル; 
 高さ: 380ピクセル;
 境界線の半径: 190px;
 境界線: 1px 緑;
 背景: #fff;
 オーバーフロー: 非表示;
 ポインタイベント: 自動;
}

上記のスタイル コードでは、#app 要素は border-radius スタイルによって円に設定されています。 border-radius は、要素の丸い角のスタイルを定義します。丸い角が十分に大きい場合、DIV 全体が円になります。

ポインター イベント スタイルについては後で説明します。

最終的なウィンドウ インターフェイスを図 5-7 に示します。

CSS について少し知識があれば、円に加えて、CSS スタイルを通じてこのウィンドウを他の形状に制御できることが分かるでしょう。

透明な部分をクリックする

上記のアプリケーションには小さな問題があります。ウィンドウは丸く見えますが、実際は四角いウィンドウです。唯一の違いは、四角形の 4 つの角が透明なので、丸いウィンドウのように見えることです。

下の図の領域①のテキスト ファイルをクリックしても、このウィンドウでマウス クリック イベントが発生し、ファイルはクリックされません。

開発者としては、これがなぜ機能するのか理解できますが、ユーザーとしては奇妙に感じます。より優れたユーザー エクスペリエンスを実現するには、これらの 4 つの領域をクリックしたときに、マウスがウィンドウを貫通してウィンドウの背後にあるコンテンツに移動できるようにする必要があります。

公式の Electron ドキュメントには、「透明な領域をクリックすることはできません」と明記されていますが、これは問題ではありません。この問題を解決するちょっとしたコツがあります。

まず、ウィンドウ オブジェクトの setIgnoreMouseEvents メソッドを使用する必要があります。これにより、ウィンドウはウィンドウ内のすべてのマウス イベントを無視できるようになり、このウィンドウで発生するすべてのマウス イベントがこのウィンドウの背後にあるコンテンツに渡されます。

このメソッドを呼び出すときに forward パラメータが渡された場合、次のようになります。

setIgnoreMouseEvents(true, { forward: true }),

すると、クリック イベントのみがウィンドウを通過し、マウス移動イベントは引き続きトリガーされます。

これに基づいて、ページ内で次のコードを実行します。

const remote = require("electron").remote;
  win = remote.getCurrentWindow(); とします。
  window.addEventListener("mousemove", イベント => {
  flag = event.target === document.documentElement とします。
  if (フラグ){
     win.setIgnoreMouseEvents(true, { forward: true });
  } 
  それ以外 {
    win.setIgnoreMouseEvents(false);
  }
  });
  win.setIgnoreMouseEvents(true, { forward: true });

これは実験的なコードなので、リモート モジュールが使用されていることに注意してください。リモート モジュールに関するいくつかの問題については、「Electron チームがリモート モジュールを廃止したい理由」で詳しく説明しています。

上記のコードでは、ウィンドウ オブジェクトが mousemove イベントをリッスンするように設定されています。マウスがウィンドウの円形のコンテンツ領域に移動すると、マウス イベントは侵入できません。マウスが透明領域に移動すると、マウス イベントが通過できるようになります。

次に、html 要素と body 要素にスタイル point-events: none を追加し、#app 要素に point-events: auto を追加します。

point-events: none を設定すると、それがマークする要素はマウス イベントのターゲットにならなくなります。

子要素 #app に point-events: auto が設定されているため、子要素 #app は引き続きマウス イベントのターゲットになることができます。

つまり、円形の領域を除いて、他の部分はマウス イベントを受信しなくなります。

マウスが円形の領域外に移動すると、window オブジェクトの mousemove イベントがトリガーされ、event.target は document.documentElement オブジェクトになります (このイベントは html 要素や body 要素ではなく、window オブジェクトでトリガーされます。Document.documentElement は DOM ツリーのルート要素、つまり html ノードによって表される要素です)。

この時点で、上記コードでの判定が成立し、上記 4 つの領域でマウスが移動すると、マウス イベントによって侵入が許可されます。マウスが円形の領域内を移動すると、マウス イベントは侵入できなくなります。

この時点で、上記の判定が成立します。プログラムを実行し、四角形の四隅でマウスをクリックすると、マウスイベントに貫通効果が発生します。

Electronを使用して不規則なウィンドウの透明領域をクリックスルーする方法についての記事はこれで終わりです。Electronクリックスルーの詳細については、123WORDPRESS.COMの以前の記事を検索するか、次の関連記事を引き続き閲覧してください。今後とも123WORDPRESS.COMをよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Electronでローカルモジュールメソッドを呼び出す方法
  • Electronはコマンドライン(cmd)を呼び出します
  • Electron を使用したスクリーンショット ツールのサンプル コードをゼロから作成
  • Electron + Vueでデスクトップをパッケージ化する操作手順の詳細説明
  • 電子版サイレント印刷のサンプルコード
  • Angular CLI + Electron開発環境構築の詳しい解説
  • Electron Vue の使い方の詳細なチュートリアル
  • フロントエンドElectron初心者向けチュートリアルの詳しい説明

<<:  MySQL ストアド プロシージャで月ごとにテーブルを作成する方法

>>:  Linuxは、単一のIPをバインドするためにデュアルネットワークカードを実装するためにボンドを使用します。サンプルコード

推薦する

エラー 1862 (HY000): パスワードの有効期限が切れています。ログインするには、..... を使用してパスワードを変更する必要があります。

エラーメッセージ:エラー 1862 (HY000): パスワードの有効期限が切れています。ログインす...

CentOS8でのnmcliの使い方の詳しい説明

RHEL8/CentOS8 に基づく一般的な nmcli コマンド # IP を表示する (ifco...

VMwareがモジュールディスクを早期に開けない場合の解決策の詳細な説明

VMWare (Virtual Machine ware) は、「仮想 PC」ソフトウェア会社です。...

40以上の美しいWebフォームデザイン例

Web フォームは、訪問者と Web サイト所有者間の主要なコミュニケーション チャネルです。フィー...

MySQL ビューの原則分析

目次更新可能なビュービューのパフォーマンスビューの制限ビューは MySQL 5.0 以降で導入されま...

JavaScriptとTypeScriptの関係

目次1. JavaScript とは何ですか? 2. JavaScript は何に使用されますか? ...

Node.JS で悪天候のリアルタイム警報システムを構築する

目次序文:ステップ1: 無料の天気予報インターフェースを見つけるステップ2: 天気予報インターフェー...

Ubuntuでネットワークルーティングテーブルを表示する方法

Linux におけるルーティングとルーティング テーブルとは何ですか?ルーティングのプロセスとは、ネ...

JavaScript でじゃんけんゲームを書く

この記事では、JavaScriptでじゃんけんゲームを書くための具体的なコードを参考までに紹介します...

実用的なウェブオンラインツール12選

1.ファビコン.cc ico アイコンの Web サイトをオンラインで作成するには、画像をアップロー...

CSS 動的読み込みバー効果のサンプルコード

CSS変数の知識を使って、追加したコードとコメントを直接投稿します <!DOCTYPE htm...

mysql ワイルドカード (sql 高度なフィルタリング)

目次まず、値の一部と一致させるために使用される特殊文字であるワイルドカードについて簡単に紹介します。...

Linux whatisコマンドの使い方

01. コマンドの概要whatis コマンドは、システム コマンドの簡単な説明を含むいくつかの特別な...

Vueの7つの値転送メソッドの詳細な説明

1. 父から息子へ子コンポーネントにpropsフィールドを定義し、その型は配列です (フィールド値の...

Macシステムをインストールした後にVMWareがフルスクリーンで表示できない問題を解決する

システム: VMTOOLs ダウンロード:リンク: https://pan.baidu.com/s/...