Finestre Frameless e Trasparenti
Le finestre frameless (senza bordi) e trasparenti permettono di creare interfacce completamente personalizzate, eliminando la barra del titolo e i bordi standard del sistema operativo.
Finestre Frameless
Una finestra frameless non ha la barra del titolo, i bordi né i pulsanti di controllo (minimizza, massimizza, chiudi):
const win = new BrowserWindow({
width: 800,
height: 600,
frame: false, // Rimuove la barra del titolo e i bordi
webPreferences: {
preload: path.join(__dirname, 'preload.js'),
},
});
Rendere la Finestra Trascinabile
Senza la barra del titolo, l’utente non può spostare la finestra. Usa CSS per creare un’area trascinabile:
/* La barra del titolo personalizzata è trascinabile */
.titlebar {
-webkit-app-region: drag;
height: 36px;
background-color: #1e1e2e;
display: flex;
align-items: center;
padding: 0 12px;
}
/* I bottoni nella titlebar NON devono essere trascinabili */
.titlebar button {
-webkit-app-region: no-drag;
}
/* Il contenuto non è trascinabile */
.content {
-webkit-app-region: no-drag;
}
<div class="titlebar">
<span class="title">La Mia App</span>
<div class="window-controls">
<button id="minimize-btn">─</button>
<button id="maximize-btn">□</button>
<button id="close-btn">✕</button>
</div>
</div>
<div class="content">
<!-- Contenuto dell'app -->
</div>
Controlli Personalizzati della Finestra
// preload.js
contextBridge.exposeInMainWorld('windowControls', {
minimize: () => ipcRenderer.send('window:minimize'),
maximize: () => ipcRenderer.send('window:maximize'),
close: () => ipcRenderer.send('window:close'),
});
// main.js
ipcMain.on('window:minimize', (event) => {
BrowserWindow.fromWebContents(event.sender)?.minimize();
});
ipcMain.on('window:maximize', (event) => {
const win = BrowserWindow.fromWebContents(event.sender);
if (win?.isMaximized()) {
win.unmaximize();
} else {
win?.maximize();
}
});
ipcMain.on('window:close', (event) => {
BrowserWindow.fromWebContents(event.sender)?.close();
});
// renderer.js
document.getElementById('minimize-btn').addEventListener('click', () => {
window.windowControls.minimize();
});
document.getElementById('maximize-btn').addEventListener('click', () => {
window.windowControls.maximize();
});
document.getElementById('close-btn').addEventListener('click', () => {
window.windowControls.close();
});
Finestre Trasparenti
Le finestre trasparenti permettono di vedere attraverso lo sfondo:
const win = new BrowserWindow({
width: 400,
height: 300,
frame: false,
transparent: true, // Abilita la trasparenza
webPreferences: {
preload: path.join(__dirname, 'preload.js'),
},
});
Per avere aree trasparenti nell’HTML, usa colori con canale alpha:
body {
background: transparent; /* Completamente trasparente */
}
.card {
background: rgba(30, 30, 46, 0.85); /* Semi-trasparente */
border-radius: 16px;
backdrop-filter: blur(10px); /* Sfocatura dello sfondo */
padding: 24px;
}
Forma Personalizzata della Finestra
Combinando frameless e trasparente, puoi creare finestre con forme personalizzate:
<body>
<div class="rounded-window">
<div class="titlebar">
<span>Widget</span>
<button id="close-btn">✕</button>
</div>
<div class="content">
<p>Contenuto del widget</p>
</div>
</div>
</body>
body {
margin: 0;
background: transparent;
overflow: hidden;
}
.rounded-window {
background: rgba(30, 30, 46, 0.95);
border-radius: 20px;
overflow: hidden;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4);
height: 100vh;
display: flex;
flex-direction: column;
}
.titlebar {
-webkit-app-region: drag;
padding: 12px 16px;
display: flex;
justify-content: space-between;
align-items: center;
}
.titlebar button {
-webkit-app-region: no-drag;
}
.content {
flex: 1;
padding: 16px;
}
Effetti di Sfondo del Sistema
macOS Vibrancy
const win = new BrowserWindow({
frame: false,
vibrancy: 'under-window', // Effetto sfocatura macOS
visualEffectState: 'active', // Mantieni l'effetto anche in background
backgroundColor: '#00000000', // Trasparente
});
Windows 11 Mica/Acrylic
const win = new BrowserWindow({
frame: false,
backgroundMaterial: 'mica', // Effetto Mica di Windows 11
// oppure 'acrylic' per l'effetto acrilico
backgroundColor: '#00000000',
});
Limitazioni
- Windows: Le finestre trasparenti non sono ridimensionabili con il mouse. Usa
resizable: falseo implementa il ridimensionamento personalizzato - Linux: Il supporto alla trasparenza dipende dal compositor del window manager
- Performance: La trasparenza può impattare le performance, specialmente con effetti come
backdrop-filter - Click-through: Su alcune piattaforme, le aree completamente trasparenti non ricevono eventi del mouse