electron 無(wú)邊框窗口拖拽移動(dòng)問(wèn)題及解決辦法
electron 無(wú)邊框窗口拖拽移動(dòng)問(wèn)題記錄及解決辦法
在做一款uTools的插件,懸浮文本
窗口是沒(méi)有標(biāo)題欄的,所以需要找一個(gè)地方可以拖動(dòng)移動(dòng)位置
就開始了接下來(lái)的踩坑記錄
項(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)事件
沒(méi)有簡(jiǎn)便辦法了,就只好自己寫個(gè)鼠標(biāo)拖拽事件了
按下記錄下鼠標(biāo)相對(duì)于窗口的位置
鼠標(biāo)移動(dòng)后計(jì)算出窗口新的位置
窗口新位置
=窗口當(dāng)前位置
+鼠標(biāo)新的相對(duì)位置
-鼠標(biāo)原來(lái)的相對(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) }
頁(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)過(guò)多次測(cè)試和查閱
最終把問(wèn)題定位在Win的縮放與布局
該選項(xiàng)如果是100%
測(cè)試一點(diǎn)問(wèn)題都沒(méi)有
如果每次拖動(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); }
頁(yè)面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)過(guò)快,仔細(xì)觀察,窗口有時(shí)會(huì)閃爍
而且文本框中的內(nèi)容有時(shí)會(huì)變成選中狀態(tài)
嗯~ o(* ̄▽ ̄*)o
暫時(shí)就醬吧
有大神知道更好解決方案的話可以貼出來(lái)觀摩下
補(bǔ)充:
Electron無(wú)邊框自定義窗口拖動(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 無(wú)邊框窗口拖拽移動(dòng)問(wèn)題記錄及解決辦法的文章就介紹到這了,更多相關(guān)electron 無(wú)邊框窗口拖拽移動(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è)參考。一起跟隨小編過(guò)來(lái)看看吧2019-05-05JS實(shí)現(xiàn)的按鈕點(diǎn)擊顏色切換功能示例
這篇文章主要介紹了JS實(shí)現(xiàn)的按鈕點(diǎn)擊顏色切換功能,涉及js鼠標(biāo)事件響應(yīng)及頁(yè)面元素屬性動(dòng)態(tài)操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-10-10javaScript年份下拉列表框內(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 ,下面通過(guò)本文給大家詳細(xì)介紹了bootstrop中實(shí)現(xiàn)輪播圖效果,需要的朋友參考下2017-06-06JS實(shí)現(xiàn)的一個(gè)簡(jiǎn)單的Autocomplete自動(dòng)完成例子
這篇文章主要介紹了JS實(shí)現(xiàn)的一個(gè)簡(jiǎn)單的Autocomplete自動(dòng)完成例子,需要的朋友可以參考下2014-04-04Javascript獲取隨機(jī)數(shù)的實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇Javascript獲取隨機(jī)數(shù)的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-06-06JavaScript實(shí)現(xiàn)簡(jiǎn)單表單驗(yàn)證案例
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)簡(jiǎn)單表單驗(yàn)證案例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08