NW.jsは、Web技術とNode.jsを統合してデスクトップアプリケーションを開発できるフレームワークです。特に、ウィンドウの視覚的カスタマイズ性が高く、透過(トランスペアレント)ウィンドウの実装がネイティブレベルでサポートされています。本記事では、framelessウィンドウを基盤として、OSごとの最適化を含む透過表示の実装手法を、コード中心で解説します。
前提条件と制約
透過ウィンドウは、OSの描画パイプラインに強く依存します。以下の点を事前に確認してください:
- Windows:Windows Vista以降、かつDWM(Desktop Window Manager)が有効な環境のみ対応。リモートデスクトップやクラシックテーマでは非対応。
- macOS:MetalまたはOpenGLバックエンドで動作。システム設定の「アクセシビリティ」>「ディスプレイ」で「透明度を減らす」がオフであることを推奨。
- Linux:合成ウィンドウマネージャー(例:GNOME、KDE Plasma)が必要。X11セッションでは`--enable-transparent-visuals --disable-gpu`フラグ必須。
基本設定:manifest.jsonの書き換え
プロジェクトルートのpackage.jsonに、以下のウィンドウプロパティを追加します:
{
"name": "transparent-app",
"main": "index.html",
"window": {
"frame": false,
"transparent": true,
"resizable": false,
"width": 480,
"height": 320
}
}
"frame": falseは透過表示の必須条件であり、タイトルバー・リサイズハンドルなどのOS標準UIを非表示にします。
HTML/CSS側の対応
透過ウィンドウでは、DOM要素の背景色が直接ウィンドウのアルファチャンネルに反映されます。以下のように<body>の背景を完全透明に設定します:
<body style="margin: 0; background: rgba(0, 0, 0, 0);">
<div id="ui-root"></div>
</body>
任意の不透明度を指定したい場合は、rgba(r, g, b, a)のa値(0.0~1.0)を調整してください。たとえばrgba(255, 255, 255, 0.8)は半透明の白背景になります。
Linux向け起動オプションの追加
Linux環境では、NW.jsのバイナリを起動する際にコマンドライン引数を付与する必要があります:
./nw --enable-transparent-visuals --disable-gpu ./app/
この設定がないと、ウィンドウが黒塗りまたは不正な描画になることがあります。
クリックスルー(穿透)機能の有効化
透過領域を「クリック透過」にしたい場合(例:背景の他のアプリを直接操作可能)、以下の手順で設定します:
- 起動時に
--disable-gpu-compositing --force-cpu-drawを追加 - JavaScriptでウィンドウのヒットテストを無効化(透過部分でのイベント捕捉を抑制):
const win = nw.Window.get();
win.setAlwaysOnTop(true); // 必須ではないが、UIの意図通りの挙動を保証
// CSSでpointer-events: noneを適用する代替手段も可能
document.body.style.pointerEvents = 'none';
document.getElementById('ui-root').style.pointerEvents = 'auto'; // 交互要素のみ再有効化
シャドウと境界線の制御
framelessウィンドウでは、OS標準のドロップシャドウが自動的に無効化されます。代わりにNW.jsのAPIで制御できます:
win.setShadow(true); // シャドウを有効化(Windows/macOSのみ有効)
win.setShadow(false); // シャドウを無効化
また、CSSで疑似ボーダーを描画することで、視認性を高めることも可能です:
#ui-root {
border: 1px solid rgba(255, 255, 255, 0.15);
backdrop-filter: blur(4px); /* macOS/Windows 11でガラスモーフィック効果 */
}
パフォーマンスに関する留意点
- GPUアクセラレーションを無効化すると、アニメーションの滑らかさが低下する可能性があります。必要最小限の領域に
will-changeやtransform: translateZ(0)を適用しましょう。 - 透過ウィンドウ内での
filter: blur()やbox-shadowの多用は、CPU負荷を増加させます。代替としてbackdrop-filterを優先利用してください。 - Linuxでは
--force-cpu-draw使用時に、大量のDOM更新で描画遅延が発生するため、Virtual DOMやレンダリング節約処理を導入することを推奨します。