最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

electron 無邊框窗口拖拽移動問題及解決辦法

 更新時間:2023年12月22日 15:22:18   作者:IT老大哥  
在做一款uTools的插件,懸浮文本,窗口是沒有標(biāo)題欄的,所以需要找一個地方可以拖動移動位置,本文給大家介紹electron 無邊框窗口拖拽移動問題及解決辦法,感興趣的朋友一起看看吧

electron 無邊框窗口拖拽移動問題記錄及解決辦法

在做一款uTools的插件,懸浮文本

image

窗口是沒有標(biāo)題欄的,所以需要找一個地方可以拖動移動位置

就開始了接下來的踩坑記錄

項(xiàng)目結(jié)構(gòu)

只是一個簡單的容器元素,一個多行文本框

容器元素加一個內(nèi)邊距,然后這個內(nèi)邊距區(qū)域就是我理想的可拖動位置

<body>
  <div id="container">
    <textarea id="content" spellcheck="false"></textarea>
  </div>
</body>

實(shí)現(xiàn)流程

webkit-app-region

首個版本,我采用CSS很簡單便實(shí)現(xiàn)了

當(dāng)時是用 Mac 開發(fā)測試的,一切運(yùn)行良好

#container {
	-webkit-app-region: drag;
	padding: 10px;
	cursor: move;
}

隔天到 Win 上看效果

發(fā)現(xiàn)拖動雖然正常,但是光標(biāo)樣式?jīng)]有了

鼠標(biāo)放在邊框位置不會變成移動的光標(biāo)

經(jīng)查閱,設(shè)置了-webkit-app-region: drag;的元素,不會在響應(yīng)鼠標(biāo)事件了(mac上測試的時候正常的)

so,需要繼續(xù)改了

鼠標(biāo)事件

沒有簡便辦法了,就只好自己寫個鼠標(biāo)拖拽事件了

按下記錄下鼠標(biāo)相對于窗口的位置

鼠標(biāo)移動后計(jì)算出窗口新的位置

窗口新位置=窗口當(dāng)前位置+鼠標(biāo)新的相對位置-鼠標(biāo)原來的相對位置

主進(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')

webPreferencespreload

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)
}
//綁定拖拽移動事件
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
})

測試,Win和Mac拖拽正常,光標(biāo)正常

But,換電腦在測試時,發(fā)現(xiàn)某個Win的電腦移動窗口時,窗口尺寸會不停的變大

甚至只要鼠標(biāo)按在窗口上,尺寸都可能會改變

so,繼續(xù)改吧

縮放

經(jīng)過多次測試和查閱

最終把問題定位在Win的縮放與布局

該選項(xiàng)如果是100%測試一點(diǎn)問題都沒有

如果每次拖動尺寸會發(fā)生改變,那我們就不再使用setPosition改用setBounds

每次調(diào)整位置時直接將尺寸也傳遞進(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')

webPreferencespreload

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)
}
//綁定拖拽移動事件
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測試均正常

但如果拖動過快,仔細(xì)觀察,窗口有時會閃爍

而且文本框中的內(nèi)容有時會變成選中狀態(tài)

~ o(* ̄▽ ̄*)o 暫時就醬吧

有大神知道更好解決方案的話可以貼出來觀摩下

補(bǔ)充:

Electron無邊框自定義窗口拖動

解決方案

    <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 無邊框窗口拖拽移動問題記錄及解決辦法的文章就介紹到這了,更多相關(guān)electron 無邊框窗口拖拽移動內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Echarts圖表移動端橫屏進(jìn)入退出的實(shí)現(xiàn)

    Echarts圖表移動端橫屏進(jìn)入退出的實(shí)現(xiàn)

    本文主要介紹了Echarts圖表移動端橫屏進(jìn)入退出的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • 一文教你如何像導(dǎo)入JS模塊一樣導(dǎo)入CSS

    一文教你如何像導(dǎo)入JS模塊一樣導(dǎo)入CSS

    HTML中通過使用css可以讓網(wǎng)頁的美觀效果更進(jìn)一步,下面這篇文章主要給大家介紹了如何像導(dǎo)入JS模塊一樣導(dǎo)入CSS的相關(guān)資料,文中給出了詳細(xì)的實(shí)例代碼,需要的朋友可以參考下
    2021-09-09
  • js實(shí)現(xiàn)自定義路由

    js實(shí)現(xiàn)自定義路由

    本文介紹了js實(shí)現(xiàn)自定義路由,主要是事件hashchange的使用,然后根據(jù)我們的業(yè)務(wù)需求封裝。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • 原生js實(shí)現(xiàn)jquery函數(shù)animate()動畫效果的簡單實(shí)例

    原生js實(shí)現(xiàn)jquery函數(shù)animate()動畫效果的簡單實(shí)例

    下面小編就為大家?guī)硪黄鷍s實(shí)現(xiàn)jquery函數(shù)animate()動畫效果的簡單實(shí)例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-08-08
  • 最新評論

    蕲春县| 阜宁县| 沧州市| 怀柔区| 确山县| 乐亭县| 安达市| 临泉县| 金堂县| 神木县| 金沙县| 永登县| 聂荣县| 堆龙德庆县| 漾濞| 璧山县| 安顺市| 酒泉市| 左贡县| 河北区| 石嘴山市| 措美县| 北京市| 嘉禾县| 达拉特旗| 汕尾市| 晋中市| 涿鹿县| 肃北| 新绛县| 托里县| 三明市| 新津县| 隆化县| 策勒县| 栾川县| 马尔康县| 濮阳市| 丰原市| 浮山县| 云梦县|