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をバインドするためにデュアルネットワークカードを実装するためにボンドを使用します。サンプルコード

推薦する

反応自動構築ルーティングの実装

目次順序1. 集中ルーティング2. ファイルディレクトリ3. CompileRouterを作成する4...

LinuxのCentos7でmysql5.7.29を構築する詳細なプロセス

1. MySQLをダウンロードする1.1 ダウンロードアドレスhttps://downloads.m...

CSS で実装された円形のプログレスバー

成果を達成する 実装コードhtml <div class="wrap"&g...

Nginx の書き換え正規マッチング書き換え方法の例

Nginx の書き換え機能は、リダイレクトと同様に、URL アドレスを一時的または永続的に新しい場所...

Docker データボリュームコンテナの作成と使用状況分析

データ ボリューム コンテナーは、データ ボリュームをマウントするために特別に使用されるコンテナーで...

VUE無限レベルツリーデータ構造表示の実装

目次コンポーネントの再帰呼び出しレンダリングメソッドの使用プロジェクトに取り組んでいると、左側のメニ...

Node.js の非同期ジェネレータと非同期反復の詳細な説明

序文ジェネレーター関数は、async/await が導入される前から JavaScript に存在し...

MySQL は正常に起動するがポートをリッスンしない場合の解決策

問題の説明MySQL が正常に起動しました。以下に示すように、 ps -ef |grep mysql...

Vue から React への変換入門ガイド

目次デザインコンポーネント通信ライフサイクルイベント処理品格とスタイルクラススタイル条件付きレンダリ...

LinuxデバッガGDBの基本的な使い方の詳細な説明

目次1. 概要2. gdbデバッグ2.1. ブレークポイントを設定する2.1.1. ブレークポイント...

エラー 2002 (HY000): ソケット '/tmp/mysql.sock' 経由でローカル MySQL サーバーに接続できません

エラーメッセージ:エラー 2002 (HY000): ソケット '/tmp/mysql.so...

Linuxで同一ファイルを見つける方法

コンピュータを使用すると、システム内に大量のゴミが生成されます。最も一般的なケースは、同じファイルが...

製品を選択した後、右下隅に√記号を表示するための純粋なCSS

おすすめの記事: CSS 疑似クラスの右下隅をクリックすると、選択を示すチェックマークが表示されます...

Raspberry Pi 4b ubuntu19 サーバーへの docker-ce のインストール手順

Raspberry Pi モデルは 4b、1G RAM です。システムはubuntu19.10サーバ...

JavaScriptの記事では、Webフォームの操作方法を説明します。

1. はじめに先ほど、ウェブページの急速な発展について紹介しました。今回は、より深い内容についてお...