使用 window.open 進行彈窗顯示,實現微信二維碼彈窗功能 在雙屏狀況下,chrome瀏覽器位於副屏彈窗時,會存在彈窗位置異常問題。目前網上相關解析及解決方案几乎沒有,故寫此文章以做分享。 html
const windowWidth = window.screen.width // 屏幕寬度
const windowHeight = window.screen.height // 屏幕高度
const pageWidth = 600 // 彈出窗口的寬度
const pageHeight = 550 // 彈出窗口的高度
let pageTop = (windowHeight - pageHeight) / 2 // 窗口的垂直位置
let pageLeft = (windowWidth - pageWidth) / 2 // 窗口的水平位置;
window.open('xxx', 'xxx', `width=${pageWidth},height=${pageHeight},top=${pageTop},left=${pageLeft}`) // 實現居中彈窗
複製代碼
緣由可能不少同窗都難以想到,這是由於彈窗的left和top參數,並非基於當前頁面做爲原點進行計算的,而是以主屏幕做爲原點進行計算前端
因此進行位置設置時,須要計算其基於主屏幕的偏移值。chrome
那怎麼知道當前是否處於主屏幕上呢?能夠經過window.screen.availLeft參數來解決,該參數返回瀏覽器可用空間左邊距離屏幕(系統桌面)左邊界的距離。編程
經過該參數,甚至不須要知道目前處於哪一個屏幕上,直接加上該參數便可基於當前屏幕進行定位。修改後的代碼以下segmentfault
const {
availLeft, // 返回瀏覽器可用空間左邊距離屏幕(系統桌面)左邊界的距離。
availHeight, // 瀏覽器在顯示屏上的可用高度,即當前屏幕高度
availWidth, // 瀏覽器在顯示屏上的可用寬度,即當前屏幕寬度
} = window.screen
const pageWidth = 600 // 彈出窗口的寬度
const pageHeight = 550 // 彈出窗口的高度
let pageTop = (availHeight - pageHeight) / 2 // 窗口的垂直位置
let pageLeft = (availWidth - pageWidth) / 2 // 窗口的水平位置;
left += availLeft // 加上屏幕偏移值
window.open('xxx', 'xxx', `width=${pageWidth},height=${pageHeight},top=${pageTop},left=${pageLeft}`) // 實現居中彈窗
複製代碼
「top」參數的設置一樣存在這個問題瀏覽器
若是主屏幕和副屏幕並非處於相同的高度,「top」值的設置一樣會因爲距系統主屏幕定位,而發生定位異常的顯示。看下面這張圖可能更好地理解 bash
另外目前筆者發現,這個兼容性問題,僅會在chrome內核的瀏覽器存在,safari上運行是不存在該問題的。綜上所述,得出最終的解決方案爲微信
const {
availTop, // 返回瀏覽器可用空間左邊距離屏幕(系統桌面)左邊界的距離。
availLeft, // 返回瀏覽器可用空間左邊距離屏幕(系統桌面)左邊界的距離。
availHeight, // 瀏覽器在顯示屏上的可用高度,即當前屏幕高度
availWidth, // 瀏覽器在顯示屏上的可用寬度,即當前屏幕寬度
} = window.screen
const pageWidth = 600 // 彈出窗口的寬度
const pageHeight = 550 // 彈出窗口的高度
let pageTop = (availHeight - pageHeight) / 2 // 窗口的垂直位置
let pageLeft = (availWidth - pageWidth) / 2 // 窗口的水平位置;
if (navigator.userAgent.indexOf('Chrome') !== -1) { // 兼容chrome的bug
top += availTop // 距頂偏移值
left += availLeft // 距左偏移值
}
window.open('xxx', 'xxx', `width=${pageWidth},height=${pageHeight},top=${pageTop},left=${pageLeft}`) // 實現居中彈窗
複製代碼
筆者遇到該問題是經過以下方式一一尋找解決方案網絡
最基礎,成本最低的一步,筆者進行過如下關鍵字的搜索(這裏主要突出關鍵字提取)dom
維基百科:MDN Web Docs(舊稱Mozilla Developer Network、Mozilla Developer Center,簡稱MDN)是一個聚集衆多Mozilla基金會產品和網絡技術開發文檔的免費網站。
尋找網上實現了該功能的網站,下載其頁面代碼進行分析。 網上的代碼都是加密過的,雖然不直觀,但能推測或猜出一些端倪
window.open = function () {
console.log(arguments)
}
複製代碼