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

electron 無(wú)邊框窗口拖拽移動(dòng)問(wèn)題及解決辦法

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

electron 無(wú)邊框窗口拖拽移動(dòng)問(wèn)題記錄及解決辦法

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

image

窗口是沒(méi)有標(biāo)題欄的,所以需要找一個(gè)地方可以拖動(dòng)移動(dòng)位置

就開(kāi)始了接下來(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 開(kāi)發(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)便辦法了,就只好自己寫(xiě)個(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插件開(kāi)發(fā),和electron原始代碼的監(jiān)聽(tīng)不一樣)

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)
}

頁(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')

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);
}

頁(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)文章

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

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

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

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

    HTML中通過(guò)使用css可以讓網(wǎng)頁(yè)的美觀效果更進(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ù)需求封裝。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-02-02
  • 原生js實(shí)現(xiàn)jquery函數(shù)animate()動(dòng)畫(huà)效果的簡(jiǎn)單實(shí)例

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

    下面小編就為大家?guī)?lái)一篇原生js實(shí)現(xiàn)jquery函數(shù)animate()動(dòng)畫(huà)效果的簡(jiǎn)單實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-08-08
  • 最新評(píng)論

    成武县| 双柏县| 响水县| 虎林市| 德安县| 博兴县| 昌都县| 凌海市| 怀来县| 桦甸市| 张家口市| 保德县| 晋城| 万源市| 郧西县| 南皮县| 乐山市| 福贡县| 句容市| 图木舒克市| 临沂市| 廉江市| 桦甸市| 陆丰市| 庄河市| 稷山县| 凤阳县| 封开县| 大英县| 庆安县| 饶平县| 遂宁市| 桃源县| 天台县| 公安县| 和林格尔县| 福泉市| 富川| 马尔康县| 临泽县| 广州市|