electron 無邊框窗口拖拽移動(dòng)問題及解決辦法
electron 無邊框窗口拖拽移動(dòng)問題記錄及解決辦法
在做一款uTools的插件,懸浮文本

窗口是沒有標(biāo)題欄的,所以需要找一個(gè)地方可以拖動(dòng)移動(dòng)位置
就開始了接下來的踩坑記錄
項(xiàng)目結(jié)構(gòu)
只是一個(gè)簡(jiǎn)單的容器元素,一個(gè)多行文本框
容器元素加一個(gè)內(nèi)邊距,然后這個(gè)內(nèi)邊距區(qū)域就是我理想的可拖動(dòng)位置
<body>
<div id="container">
<textarea id="content" spellcheck="false"></textarea>
</div>
</body>實(shí)現(xiàn)流程
webkit-app-region
首個(gè)版本,我采用CSS很簡(jiǎn)單便實(shí)現(xiàn)了
當(dāng)時(shí)是用 Mac 開發(fā)測(cè)試的,一切運(yùn)行良好
#container {
-webkit-app-region: drag;
padding: 10px;
cursor: move;
}隔天到 Win 上看效果
發(fā)現(xiàn)拖動(dòng)雖然正常,但是光標(biāo)樣式?jīng)]有了

鼠標(biāo)放在邊框位置不會(huì)變成移動(dòng)的光標(biāo)
經(jīng)查閱,設(shè)置了-webkit-app-region: drag;的元素,不會(huì)在響應(yīng)鼠標(biāo)事件了(mac上測(cè)試的時(shí)候正常的)
so,需要繼續(xù)改了
鼠標(biāo)事件
沒有簡(jiǎn)便辦法了,就只好自己寫個(gè)鼠標(biāo)拖拽事件了
按下記錄下鼠標(biāo)相對(duì)于窗口的位置
鼠標(biāo)移動(dòng)后計(jì)算出窗口新的位置
窗口新位置=窗口當(dāng)前位置+鼠標(biāo)新的相對(duì)位置-鼠標(biāo)原來的相對(duì)位置
主進(jìn)程 (因?yàn)槭?code>uTools插件開發(fā),和electron原始代碼的監(jiān)聽不一樣)
ipcRenderer.on('move', (event, x, y) => {
ubWindow.setPosition(x, y)
})
// 初始化
ipcRenderer.sendTo(ubWindow.webContents.id, 'init')webPreferences的preload
const { ipcRenderer } = require('electron')
let winId
ipcRenderer.on('init', (event) => {
winId = event.senderId
window.init()
})
window.move = (x, y) => {
ipcRenderer.sendTo(winId,'move',x, y)
}頁面js
let moveIng = false
let startX = 0
let startY = 0
const move = (event) => {
if (!moveIng) return
const x = window.screenX + event.clientX - startX
const y = window.screenY + event.clientY - startY
window.move(x, y)
}
//綁定拖拽移動(dòng)事件
document.addEventListener('mousedown', (event) => {
if (event.button === 0 && event.target.tagName !== 'TEXTAREA') {
moveIng = true
startX = event.clientX
startY = event.clientY
document.addEventListener('mousemove', move)
}
})
document.addEventListener('mouseup', (event) => {
if (!moveIng) return
document.removeEventListener('mousemove', move)
moveIng = false
})測(cè)試,Win和Mac拖拽正常,光標(biāo)正常

But,換電腦在測(cè)試時(shí),發(fā)現(xiàn)某個(gè)Win的電腦移動(dòng)窗口時(shí),窗口尺寸會(huì)不停的變大
甚至只要鼠標(biāo)按在窗口上,尺寸都可能會(huì)改變
so,繼續(xù)改吧
縮放
經(jīng)過多次測(cè)試和查閱
最終把問題定位在Win的縮放與布局

該選項(xiàng)如果是100%測(cè)試一點(diǎn)問題都沒有
如果每次拖動(dòng)尺寸會(huì)發(fā)生改變,那我們就不再使用setPosition改用setBounds
每次調(diào)整位置時(shí)直接將尺寸也傳遞進(jìn)去,修改下代碼
主進(jìn)程
ipcRenderer.on('moveBounds', (event, x, y, width, height) => {
if (event.senderId == ubWindow.webContents.id) {
let newBounds = {
x: parseInt(x),
y: parseInt(y),
width: parseInt(width),
height: parseInt(height),
}
ubWindow.setBounds(newBounds)
}
})
// 初始化
ipcRenderer.sendTo(ubWindow.webContents.id, 'init')webPreferences的preload
const { ipcRenderer } = require('electron')
let winId
ipcRenderer.on('init', (event) => {
winId = event.senderId
window.init()
})
window.moveBounds = (x, y, width, height) => {
ipcRenderer.sendTo(winId, 'moveBounds', x, y, width, height);
}頁面js
let moveIng = false
let startX = 0
let startY = 0
let lastWidth = 0
let lastHeight = 0
const move = (event) => {
if (!moveIng) return
const x = window.screenX + event.clientX - startX
const y = window.screenY + event.clientY - startY
window.moveBounds(parseInt(x), parseInt(y), lastWidth, lastHeight)
}
//綁定拖拽移動(dòng)事件
document.addEventListener('mousedown', (event) => {
if (event.button === 0 && event.target.tagName !== 'TEXTAREA') {
moveIng = true
startX = parseInt(event.clientX)
startY = parseInt(event.clientY)
lastWidth = parseInt(window.outerWidth)
lastHeight = parseInt(window.outerHeight)
document.addEventListener('mousemove', move)
}
})
document.addEventListener('mouseup', (event) => {
if (!moveIng) return
document.removeEventListener('mousemove', move)
moveIng = false
})
調(diào)整后Win和Mac測(cè)試均正常
但如果拖動(dòng)過快,仔細(xì)觀察,窗口有時(shí)會(huì)閃爍
而且文本框中的內(nèi)容有時(shí)會(huì)變成選中狀態(tài)
嗯~ o(* ̄▽ ̄*)o 暫時(shí)就醬吧
有大神知道更好解決方案的話可以貼出來觀摩下
補(bǔ)充:
Electron無邊框自定義窗口拖動(dòng)
解決方案
<header class="absolute" style="left:0px;top:0px;width:100%;height:48px;background-color:red;padding:0px;margin:0px;">
<div class="absolute" style="left:0px;top:0px;width:100%;height:100%;-webkit-app-region:drag">
<button style="width:200px;height:100px;-webkit-app-region:no-drag;" @click="console.log('abc')">點(diǎn)我</button>
</div>
</header>首先外部可拖拽區(qū)域設(shè)置:-webkit-app-region:drag;
如果想要里面的按鈕可點(diǎn)擊,僅需要設(shè)置按鈕不可拖拽就行:-webkit-app-region:drag;
到此這篇關(guān)于electron 無邊框窗口拖拽移動(dòng)問題記錄及解決辦法的文章就介紹到這了,更多相關(guān)electron 無邊框窗口拖拽移動(dòng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
webpack4手動(dòng)搭建Vue開發(fā)環(huán)境實(shí)現(xiàn)todoList項(xiàng)目的方法
這篇文章主要介紹了webpack4手動(dòng)搭建Vue開發(fā)環(huán)境實(shí)現(xiàn)todoList項(xiàng)目的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-05-05
JS實(shí)現(xiàn)的按鈕點(diǎn)擊顏色切換功能示例
這篇文章主要介紹了JS實(shí)現(xiàn)的按鈕點(diǎn)擊顏色切換功能,涉及js鼠標(biāo)事件響應(yīng)及頁面元素屬性動(dòng)態(tài)操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-10-10
javaScript年份下拉列表框內(nèi)容為當(dāng)前年份及前后50年
本文介紹的這個(gè)javaScript年份下拉列表框內(nèi)容為當(dāng)前年份及前后50年,默認(rèn)顯示當(dāng)前年份,大家可以學(xué)習(xí)下2014-05-05
在bootstrap中實(shí)現(xiàn)輪播圖實(shí)例代碼
Bootstrap中輪播圖插件叫作Carousel ,下面通過本文給大家詳細(xì)介紹了bootstrop中實(shí)現(xiàn)輪播圖效果,需要的朋友參考下2017-06-06
JS實(shí)現(xiàn)的一個(gè)簡(jiǎn)單的Autocomplete自動(dòng)完成例子
這篇文章主要介紹了JS實(shí)現(xiàn)的一個(gè)簡(jiǎn)單的Autocomplete自動(dòng)完成例子,需要的朋友可以參考下2014-04-04
Javascript獲取隨機(jī)數(shù)的實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄狫avascript獲取隨機(jī)數(shù)的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-06-06
JavaScript實(shí)現(xiàn)簡(jiǎn)單表單驗(yàn)證案例
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)簡(jiǎn)單表單驗(yàn)證案例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08

