window系统下--electron自定义无边框窗口菜单 &isMaximized()始终返回false
electron自定义无边框带有阴影的窗口(如上图),在开发过程中遇到了两个难点:
如何给无边框添加阴影
如何来实现自定义的标题栏(最大化,最小化,关闭,拖动,双击)
设置了transparent:true ,isMaximized()始终返回false
下面记录一下解决方案:
let win = new BrowserWindow({
width:440,
height:450,
frame: false,
transparent: true,
webPreferences: {
devTools:false,
nodeIntegration: true,
webviewTag: true
}
}) <div class="content">
<custom-header></custom-header>
<div class="config-page">
<ul class="config-page-tab">
<li @click="toggle(item)" v-for="(item,index) in configPageTab" :class="item.component==currentComponent?'active':''">
{{item.text}}
</li>
</ul>
<div class="config-page-content">
<general-config v-show="currentComponent=='GeneralConfig'"></general-config>
<notice-config v-show="currentComponent=='NoticeConfig'"></notice-config>
<software-update v-show="currentComponent=='SoftwareUpdate'"></software-update>
</div>
</div>
</div> html,body{
padding:0;
background: rgba(0, 0, 0, 0);
}
.content{
position: absolute;
left: 4px;
right: 4px;
top:4px;
bottom: 4px;
background: #fff;
box-shadow: 0px 0px 3px 0px rgba(0, 0, 0, 0.23);
}以上的代码可以创建一个无边框的窗户带有阴影的窗口。下面再说一下如何添加标题栏
<div class="header-content">
<i class="el-icon-refresh" v-if="hasRefresh" @click="refresh" title="刷新"></i>
<i class="iconfont icon-zuixiaohua" title="最小化" @click="winMin"></i>
<i class="iconfont icon-zuidahua" title="还原" v-if="isMax" @click="winMax"></i>
<i class="iconfont icon-common_icon_large" v-if="!isMax" title="最大化" @click="winMax"></i>
<i class="iconfont icon-common_icon_close" title="关闭" @click="winClose"></i>
</div>
.header-content{
background: #fff;
height: 35px;
border-bottom: 1px solid #ccc;
-webkit-app-region: drag;
cursor: pointer;
position: relative;
} winMin(){
let win = remote.getCurrentWindow();
win.minimize();
},
winMax(){
let win = remote.getCurrentWindow();
if(win.isMaximized()){
win.unmaximize();
this.isMax = false;
document.querySelector('.content').style.left='4px'
document.querySelector('.content').style.top='4px'
document.querySelector('.content').style.bottom='4px'
document.querySelector('.content').style.right='4px'
document.querySelector('.content').style.height='calc(100% - 8px)'
}else{
win.maximize()
this.isMax = true;
document.querySelector('.content').style.left='0px'
document.querySelector('.content').style.top='0px'
document.querySelector('.content').style.bottom='0px'
document.querySelector('.content').style.right='0px'
document.querySelector('.content').style.height='100%'
}
},
winClose(){
let win = remote.getCurrentWindow();
win.hide();
}-webkit-app-region: drag 可以设置标题栏拖拽,双击(非常好用)
如上的两种方式可以实现想要的结果。但是在这个过程中有个bug。因为设置了transparent:true,isMaximized()始终返回的是false。所以最大化和最小化的时候就非常不准确,如果把transparent改成false。一切就恢复正常了,但是这时候阴影效果又失效了,苦苦的陷入挣扎当中。
经过查阅文档发现这是electron一直有的一个bug,最终发现有个包完美解决这个问题
npm install --save electron-frameless-window-plugin
// main.js
const { app } = require('electron')
const { plugin } = require('electron-frameless-window-plugin')
app.on('ready', () => {
...
})
plugin({
setGlobal: true
}) // apply to each window