欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Electron點擊穿透不規(guī)則窗體的透明區(qū)域的實現(xiàn)

 更新時間:2021年09月21日 09:14:27   作者:liulun  
本文主要介紹了Electron點擊穿透不規(guī)則窗體的透明區(qū)域的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

實現(xiàn)一個不規(guī)則窗體

這里我們實現(xiàn)一個圓形窗體,實現(xiàn)其他形狀的窗體與這個方法類似。

首先,把窗口的高度(height)和寬度(width)值修改為相同的值,使窗口成為一個正方形。

其次,把窗口的透明屬性(transparent)設置為true,這樣設置之后窗口還是正方形的,但只要我們控制好內(nèi)容區(qū)域的Dom元素的形狀,就可以讓窗口看起來像一個不規(guī)則形狀一樣。

不規(guī)則窗口往往需要自定義邊框和標題欄,所以frame也設置為false。

另外,透明的窗口不可調(diào)整大小。所以將resizable屬性設置為false。

窗口顯示后,為了防止雙擊窗口可拖拽區(qū)觸發(fā)最大化事件,我們把maximizable屬性也設置為false。

最終創(chuàng)建窗口的代碼如下:

win = new BrowserWindow({
        width: 380,
        height: 380,
        transparent: true,
        frame: false,
        resizable: false,
        maximizable: false,
        //...
})

接下來再修改樣式,使內(nèi)容區(qū)域的Dom元素呈現(xiàn)一個圓形:

html,body { 
  margin: 0px; 
  padding: 0px; 
  pointer-events: none;
}
#app {
 box-sizing: border-box;
 width: 380px; 
 height: 380px;
 border-radius: 190px;
 border: 1px solid green;
 background: #fff;
 overflow: hidden;
 pointer-events: auto;
}

上面樣式代碼中通過border-radius樣式把#app元素設置成了圓形。border-radius負責定義一個元素的圓角樣式,如果圓角足夠大,整個DIV就變成了一個圓形。

pointer-events樣式,在后面會有講解。

最終實現(xiàn)的窗口界面如圖5-7:

如果你略微了解CSS,你會知道除了圓形,你還可以通過CSS樣式控制這個窗口成為任意其他形狀。

點擊穿透透明區(qū)域

上面這個應用會有一點小問題,雖然窗口看起來是圓形的,但它其實還是一個正方形窗口,只不過正方形四個角是透明的,所以看起來像一個圓形的窗口。

當我點擊下圖中的①區(qū)域內(nèi)的文本文件時,鼠標的點擊事件還是發(fā)生在本窗口內(nèi),而不會點擊到那個文件上。

作為開發(fā)者,我們知曉其中的道理,但作為用戶來說,這就顯得很詭異。為了達到更好的用戶體驗,我們需要讓鼠標在這4個區(qū)域發(fā)生點擊動作時,點擊動作可以穿透本窗口,落在窗口后面的內(nèi)容上。

Electron官方文檔明確說“不能點擊穿透透明區(qū)域”,這并沒有難倒我們,有一個小trick來解決這個問題。

首先,需要用到窗口對象的setIgnoreMouseEvents方法,該方法可以使窗口忽略窗口內(nèi)的所有鼠標事件,并且在此窗口中發(fā)生的所有鼠標事件都將被傳遞到此窗口背后的內(nèi)容。

如果調(diào)用該方法時傳遞了forward參數(shù),如:

setIgnoreMouseEvents(true, { forward: true }),

則只有點擊事件會穿透窗口,鼠標移動事件仍會觸發(fā)。

基于此,我們在頁面中執(zhí)行如下代碼:

const remote = require("electron").remote;
  let win = remote.getCurrentWindow();
  window.addEventListener("mousemove", event => {
  let flag = event.target === document.documentElement;
  if (flag){
     win.setIgnoreMouseEvents(true, { forward: true });
  } 
  else {
    win.setIgnoreMouseEvents(false);
  }
  });
  win.setIgnoreMouseEvents(true, { forward: true });

注意,這是實驗代碼,所以用了remote模塊,關于remote模塊的一些問題,我在“Electron團隊為什么要干掉remote模塊“有詳細描述。

上面的代碼中,設置窗口對象監(jiān)聽mousemove事件,當鼠標移入窗口圓形內(nèi)容區(qū)的時候,不允許鼠標事件穿透。當鼠標移入透明區(qū)時,允許鼠標事件穿透。

接著我們?yōu)閔tml,body元素增加樣式:pointer-events: none,為#app元素增加樣式pointer-events: auto。

設定pointer-events: none后,其所標志的元素就永遠不會成為鼠標事件的target了。

為子元素#app設置了pointer-events: auto,說明子元素#app還是可以成為鼠標事件的target的。

也就是說除了圓形區(qū)域內(nèi)可以接收鼠標事件外,其他部分將不再接收鼠標事件。

當鼠標在圓形區(qū)域外移動時,窗口對象的mousemove事件觸發(fā),event.target為document.documentElement對象(這個事件并不是在html或body元素上觸發(fā)的,而是在窗口對象上觸發(fā)的,document.documentElement就是DOM樹中的根元素,也就是html節(jié)點所代表的元素)。

至此,上文代碼中的判斷成立,當鼠標在前文所述四個區(qū)域移動時,鼠標事件允許穿透。鼠標在圓形區(qū)域移動時,鼠標事件不允許穿透。

至此,上文所述判斷成立,運行程序,鼠標在正方形四角區(qū)域內(nèi)點擊,鼠標事件具備了穿透效果。

到此這篇關于Electron點擊穿透不規(guī)則窗體的透明區(qū)域的實現(xiàn)的文章就介紹到這了,更多相關Electron點擊穿透內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • JavaScript入門系列之知識點總結

    JavaScript入門系列之知識點總結

    JavaScript 是屬于網(wǎng)絡的腳本語言。本文是小編日常收集整理些javascript入門基礎知識,對js新手朋友非常有幫助,對js入門知識點感興趣的朋友一起學習吧
    2016-03-03
  • Actionscript與javascript交互實例程序(修改)

    Actionscript與javascript交互實例程序(修改)

    這篇文章主要介紹了Actionscript與javascript交互實例程序(修改)的相關資料,本文介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下
    2016-09-09
  • JS+CSS實現(xiàn)3D切割輪播圖

    JS+CSS實現(xiàn)3D切割輪播圖

    這篇文章主要為大家詳細介紹了JS+CSS實現(xiàn)3D切割輪播圖,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • JavaScript實現(xiàn)PC端四格密碼輸入框功能

    JavaScript實現(xiàn)PC端四格密碼輸入框功能

    這篇文章主要為大家詳細介紹了JavaScript實現(xiàn)PC端四格密碼輸入框功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • js獲取視頻時長代碼

    js獲取視頻時長代碼

    下面的這段js獲取視頻時長代碼是網(wǎng)上找的,還沒有測試,需要的朋友可以參考下
    2014-04-04
  • this[] 指的是什么內(nèi)容 討論

    this[] 指的是什么內(nèi)容 討論

    this[] 指的是什么內(nèi)容 討論...
    2007-03-03
  • 微信小程序的數(shù)據(jù)存儲與Django等服務發(fā)送請求?講解

    微信小程序的數(shù)據(jù)存儲與Django等服務發(fā)送請求?講解

    這篇文章主要為大家介紹了微信小程序的數(shù)據(jù)存儲與Django等服務發(fā)送請求講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-04-04
  • JS實現(xiàn)簡單的拖拽效果

    JS實現(xiàn)簡單的拖拽效果

    拖拽是前端實現(xiàn)中比較常用的一種效果, HTML5 提供了較為強大的拖拽 API 支持,今天我們來實現(xiàn)一個簡單的拖拽效果,需要的朋友可以參考下
    2023-09-09
  • JavaScript用JSONP跨域請求數(shù)據(jù)實例詳解

    JavaScript用JSONP跨域請求數(shù)據(jù)實例詳解

    Javascript跨域訪問是web開發(fā)者經(jīng)常遇到的問題,什么是跨域,就是一個域上加載的腳本獲取或操作另一個域上的文檔屬性。下面這篇文章主要介紹了JavaScript用JSONP跨域請求數(shù)據(jù)的方法,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-01-01
  • js replace 全局替換的操作方法

    js replace 全局替換的操作方法

    這篇文章主要介紹了js replace 全局替換的操作方法,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-06-06

最新評論