Die Grundlagen von BrowserWindow sind im Einstiegs-Kapitel beschrieben. Hier geht's um die Tiefe: alle relevanten Konstruktor-Optionen, das webPreferences-Objekt mit Sicherheits-Defaults, frameless Windows mit Custom-Titlebar und plattform-spezifische Effekte wie macOS-Vibrancy.
Sicherheits-relevantes webPreferences
const win = new BrowserWindow({
webPreferences: {
preload: path.join(__dirname, 'preload.js'),
contextIsolation: true, // PFLICHT (Default seit v12)
sandbox: true, // empfohlen (Default seit v20)
nodeIntegration: false, // PFLICHT (Default false seit v5)
webSecurity: true, // CORS und Co. — nicht ausschalten
allowRunningInsecureContent: false,
experimentalFeatures: false,
navigateOnDragDrop: false // Drag-Drop löst keine Navigation aus
}
});Die mit „PFLICHT" markierten sind kritisch — wer sie umstellt, öffnet die App für Web-Schwachstellen aus jedem geladenen Inhalt.
| Option | Default | Risiko bei Abweichung |
|---|---|---|
contextIsolation | true | Renderer hat direkten Zugriff auf Preload-Scope |
sandbox | false (true mit --enable-sandbox) | Renderer kann Node-Builtins laden |
nodeIntegration | false | Renderer hat require/process direkt |
webSecurity | true | Same-Origin-Policy aus — XSS-Vektoren überall |
Frame und Title-Bar
// Standard: native Title-Bar
new BrowserWindow({ frame: true });
// Frameless — komplett ohne Title-Bar
new BrowserWindow({ frame: false });
// macOS: native Buttons, Inhalt unter Titlebar
new BrowserWindow({
titleBarStyle: 'hiddenInset',
trafficLightPosition: { x: 12, y: 18 }
});
// Cross-Platform Custom-Titlebar (ab Electron 30)
new BrowserWindow({
titleBarStyle: 'hidden',
titleBarOverlay: {
color: '#1a1a1a',
symbolColor: '#ffffff',
height: 32
}
});titleBarOverlay ist die moderne Cross-Platform-Lösung: native Buttons in der Ecke, restliche Bar gehört dir. Im HTML sorgst du dann für eine 32px-Drag-Region:
.titlebar {
height: 32px;
-webkit-app-region: drag; /* hier kann das Fenster gegriffen werden */
}
.titlebar button {
-webkit-app-region: no-drag; /* Buttons NICHT als Drag-Zone */
}Transparenz und Vibrancy
// Transparent (Cross-Platform)
new BrowserWindow({
transparent: true,
frame: false,
backgroundColor: '#00000000'
});
// macOS Vibrancy (Blur-Effekt)
new BrowserWindow({
vibrancy: 'sidebar', // 'titlebar', 'menu', 'popover' …
visualEffectState: 'active'
});
// Windows: Mica/Acrylic (ab Electron 32)
new BrowserWindow({
backgroundMaterial: 'mica' // 'acrylic', 'tabbed'
});vibrancy macht macOS-typische Hintergrund-Blur-Effekte. backgroundMaterial ist das Windows-11-Pendant. Beide brauchen transparent: true oder ähnliches Setup.
Vollbild und Kiosk
// Initial im Vollbild
new BrowserWindow({ fullscreen: true });
// Vollbild-Toggle erlauben
new BrowserWindow({ fullscreenable: true });
// Kiosk-Modus (kein Verlassen, keine Menüs, ESC blockiert)
new BrowserWindow({ kiosk: true });
// Vollbild zur Laufzeit
win.setFullScreen(true);
win.setKiosk(true);Kiosk-Modus: typisch für Info-Terminals, Digital-Signage. Vollbild + alle Standard-Shortcuts deaktiviert.
Always-on-Top und Floating
new BrowserWindow({
alwaysOnTop: true,
// Optional: Level (macOS)
// 'normal' | 'floating' | 'pop-up-menu' | 'screen-saver'
});
// Zur Laufzeit ändern
win.setAlwaysOnTop(true, 'floating');Use-Case: kleine Tool-Fenster, die immer sichtbar bleiben sollen (Picture-in-Picture, Mini-Player, Sticky-Notes).
Größen-Constraints
new BrowserWindow({
width: 1200, height: 800,
minWidth: 600, minHeight: 400,
maxWidth: 1920, maxHeight: 1080,
resizable: true,
useContentSize: true // width/height bezieht sich auf Inhalt, nicht Frame
});useContentSize ist subtil: ohne ist width: 1200 die Fenster-Außengröße inkl. Frame, mit ist es die Inhalts-Größe. Bei UI-Layout meist letzteres gewünscht.
Icon und Anzeige
new BrowserWindow({
icon: path.join(__dirname, 'assets/icon.png'),
backgroundColor: '#1a1a1a', // Fallback-Farbe vor Renderer-Frame
opacity: 0.95, // halbtransparent
hasShadow: true,
roundedCorners: true // macOS automatisch, Windows 11
});backgroundColor ist wichtig — wenn der Renderer kurz braucht (langsame App, große JS-Bundles), sieht der User nicht „weiß", sondern direkt deinen Theme-Farbton.
Besonderheiten
contextIsolation: false ist die rote Linie.
Es gibt keinen guten Grund mehr, das auszuschalten. Ältere Tutorials zeigen es noch, weil contextBridge eine Lernhürde war. Heute ist contextIsolation: true Pflicht — wer es ändert, sollte einen Audit-Bericht haben.
sandbox: true bricht manche Preload-Patterns.
Im Sandbox-Modus kann der Preload nur einen kleinen Subset von Node-APIs nutzen — electron-Modul und events, sonst kaum was. Wer im Preload Filesystem oder eigene Funktionen braucht: über IPC zum Main delegieren, nicht im Preload erledigen.
titleBarOverlay ist die moderne Cross-Plat-Lösung.
Bis Electron 30 brauchten Cross-Platform-Custom-Titlebars Workarounds (separate Konfig pro Plattform). Heute: ein Setup, funktioniert auf macOS, Windows, Linux. Native Buttons bleiben nativ, Custom-UI rundherum.
transparent: true verhindert manche Effekte.
Bei aktivem transparent ignoriert macOS vibrancy teilweise, Windows zeigt keine Schatten. Für Designs mit Blur eher vibrancy/backgroundMaterial nutzen, nicht reines Transparent.
useContentSize ändert was width bedeutet.
Default ist die Außengröße inkl. Frame. Mit useContentSize: true ist es die Renderer-Inhalts-Größe — was meist intuitiver ist (du designst ja UI in CSS-Pixeln, nicht in „Fenster minus Titelleiste").
Multi-Monitor: screen-Modul nutzen, nicht hardcoden.
Position-Optionen wie x: 100, y: 100 beziehen sich auf den primären Bildschirm. Bei Multi-Monitor: erst screen.getPrimaryDisplay() oder screen.getDisplayNearestPoint() fragen, dann positionieren — sonst landet das Fenster auf macOS auf einem off-screen-Display.
Weiterführende Ressourcen
Externe Quellen
- BrowserWindow — vollständige API-Referenz
- Window Customization
- webPreferences
- Process Sandboxing